From 0375e644c86007738253654ae94f6f697c657fe0 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 2 Jun 2016 15:47:51 +0200 Subject: [PATCH 001/255] Newfriend friendly Citadel according to shadeds suggestions (#180) * Newfriend friendly Citadel according to shadeds suggestions * Special handling of offhand material consumption --- config.yml | 2 + pom.xml | 2 +- .../mc/citadel/CitadelConfigManager.java | 4 + src/vg/civcraft/mc/citadel/Utility.java | 20 + .../mc/citadel/listener/BlockListener.java | 1004 +++++++++-------- .../mc/citadel/listener/EntityListener.java | 6 + 6 files changed, 593 insertions(+), 445 deletions(-) diff --git a/config.yml b/config.yml index 50023e5c..af95ff6c 100644 --- a/config.yml +++ b/config.yml @@ -103,3 +103,5 @@ mysql: password: "" # Shows reinforcement information as percentile value show_health_as_percent: false +# Whether players are automatically put in reinforcement bypass mode on login +default_bypass_mode: false diff --git a/pom.xml b/pom.xml index f03d91f1..53ad38ab 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.0 + 3.5.1 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 1855ab92..50d5f3af 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -160,4 +160,8 @@ public static boolean shouldLogReinforcement() { public static boolean showHealthAsPercent(){ return config.getBoolean("show_health_as_percent", false); } + + public static boolean defaultBypassOn() { + return config.getBoolean("default_bypass_mode"); + } } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 0245d05e..f25f4590 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -106,7 +106,16 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group 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) { @@ -156,6 +165,17 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group } } } + if (consumeOffhand) { + ItemStack is = inv.getItemInOffHand(); + int stackSize = is.getAmount(); + int deduction = Math.min(stackSize, requirements); + if (deduction < stackSize) { + is.setAmount(stackSize - deduction); + } else { + inv.setItemInOffHand(null); + } + requirements -= deduction; + } for (final int slot : slots) { if (requirements <= 0) { break; diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 973f5af3..87b5d203 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -58,23 +58,26 @@ import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -public class BlockListener implements Listener{ - - public static final List all_sides = Arrays.asList( - BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, - BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - +public class BlockListener implements Listener { + + public static final List all_sides = Arrays.asList(BlockFace.UP, + BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, + BlockFace.EAST); + public static final List planar_sides = Arrays.asList( - BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - + BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); + private ReinforcementManager rm = Citadel.getReinforcementManager(); - + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFortificationMode(BlockPlaceEvent event){ Player p = event.getPlayer(); Block b = event.getBlock(); + GroupManager gm = NameAPI.getGroupManager(); Location loc = b.getLocation(); Inventory inv = p.getInventory(); Reinforcement rein = rm.getReinforcement(b.getLocation()); @@ -102,15 +105,33 @@ public void onFortificationMode(BlockPlaceEvent event){ } } PlayerState state = PlayerState.get(p); - if (state.getMode() != ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - return; + ReinforcementType type = null; + Group groupToReinforceTo = null; + if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { + type = state.getReinforcementType(); + groupToReinforceTo = state.getGroup(); + }else if(state.getMode() == ReinforcementMode.NORMAL) { + type = ReinforcementType.getReinforcementType(p.getInventory().getItemInOffHand()); + if (type == null) { + return; + } + String gName = gm.getDefaultGroup(p.getUniqueId()); + if (gName != null) { + groupToReinforceTo = gm.getGroup(gName); + } + if (groupToReinforceTo == null) { + return; + } + } + else { + return; } + if (!canPlace(b, p)){ sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); event.setCancelled(true); return; } - ReinforcementType type = state.getReinforcementType(); // Don't allow double reinforcing reinforceable plants if (wouldPlantDoubleReinforce(b)) { sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); @@ -123,7 +144,7 @@ public void onFortificationMode(BlockPlaceEvent event){ } if (inv.containsAtLeast(type.getItemStack(), required)) { try { - if (createPlayerReinforcement(p, state.getGroup(), b, type, event.getItemInHand()) == null) { + if (createPlayerReinforcement(p, groupToReinforceTo, b, type, event.getItemInHand()) == null) { sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); } else { state.checkResetMode(); @@ -132,462 +153,557 @@ public void onFortificationMode(BlockPlaceEvent event){ Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); } } else { - sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", - state.getReinforcementType().getMaterial().name())); - state.reset(); - event.setCancelled(true); + if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { + sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", + state.getReinforcementType().getMaterial().name())); + state.reset(); + event.setCancelled(true); + } } } - + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - public void blockBreakEvent(BlockBreakEvent event){ + public void blockBreakEvent(BlockBreakEvent event) { Block block = event.getBlock(); - Player player = event.getPlayer(); + Player player = event.getPlayer(); Block reinforcingBlock = null; Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - - //if block is a plant check reinforcement on soil block - if(isPlant(block)){ - reinforcingBlock = Utility.findPlantSoil(block); - Reinforcement plant = null; - if (reinforcingBlock != null) - plant = rm.getReinforcement(reinforcingBlock); - if (plant != null) - rein = plant; + + // if block is a plant check reinforcement on soil block + if (isPlant(block)) { + reinforcingBlock = Utility.findPlantSoil(block); + Reinforcement plant = null; + if (reinforcingBlock != null) + plant = rm.getReinforcement(reinforcingBlock); + if (plant != null) + rein = plant; } - if (rein == null){ + if (rein == null) { rein = createNaturalReinforcement(event.getBlock(), player); - if (rein != null){ - ReinforcementDamageEvent e = new ReinforcementDamageEvent(rein, player, block); + if (rein != null) { + ReinforcementDamageEvent e = new ReinforcementDamageEvent(rein, + player, block); Bukkit.getPluginManager().callEvent(e); - if (e.isCancelled()){ + if (e.isCancelled()) { event.setCancelled(true); return; } - if(reinforcementDamaged(player, rein)) { - event.setCancelled(true); - } - } - return; + if (reinforcementDamaged(player, rein)) { + event.setCancelled(true); + } + } + return; } - + boolean is_cancelled = true; - if (rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement) rein; - PlayerState state = PlayerState.get(player); - boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); - if (reinforcingBlock != null && isPlant(block) && (pr.canAccessCrops(player) || admin_bypass)) { - //player has CROPS access to the soil block, allow them to break without affecting reinforcement - is_cancelled = false; - } else if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) && !pr.getGroup().isDisciplined()) { - if (admin_bypass) { - /* - Citadel.verbose( - VerboseMsg.AdminReinBypass, - player.getDisplayName(), pr.getBlock().getLocation().toString()); - */ - } else { - /* - Citadel.verbose( - VerboseMsg.ReinBypass, - player.getDisplayName(), pr.getBlock().getLocation().toString()); - */ - } - is_cancelled = reinforcementBroken(player, rein); - } else { - - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = true; - } - else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - if (!is_cancelled) { - // The player reinforcement broke. Now check for natural - is_cancelled = createNaturalReinforcement(block, player) != null; - } - } else { - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = reinforcementDamaged(player, rein); - return; - } - else { - is_cancelled = reinforcementDamaged(player, rein); - } - } + if (rein instanceof PlayerReinforcement) { + PlayerReinforcement pr = (PlayerReinforcement) rein; + PlayerState state = PlayerState.get(player); + boolean admin_bypass = player + .hasPermission("citadel.admin.bypassmode"); + if (reinforcingBlock != null && isPlant(block) + && (pr.canAccessCrops(player) || admin_bypass)) { + // player has CROPS access to the soil block, allow them to + // break without affecting reinforcement + is_cancelled = false; + } else if (state.isBypassMode() + && (pr.canBypass(player) || admin_bypass) + && !pr.getGroup().isDisciplined()) { + if (admin_bypass) { + /* + * Citadel.verbose( VerboseMsg.AdminReinBypass, + * player.getDisplayName(), + * pr.getBlock().getLocation().toString()); + */ + } else { + /* + * Citadel.verbose( VerboseMsg.ReinBypass, + * player.getDisplayName(), + * pr.getBlock().getLocation().toString()); + */ + } + is_cancelled = reinforcementBroken(player, rein); + } else { + if (!state.isBypassMode() && pr.canBypass(player)) { + player.sendMessage(ChatColor.RED + "Enable bypass mode with \"/ctb\" to break this reinforcement"); + } + ReinforcementDamageEvent dre = new ReinforcementDamageEvent( + rein, player, block); - if (is_cancelled) { - event.setCancelled(true); - block.getDrops().clear(); - } + Bukkit.getPluginManager().callEvent(dre); + + if (dre.isCancelled()) { + is_cancelled = true; + } else { + is_cancelled = reinforcementDamaged(player, rein); + } + } + if (!is_cancelled) { + // The player reinforcement broke. Now check for natural + is_cancelled = createNaturalReinforcement(block, player) != null; + } + } else { + ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, + player, block); + + Bukkit.getPluginManager().callEvent(dre); + + if (dre.isCancelled()) { + is_cancelled = reinforcementDamaged(player, rein); + return; + } else { + is_cancelled = reinforcementDamaged(player, rein); + } + } + + if (is_cancelled) { + event.setCancelled(true); + block.getDrops().clear(); + } } - + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonExtend(BlockPistonExtendEvent bpee) { - for (Block block : bpee.getBlocks()) - { - Reinforcement reinforcement = rm.getReinforcement(block.getLocation()); - if (reinforcement != null){ - bpee.setCancelled(true); - break; - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonRetract(BlockPistonRetractEvent bpre) { - for (Block block : bpre.getBlocks()) - { - Reinforcement reinforcement = rm.getReinforcement(block.getLocation()); - if (reinforcement != null){ - bpre.setCancelled(true); - break; - } - } - } - - private static final Material matfire = Material.FIRE; - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void blockBurn(BlockBurnEvent bbe) { - boolean wasprotected = maybeReinforcementDamaged(bbe.getBlock()); - if (wasprotected) { - bbe.setCancelled(wasprotected); - Block block = bbe.getBlock(); - // Basic essential fire protection - if (block.getRelative(0,1,0).getType() == matfire) {block.getRelative(0,1,0).setTypeId(0);} // Essential - // Extended fire protection (recommend) - if (block.getRelative(1,0,0).getType() == matfire) {block.getRelative(1,0,0).setTypeId(0);} - if (block.getRelative(-1,0,0).getType() == matfire) {block.getRelative(-1,0,0).setTypeId(0);} - if (block.getRelative(0,-1,0).getType() == matfire) {block.getRelative(0,-1,0).setTypeId(0);} - if (block.getRelative(0,0,1).getType() == matfire) {block.getRelative(0,0,1).setTypeId(0);} - if (block.getRelative(0,0,-1).getType() == matfire) {block.getRelative(0,0,-1).setTypeId(0);} - // Aggressive fire protection (would seriously reduce effectiveness of flint down to near the "you'd have to use it 25 times" mentality) - /* - if (block.getRelative(1,1,0).getType() == matfire) {block.getRelative(1,1,0).setTypeId(0);} - if (block.getRelative(1,-1,0).getType() == matfire) {block.getRelative(1,-1,0).setTypeId(0);} - if (block.getRelative(-1,1,0).getType() == matfire) {block.getRelative(-1,1,0).setTypeId(0);} - if (block.getRelative(-1,-1,0).getType() == matfire) {block.getRelative(-1,-1,0).setTypeId(0);} - if (block.getRelative(0,1,1).getType() == matfire) {block.getRelative(0,1,1).setTypeId(0);} - if (block.getRelative(0,-1,1).getType() == matfire) {block.getRelative(0,-1,1).setTypeId(0);} - if (block.getRelative(0,1,-1).getType() == matfire) {block.getRelative(0,1,-1).setTypeId(0);} - if (block.getRelative(0,-1,-1).getType() == matfire) {block.getRelative(0,-1,-1).setTypeId(0);} - */ - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) - public void onBlockFromToEvent(BlockFromToEvent event) { - Block reinforcementBlock = event.getToBlock(); - if(isPlant(reinforcementBlock)){ - //block to is as plant check block under it for reinforcement - reinforcementBlock = Utility.findPlantSoil(reinforcementBlock); - } - Reinforcement rein = rm.getReinforcement(reinforcementBlock); - if (rein != null) { - event.setCancelled(true); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void redstonePower(BlockRedstoneEvent bre) { - // This currently only protects against reinforced openable objects, - // like doors, from being opened by unauthorizied players. - try { - // NewCurrent <= 0 means the redstone wire is turning off, so the - // container is closing. Closing is good so just return. This also - // shaves off some time when dealing with sand generators. - // OldCurrent > 0 means that the wire was already on, thus the - // container was already open by an authorized player. Now it's - // either staying open or closing. Just return. - if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { - return; - } - Block block = bre.getBlock(); - MaterialData blockData = block.getState().getData(); - if (!(blockData instanceof Openable)) { - return; - } - Openable openable = (Openable)blockData; - if (openable.isOpen()) { - return; - } - Reinforcement generic_reinforcement = - Citadel.getReinforcementManager().getReinforcement(block); - if (generic_reinforcement == null || - !(generic_reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement reinforcement = - (PlayerReinforcement)generic_reinforcement; - double redstoneDistance = CitadelConfigManager.getMaxRedstoneDistance(); - if (!isAuthorizedPlayerNear(reinforcement, redstoneDistance)) { - // Citadel.Log( - // reinforcement.getLocation().toString()); - bre.setNewCurrent(bre.getOldCurrent()); - } - } catch(Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Exception occured in BlockListener, BlockRedstoneEvent ", e); - } - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void interact(PlayerInteractEvent pie) { - try { - if (!pie.hasBlock()) return; - - Player player = pie.getPlayer(); - Block block = Utility.getRealBlock(pie.getClickedBlock()); - Reinforcement generic_reinforcement = rm.getReinforcement(block); - PlayerReinforcement reinforcement = null; - if (generic_reinforcement instanceof PlayerReinforcement) { - reinforcement = (PlayerReinforcement)generic_reinforcement; - } - - Action action = pie.getAction(); - boolean access_reinforcement = - action == Action.RIGHT_CLICK_BLOCK - && reinforcement != null - && reinforcement.isSecurable(); - boolean normal_access_denied = - reinforcement != null - && ((reinforcement.isDoor() && !reinforcement.canAccessDoors(player)) || - (reinforcement.isContainer() &&!reinforcement.canAccessChests(player))); - boolean admin_can_access = player.hasPermission("citadel.admin"); - if (access_reinforcement && normal_access_denied && !admin_can_access) { - /*Citadel.verbose( - VerboseMsg.ReinLocked, - player.getDisplayName(), block.getLocation().toString()); - */ - pie.getPlayer().sendMessage(ChatColor.RED + String.format("%s is locked", block.getType().name())); - pie.setCancelled(true); - } - // Not really sure what this is for. Should come up in testing. - /*else if (action == Action.PHYSICAL) { - AccessDelegate aboveDelegate = AccessDelegate.getDelegate(block.getRelative(BlockFace.UP)); - if (aboveDelegate instanceof CropAccessDelegate - && aboveDelegate.isReinforced()) { - Citadel.verbose( - VerboseMsg.CropTrample, - block.getLocation().toString()); - pie.setCancelled(true); - } - } - */ - if (pie.isCancelled()) return; - - PlayerState state = PlayerState.get(player); - ReinforcementMode placementMode = state.getMode(); - switch (placementMode) { - case NORMAL: - if (access_reinforcement && normal_access_denied && admin_can_access) { - /* - Citadel.verbose( - VerboseMsg.AdminReinLocked, - player.getDisplayName(), block.getLocation().toString()); - */ - } - return; - case REINFORCEMENT_FORTIFICATION: - return; - case REINFORCEMENT_INFORMATION: - // did player click on a reinforced block? - if (reinforcement != null) { - String reinforcementStatus = reinforcement.getStatus(); - String ageStatus = reinforcement.getAgeStatus(); - Group group = reinforcement.getGroup(); - StringBuilder sb; - if (player.hasPermission("citadel.admin.ctinfodetails")) { - sendAndLog(player, ChatColor.GREEN, String.format( - "Loc[%s]", reinforcement.getLocation().toString())); - String groupName = "!NULL!"; - if (group != null) { - groupName = String.format("[%s]", group.getName()); - } - sb = new StringBuilder(); - sb.append(String.format(" Group%s Durability[%d/%d]", - groupName, - reinforcement.getDurability(), - ReinforcementType.getReinforcementType - (reinforcement.getStackRepresentation()).getHitPoints())); - int maturationTime = timeUntilMature(reinforcement); - if (maturationTime != 0) { - sb.append(" Immature["); - sb.append(maturationTime); - sb.append("]"); - } - int acidTime = timeUntilAcidMature(reinforcement); - if (CitadelConfigManager.getAcidBlock() == block.getType()) { - sb.append(" Acid "); - if (acidTime != 0) { - sb.append("Immature["); - sb.append(acidTime); - sb.append("]"); - } else { - sb.append("Mature"); + public void pistonExtend(BlockPistonExtendEvent bpee) { + for (Block block : bpee.getBlocks()) { + Reinforcement reinforcement = rm.getReinforcement(block + .getLocation()); + if (reinforcement != null) { + bpee.setCancelled(true); + break; + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void pistonRetract(BlockPistonRetractEvent bpre) { + for (Block block : bpre.getBlocks()) { + Reinforcement reinforcement = rm.getReinforcement(block + .getLocation()); + if (reinforcement != null) { + bpre.setCancelled(true); + break; + } + } + } + + private static final Material matfire = Material.FIRE; + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void blockBurn(BlockBurnEvent bbe) { + boolean wasprotected = maybeReinforcementDamaged(bbe.getBlock()); + if (wasprotected) { + bbe.setCancelled(wasprotected); + Block block = bbe.getBlock(); + // Basic essential fire protection + if (block.getRelative(0, 1, 0).getType() == matfire) { + block.getRelative(0, 1, 0).setTypeId(0); + } // Essential + // Extended fire protection (recommend) + if (block.getRelative(1, 0, 0).getType() == matfire) { + block.getRelative(1, 0, 0).setTypeId(0); + } + if (block.getRelative(-1, 0, 0).getType() == matfire) { + block.getRelative(-1, 0, 0).setTypeId(0); + } + if (block.getRelative(0, -1, 0).getType() == matfire) { + block.getRelative(0, -1, 0).setTypeId(0); + } + if (block.getRelative(0, 0, 1).getType() == matfire) { + block.getRelative(0, 0, 1).setTypeId(0); + } + if (block.getRelative(0, 0, -1).getType() == matfire) { + block.getRelative(0, 0, -1).setTypeId(0); + } + // Aggressive fire protection (would seriously reduce effectiveness + // of flint down to near the "you'd have to use it 25 times" + // mentality) + /* + * if (block.getRelative(1,1,0).getType() == matfire) + * {block.getRelative(1,1,0).setTypeId(0);} if + * (block.getRelative(1,-1,0).getType() == matfire) + * {block.getRelative(1,-1,0).setTypeId(0);} if + * (block.getRelative(-1,1,0).getType() == matfire) + * {block.getRelative(-1,1,0).setTypeId(0);} if + * (block.getRelative(-1,-1,0).getType() == matfire) + * {block.getRelative(-1,-1,0).setTypeId(0);} if + * (block.getRelative(0,1,1).getType() == matfire) + * {block.getRelative(0,1,1).setTypeId(0);} if + * (block.getRelative(0,-1,1).getType() == matfire) + * {block.getRelative(0,-1,1).setTypeId(0);} if + * (block.getRelative(0,1,-1).getType() == matfire) + * {block.getRelative(0,1,-1).setTypeId(0);} if + * (block.getRelative(0,-1,-1).getType() == matfire) + * {block.getRelative(0,-1,-1).setTypeId(0);} + */ + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onBlockFromToEvent(BlockFromToEvent event) { + Block reinforcementBlock = event.getToBlock(); + if (isPlant(reinforcementBlock)) { + // block to is as plant check block under it for reinforcement + reinforcementBlock = Utility.findPlantSoil(reinforcementBlock); + } + Reinforcement rein = rm.getReinforcement(reinforcementBlock); + if (rein != null) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void redstonePower(BlockRedstoneEvent bre) { + // This currently only protects against reinforced openable objects, + // like doors, from being opened by unauthorizied players. + try { + // NewCurrent <= 0 means the redstone wire is turning off, so the + // container is closing. Closing is good so just return. This also + // shaves off some time when dealing with sand generators. + // OldCurrent > 0 means that the wire was already on, thus the + // container was already open by an authorized player. Now it's + // either staying open or closing. Just return. + if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { + return; + } + Block block = bre.getBlock(); + MaterialData blockData = block.getState().getData(); + if (!(blockData instanceof Openable)) { + return; + } + Openable openable = (Openable) blockData; + if (openable.isOpen()) { + return; + } + Reinforcement generic_reinforcement = Citadel + .getReinforcementManager().getReinforcement(block); + if (generic_reinforcement == null + || !(generic_reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement reinforcement = (PlayerReinforcement) generic_reinforcement; + double redstoneDistance = CitadelConfigManager + .getMaxRedstoneDistance(); + if (!isAuthorizedPlayerNear(reinforcement, redstoneDistance)) { + // Citadel.Log( + // reinforcement.getLocation().toString()); + bre.setNewCurrent(bre.getOldCurrent()); + } + } catch (Exception e) { + Citadel.getInstance() + .getLogger() + .log(Level.WARNING, + "Exception occured in BlockListener, BlockRedstoneEvent ", + e); + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void interact(PlayerInteractEvent pie) { + try { + if (!pie.hasBlock()) + return; + + Player player = pie.getPlayer(); + Block block = Utility.getRealBlock(pie.getClickedBlock()); + Reinforcement generic_reinforcement = rm.getReinforcement(block); + PlayerReinforcement reinforcement = null; + if (generic_reinforcement instanceof PlayerReinforcement) { + reinforcement = (PlayerReinforcement) generic_reinforcement; + } + + Action action = pie.getAction(); + boolean access_reinforcement = action == Action.RIGHT_CLICK_BLOCK + && reinforcement != null && reinforcement.isSecurable(); + boolean normal_access_denied = reinforcement != null + && ((reinforcement.isDoor() && !reinforcement + .canAccessDoors(player)) || (reinforcement + .isContainer() && !reinforcement + .canAccessChests(player))); + boolean admin_can_access = player.hasPermission("citadel.admin"); + if (access_reinforcement && normal_access_denied + && !admin_can_access) { + /* + * Citadel.verbose( VerboseMsg.ReinLocked, + * player.getDisplayName(), block.getLocation().toString()); + */ + pie.getPlayer().sendMessage( + ChatColor.RED + + String.format("%s is locked", block.getType() + .name())); + pie.setCancelled(true); + } + // Not really sure what this is for. Should come up in testing. + /* + * else if (action == Action.PHYSICAL) { AccessDelegate + * aboveDelegate = + * AccessDelegate.getDelegate(block.getRelative(BlockFace.UP)); if + * (aboveDelegate instanceof CropAccessDelegate && + * aboveDelegate.isReinforced()) { Citadel.verbose( + * VerboseMsg.CropTrample, block.getLocation().toString()); + * pie.setCancelled(true); } } + */ + if (pie.isCancelled()) + return; + + PlayerState state = PlayerState.get(player); + ReinforcementMode placementMode = state.getMode(); + GroupManager gm = NameAPI.getGroupManager(); + switch (placementMode) { + case NORMAL: + if (pie.getAction() == Action.LEFT_CLICK_BLOCK && generic_reinforcement == null) { + ItemStack stack = player.getInventory().getItemInMainHand(); + ReinforcementType type = ReinforcementType + .getReinforcementType(stack); + if (type != null) { + // Don't allow double reinforcing reinforceable plants + if (wouldPlantDoubleReinforce(block)) { + sendAndLog(player, ChatColor.RED, + "Cancelled reinforcement, crop would already be reinforced."); + } else { + String gName = gm.getDefaultGroup(player.getUniqueId()); + Group g = null; + if (gName != null) { + g = gm.getGroup(gName); + } + if (g != null) { + try { + createPlayerReinforcement(player, g, + block, type, null); + } catch (ReinforcemnetFortificationCancelException e) { + Citadel.getInstance() + .getLogger() + .log(Level.WARNING, + "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", + e); } } - if (reinforcement.isInsecure()) { - sb.append(" (Insecure)"); - } - if (group.isDisciplined()) { - sb.append(" (Disciplined)"); - } - sb.append("\nGroup id: " + reinforcement.getGroupId()); - - sendAndLog(player, ChatColor.GREEN, sb.toString()); - } else if(reinforcement.canViewInformation(player)){ - sb = new StringBuilder(); - boolean immature = timeUntilMature(reinforcement) != 0 - && CitadelConfigManager.isMaturationEnabled(); - boolean acid = timeUntilAcidMature(reinforcement) != 0 - && CitadelConfigManager.getAcidBlock() == block.getType(); - String groupName = "!NULL!"; - if (group != null) { - groupName = group.getName(); - } - sb.append(String.format("%s, %s, group: %s", - reinforcementStatus, ageStatus, groupName)); - if(immature){ - sb.append(" (Hardening)"); - } - if(acid){ - sb.append(" (Acid Maturing)"); + } + } + } + return; + case REINFORCEMENT_FORTIFICATION: + return; + case REINFORCEMENT_INFORMATION: + // did player click on a reinforced block? + if (reinforcement != null) { + String reinforcementStatus = reinforcement.getStatus(); + String ageStatus = reinforcement.getAgeStatus(); + Group group = reinforcement.getGroup(); + StringBuilder sb; + if (player.hasPermission("citadel.admin.ctinfodetails")) { + sendAndLog(player, ChatColor.GREEN, String.format( + "Loc[%s]", reinforcement.getLocation() + .toString())); + String groupName = "!NULL!"; + if (group != null) { + groupName = String.format("[%s]", group.getName()); + } + sb = new StringBuilder(); + sb.append(String.format( + " Group%s Durability[%d/%d]", + groupName, + reinforcement.getDurability(), + ReinforcementType.getReinforcementType( + reinforcement.getStackRepresentation()) + .getHitPoints())); + int maturationTime = timeUntilMature(reinforcement); + if (maturationTime != 0) { + sb.append(" Immature["); + sb.append(maturationTime); + sb.append("]"); + } + int acidTime = timeUntilAcidMature(reinforcement); + if (CitadelConfigManager.getAcidBlock() == block + .getType()) { + sb.append(" Acid "); + if (acidTime != 0) { + sb.append("Immature["); + sb.append(acidTime); + sb.append("]"); + } else { + sb.append("Mature"); } - if (reinforcement.isInsecure()) { - sb.append(" (Insecure)"); - } - sendAndLog(player, ChatColor.GREEN, sb.toString()); - } else { - sendAndLog(player, ChatColor.RED, reinforcementStatus + ", " + ageStatus); - } - if (player.getGameMode() == GameMode.CREATIVE) { - pie.setCancelled(true); - } - } - break; - - case INSECURE: - // did player click on a reinforced block? - pie.setCancelled(true); - if (reinforcement != null) { - if (reinforcement.canMakeInsecure(player)) { - reinforcement.toggleInsecure(); - // Save the change - Citadel.getReinforcementManager().saveReinforcement(reinforcement); - if (reinforcement.isInsecure()) { - sendAndLog(player, ChatColor.YELLOW, "Reinforcement now insecure"); - } else { - sendAndLog(player, ChatColor.GREEN, "Reinforcement secured"); - } - } else { - sendAndLog(player, ChatColor.RED, "Access denied"); - } - } - break; - - case REINFORCEMENT: - // player is in reinforcement mode - if (reinforcement == null) { - // set the reinforcemet material to what the player is holding - ItemStack stack = player.getItemInHand(); - ReinforcementType type = ReinforcementType.getReinforcementType(stack); - if (type == null){ - sendAndLog(player, ChatColor.RED, stack.getType().name() + " is not a reinforcable material."); - sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); - state.reset(); - return; - } - state.setFortificationItemStack(type.getItemStack()); - // Break any natural reinforcement before placing the player reinforcement - if (generic_reinforcement != null) { - reinforcementBroken(null, generic_reinforcement); - } - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(block)) { - sendAndLog(player, ChatColor.RED, "Cancelled reinforcement, crop would already be reinforced."); - } else { - try { - createPlayerReinforcement(player, state.getGroup(), - block, state.getReinforcementType(), null); - } catch(ReinforcemnetFortificationCancelException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ",e); - } - } - } else if (reinforcement.canBypass(player) || (player.isOp() || player.hasPermission("citadel.admin"))) { - String message = ""; - Group group = state.getGroup(); - Group old_group = reinforcement.getGroup(); - if(!old_group.getName().equals(group.getName())) { - reinforcement.setGroup(group); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); - Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - rm.saveReinforcement(reinforcement); - message = "Group has been changed to: " + group.getName() + "."; - sendAndLog(player, ChatColor.GREEN, message); - } - else - reinforcement.setGroup(old_group); - } - } else { - sendAndLog(player, ChatColor.RED, "You are not permitted to modify this reinforcement"); - } - pie.setCancelled(true); - state.checkResetMode(); - default: - break; - } - - } catch(Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "General Exception during player interaction", e); - } - } - -// TODO: Come back and figure out why this is causing all the data to be re-written inplace with no change -/* @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void chunkLoadEvent(ChunkLoadEvent event) { - Chunk chunk = event.getChunk(); - rm.loadReinforcementChunk(chunk); - }*/ - - @EventHandler(priority = EventPriority.HIGHEST) - public void blockPhysEvent(BlockPhysicsEvent event){ - Block block = event.getBlock(); - if (block.getType().hasGravity()){ - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - if (rein != null){ - event.setCancelled(true); - } - } - - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void liquidDumpEvent(PlayerBucketEmptyEvent event){ - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().equals(Material.AIR) || block.getType().isSolid()) - return; - - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - if (rein != null){ - event.setCancelled(true); - } - } + } + if (reinforcement.isInsecure()) { + sb.append(" (Insecure)"); + } + if (group.isDisciplined()) { + sb.append(" (Disciplined)"); + } + sb.append("\nGroup id: " + reinforcement.getGroupId()); + + sendAndLog(player, ChatColor.GREEN, sb.toString()); + } else if (reinforcement.canViewInformation(player)) { + sb = new StringBuilder(); + boolean immature = timeUntilMature(reinforcement) != 0 + && CitadelConfigManager.isMaturationEnabled(); + boolean acid = timeUntilAcidMature(reinforcement) != 0 + && CitadelConfigManager.getAcidBlock() == block + .getType(); + String groupName = "!NULL!"; + if (group != null) { + groupName = group.getName(); + } + sb.append(String.format("%s, %s, group: %s", + reinforcementStatus, ageStatus, groupName)); + if (immature) { + sb.append(" (Hardening)"); + } + if (acid) { + sb.append(" (Acid Maturing)"); + } + if (reinforcement.isInsecure()) { + sb.append(" (Insecure)"); + } + sendAndLog(player, ChatColor.GREEN, sb.toString()); + } else { + sendAndLog(player, ChatColor.RED, reinforcementStatus + + ", " + ageStatus); + } + if (player.getGameMode() == GameMode.CREATIVE) { + pie.setCancelled(true); + } + } + break; + + case INSECURE: + // did player click on a reinforced block? + pie.setCancelled(true); + if (reinforcement != null) { + if (reinforcement.canMakeInsecure(player)) { + reinforcement.toggleInsecure(); + // Save the change + Citadel.getReinforcementManager().saveReinforcement( + reinforcement); + if (reinforcement.isInsecure()) { + sendAndLog(player, ChatColor.YELLOW, + "Reinforcement now insecure"); + } else { + sendAndLog(player, ChatColor.GREEN, + "Reinforcement secured"); + } + } else { + sendAndLog(player, ChatColor.RED, "Access denied"); + } + } + break; + + case REINFORCEMENT: + // player is in reinforcement mode + if (reinforcement == null) { + // set the reinforcemet material to what the player is + // holding + ItemStack stack = player.getItemInHand(); + ReinforcementType type = ReinforcementType + .getReinforcementType(stack); + if (type == null) { + sendAndLog(player, ChatColor.RED, stack.getType() + .name() + " is not a reinforcable material."); + sendAndLog(player, ChatColor.RED, + "Left Reinforcement mode."); + state.reset(); + return; + } + state.setFortificationItemStack(type.getItemStack()); + // Break any natural reinforcement before placing the player + // reinforcement + if (generic_reinforcement != null) { + reinforcementBroken(null, generic_reinforcement); + } + // Don't allow double reinforcing reinforceable plants + if (wouldPlantDoubleReinforce(block)) { + sendAndLog(player, ChatColor.RED, + "Cancelled reinforcement, crop would already be reinforced."); + } else { + try { + createPlayerReinforcement(player, state.getGroup(), + block, state.getReinforcementType(), null); + } catch (ReinforcemnetFortificationCancelException e) { + Citadel.getInstance() + .getLogger() + .log(Level.WARNING, + "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", + e); + } + } + } else if (reinforcement.canBypass(player) + || (player.isOp() || player + .hasPermission("citadel.admin"))) { + String message = ""; + Group group = state.getGroup(); + Group old_group = reinforcement.getGroup(); + if (!old_group.getName().equals(group.getName())) { + reinforcement.setGroup(group); + ReinforcementCreationEvent event = new ReinforcementCreationEvent( + reinforcement, block, player); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + rm.saveReinforcement(reinforcement); + message = "Group has been changed to: " + + group.getName() + "."; + sendAndLog(player, ChatColor.GREEN, message); + } else + reinforcement.setGroup(old_group); + } + } else { + sendAndLog(player, ChatColor.RED, + "You are not permitted to modify this reinforcement"); + } + pie.setCancelled(true); + state.checkResetMode(); + default: + break; + } + + } catch (Exception e) { + Citadel.getInstance() + .getLogger() + .log(Level.WARNING, + "General Exception during player interaction", e); + } + } + + // TODO: Come back and figure out why this is causing all the data to be + // re-written inplace with no change + /* + * @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + * public void chunkLoadEvent(ChunkLoadEvent event) { Chunk chunk = + * event.getChunk(); rm.loadReinforcementChunk(chunk); } + */ + + @EventHandler(priority = EventPriority.HIGHEST) + public void blockPhysEvent(BlockPhysicsEvent event) { + Block block = event.getBlock(); + if (block.getType().hasGravity()) { + Reinforcement rein = rm.getReinforcement(Utility + .getRealBlock(block)); + if (rein != null) { + event.setCancelled(true); + } + } + + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void liquidDumpEvent(PlayerBucketEmptyEvent event) { + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().equals(Material.AIR) || block.getType().isSolid()) + return; + + Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); + if (rein != null) { + event.setCancelled(true); + } + } protected void sendAndLog(Player receiver, ChatColor color, String message) { receiver.sendMessage(color + message); if (CitadelConfigManager.shouldLogPlayerCommands()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); + Citadel.getInstance() + .getLogger() + .log(Level.INFO, "Sent {0} reply {1}", + new Object[] { receiver.getName(), message }); } } } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 3859c656..4b1bd586 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -367,6 +367,12 @@ public void playerJoinEvent(PlayerJoinEvent event){ db.updateTimestamp(groupName); } } + if (CitadelConfigManager.defaultBypassOn()) { + PlayerState state = PlayerState.get(p); + if (!state.isBypassMode()) { + state.toggleBypassMode(); + } + } } protected void sendAndLog(Player receiver, ChatColor color, String message) { From 22d605b6db5c748cf58724bc5ee23322674d0b6c Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 11 Jun 2016 16:09:03 +0200 Subject: [PATCH 002/255] 1.10 (#181) * Newfriend friendly Citadel according to shadeds suggestions * Special handling of offhand material consumption * Update to 1.10 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 53ad38ab..f02096e3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.1 + 3.5.2 Citadel https://github.com/Civcraft/Citadel @@ -41,7 +41,7 @@ org.spigotmc spigot-api - 1.9.2-R0.1-SNAPSHOT + 1.10-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore From c17821262a2b14d555a115765c409000b29d81e4 Mon Sep 17 00:00:00 2001 From: ShadedJon Date: Fri, 11 Dec 2015 11:42:36 -0800 Subject: [PATCH 003/255] Update README.md Actual links --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79a50aa0..9c790e29 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Citadel -Jenkins Build Server can be found: http://build.civcraft.co/job/Citadel-master/ +Original Citadel Jenkins Build Server can be found here: http://build.civcraft.co/job/Citadel-master/ -Java Docs: http://build.civcraft.co/job/Citadel-master/javadoc/ +Basic new player tutorial: https://www.reddit.com/r/Devoted/wiki/plugins/citadel + +If you need help installing Citadel, follow this guide: https://github.com/ProgrammerDan/civcraft-vm From f03774b3b5ebe6fead182b0ffcf9138a7ea34618 Mon Sep 17 00:00:00 2001 From: ShadedJon Date: Fri, 11 Dec 2015 11:48:31 -0800 Subject: [PATCH 004/255] Added documentation Testing this one, we'll see if there is a max text message length server can send. Update Fortification.java removed some vodoo This might break it. Adding maturation to ctm Pray for me Dan Update Reinforce.java Update Fortification.java Added a couple alias for people searching for protection. Working on better help messages next. --- plugin.yml | 8 ++++---- .../civcraft/mc/citadel/command/commands/Bypass.java | 2 +- .../mc/citadel/command/commands/Fortification.java | 11 +++++------ .../mc/citadel/command/commands/Information.java | 3 +-- .../mc/citadel/command/commands/Reinforce.java | 5 ++--- 5 files changed, 13 insertions(+), 16 deletions(-) diff --git a/plugin.yml b/plugin.yml index 243fb595..d02a575f 100644 --- a/plugin.yml +++ b/plugin.yml @@ -7,14 +7,14 @@ softdepend: [Mercury, BetterShards] description: Citadel allows you to make blocks difficult to break. When a block is reinforced, it must be broken many times before it is destroyed. commands: ctr: - aliases: [ctreinforce] + aliases: [ctreinforce, reinforce, protect, cprivate, lwc, private] ctacid: ctf: - aliases: [ctfortify] + aliases: [ctfortify, fortify] ctb: - aliases: [ctbypass] + aliases: [ctbypass, bypass] cti: - aliases: [ctinformation] + aliases: [ctinformation, info] ctin: aliases: [ctinsecure] ctm: diff --git a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java index 77829fc5..e5a484d6 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java @@ -31,7 +31,7 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; PlayerState state = PlayerState.get(p); if (state.toggleBypassMode()){ - sendAndLog(p, ChatColor.GREEN, "Bypass mode has been enabled."); + sendAndLog(p, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } else { sendAndLog(p, ChatColor.GREEN, "Bypass mode has been disabled."); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index 60127d1d..46496523 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -28,7 +28,7 @@ public class Fortification extends PlayerCommandMiddle{ public Fortification(String name) { super(name); setIdentifier("ctf"); - setDescription("Allows you to place already reinforced blocks."); + setDescription("Allows you to place already reinforced blocks. Use /ctf groupname with a reinforcement material in your hand, then place down blocks and they will automatically be reinforced to groupname."); setUsage("/ctf "); setArguments(0,1); } @@ -45,7 +45,7 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); + sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /ctf groupname. \n Or use /nlcg groupname if you don't have a group yet."); return true; } } @@ -77,15 +77,14 @@ public boolean execute(CommandSender sender, String[] args) { } else{ if (stack.getType() == Material.AIR){ - sendAndLog(p, ChatColor.RED, "You need to be holding an ItemStack."); + sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); return true; } else if (reinType == null){ - sendAndLog(p, ChatColor.RED, "That is not a ReinforcementType."); + sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); return true; } - sendAndLog(p, ChatColor.GREEN, "Your mode has been set to " + - ReinforcementMode.REINFORCEMENT_FORTIFICATION.name() + "."); + sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /ctf or /cto to turn this off when you are done."); state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); state.setFortificationItemStack(reinType.getItemStack()); state.setGroup(g); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Information.java b/src/vg/civcraft/mc/citadel/command/commands/Information.java index 71dfb689..04168fc6 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Information.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Information.java @@ -33,8 +33,7 @@ public boolean execute(CommandSender sender, String[] args) { state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "Reinforcement mode changed to " - + ReinforcementMode.REINFORCEMENT_INFORMATION.name() + "."); + sendAndLog(p, ChatColor.GREEN, "You are now in Information mode, click on blocks to see their reinforcement information! \n Type /cti or /cto to turn this off."); state.setMode(ReinforcementMode.REINFORCEMENT_INFORMATION); } return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 92e04c8e..95808753 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -39,7 +39,7 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); + sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /ctr groupname. \n Or /nlcg groupname if you don't have a group yet."); return true; } } @@ -67,8 +67,7 @@ public boolean execute(CommandSender sender, String[] args) { state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "Your mode has been set to " + - ReinforcementMode.REINFORCEMENT.name() + "."); + sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /ctr or /cto to turn this off when you are done."); state.setMode(ReinforcementMode.REINFORCEMENT); state.setGroup(g); } From 6d5000ff3a6ef4202912ada716497764efd98595 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sun, 12 Jun 2016 00:33:14 -0400 Subject: [PATCH 005/255] Updating a few other messages for consistency --- plugin.yml | 6 +++--- .../civcraft/mc/citadel/command/commands/Fortification.java | 6 +++--- src/vg/civcraft/mc/citadel/command/commands/Reinforce.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugin.yml b/plugin.yml index d02a575f..f29dd6cf 100644 --- a/plugin.yml +++ b/plugin.yml @@ -14,13 +14,13 @@ commands: ctb: aliases: [ctbypass, bypass] cti: - aliases: [ctinformation, info] + aliases: [ctinformation, info, ctinfo] ctin: aliases: [ctinsecure] ctm: - aliases: [ctmaterials] + aliases: [ctmaterials, materials] cto: - aliases: [ctoff] + aliases: [ctoff, off] cts: aliases: [ctstats] permission: citadel.admin diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index 46496523..bd206fd1 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -28,7 +28,7 @@ public class Fortification extends PlayerCommandMiddle{ public Fortification(String name) { super(name); setIdentifier("ctf"); - setDescription("Allows you to place already reinforced blocks. Use /ctf groupname with a reinforcement material in your hand, then place down blocks and they will automatically be reinforced to groupname."); + setDescription("Allows you to place already reinforced blocks. Use /fortify groupname with a reinforcement material in your hand, then place down blocks and they will automatically be reinforced to groupname."); setUsage("/ctf "); setArguments(0,1); } @@ -45,7 +45,7 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /ctf groupname. \n Or use /nlcg groupname if you don't have a group yet."); + sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); return true; } } @@ -84,7 +84,7 @@ else if (reinType == null){ sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); return true; } - sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /ctf or /cto to turn this off when you are done."); + sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /fortify or /cto to turn this off when you are done."); state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); state.setFortificationItemStack(reinType.getItemStack()); state.setGroup(g); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 95808753..aba1851a 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -39,7 +39,7 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /ctr groupname. \n Or /nlcg groupname if you don't have a group yet."); + sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or /create groupname if you don't have a group yet."); return true; } } @@ -67,7 +67,7 @@ public boolean execute(CommandSender sender, String[] args) { state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /ctr or /cto to turn this off when you are done."); + sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /reinforce or /cto to turn this off when you are done."); state.setMode(ReinforcementMode.REINFORCEMENT); state.setGroup(g); } From 506472392e97bba03fe1fdfe2844ff81af580fcf Mon Sep 17 00:00:00 2001 From: Soerxpso Date: Fri, 29 Jan 2016 19:40:58 -0800 Subject: [PATCH 006/255] Added support for exclusive reinforcement types (rebase of several commits) (cherry picked from commit 641b385a6abf0151901d4816c661c21e8a5eb572) | This is the 2nd commit message: Oops. Forgot to add this in the last commit. (cherry picked from commit 1fd9fdece4e7d579cb74c2b80ddaeeab6721c001) | This is the 3rd commit message: Fixed bug where exclusive reinforcement types could reinforce disallowed blocks using /ctareareinforce (cherry picked from commit a038ac4d0004bf9186f129cfff05a12ef4c9b77d) Conflicts: src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java | This is the 4th commit message: Increment pom, normatives Conflicts: src/vg/civcraft/mc/citadel/listener/BlockListener.java --- config.yml | 4 ++ src/vg/civcraft/mc/citadel/Citadel.java | 2 + .../mc/citadel/CitadelConfigManager.java | 7 +++ .../command/commands/AreaReinforce.java | 6 ++ .../mc/citadel/listener/BlockListener.java | 14 +++++ .../ExclusiveReinforcementType.java | 56 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java diff --git a/config.yml b/config.yml index af95ff6c..bcf5a773 100644 --- a/config.yml +++ b/config.yml @@ -22,6 +22,10 @@ reinforcements: # Delete the comment char to use lore. Three spaces are required # after lore. You can add multiple lines by adding - # - Some string representation required for this reinforcement. +# +# # Uncomment below to add limits to what blocks this reinforcement can be applied to +# reinforceables: +# - STONE iron: material: IRON_INGOT requirements: 1 diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 978419b5..2b951b90 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -20,6 +20,7 @@ import vg.civcraft.mc.citadel.listener.ShardListener; import vg.civcraft.mc.citadel.listener.WorldListener; import vg.civcraft.mc.citadel.misc.CitadelStatics; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -49,6 +50,7 @@ public void onEnable(){ ReinforcementType.initializeReinforcementTypes(); NaturalReinforcementType.initializeNaturalReinforcementsTypes(); NonReinforceableType.initializeNonReinforceableTypes(); + ExclusiveReinforcementType.initializeExclusiveReinforcementTypes(); initializeDatabase(); rm = new ReinforcementManager(db); diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 50d5f3af..693e37e6 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -20,6 +20,13 @@ public static List getReinforcementTypes(){ return reinforcementTypes; } + public static List getReinforceableMaterials(String mat){ + if(config.getConfigurationSection("reinforcements." + mat).contains("reinforceables")) { + return config.getConfigurationSection("reinforcements." + mat).getStringList("reinforceables"); + } + return null; + } + public static List getNaturalReinforcementTypes(){ List naturalReinforcementTypes = new ArrayList(); if (config.getConfigurationSection("natural_reinforcements") == null) diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java index 2ae540cf..7175954b 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java @@ -15,6 +15,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -95,6 +96,11 @@ public boolean execute(CommandSender sender, String[] args) { .getBlockAt(x, y, z)); if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) && !Utility.wouldPlantDoubleReinforce(current)) { + if (!ExclusiveReinforcementType.canReinforce(rt.getMaterial(), current.getType())) { + sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + + " was not reinforced because the material type you are using cannot reinforce that type of block."); + continue; + } Utility.createPlayerReinforcementWithoutMaterialConsumption(p, g, current, rt); } } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 87b5d203..49001e7d 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -57,6 +57,7 @@ import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -138,6 +139,12 @@ public void onFortificationMode(BlockPlaceEvent event){ event.setCancelled(true); return; } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), b.getType())) { + sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + event.setCancelled(true); + return; + } int required = type.getRequiredAmount(); if (type.getItemStack().isSimilar(event.getItemInHand())){ required++; @@ -605,6 +612,13 @@ public void interact(PlayerInteractEvent pie) { state.reset(); return; } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), block.getType())) { + sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); + state.reset(); + return; + } state.setFortificationItemStack(type.getItemStack()); // Break any natural reinforcement before placing the player // reinforcement diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java new file mode 100644 index 00000000..ee2eac60 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java @@ -0,0 +1,56 @@ +package vg.civcraft.mc.citadel.reinforcementtypes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; + +import vg.civcraft.mc.citadel.CitadelConfigManager; + +//An ExclusiveReinforcementType is a reinforcement type that can only reinforce certain blocks +//For example, maybe you want players to be able to reinforce chests with emeralds, +//but unable to reinforce obsidian with emeralds +public class ExclusiveReinforcementType { + + public static Map> mats = new HashMap>(); + + public static void initializeExclusiveReinforcementTypes() { + for(String reinforcementType : CitadelConfigManager.getReinforcementTypes()) { + Material mat = CitadelConfigManager.getMaterial(reinforcementType); + List canReinforceNames = CitadelConfigManager.getReinforceableMaterials(reinforcementType); + if(canReinforceNames == null) { + continue; + } + List canReinforce = new ArrayList(); + for(String s : canReinforceNames) { + canReinforce.add(Material.getMaterial(s)); + } + //Check if the reinforcement type is meant to be exclusive + if(!canReinforce.isEmpty()) { + mats.put(mat, canReinforce); + } + } + } + + public static boolean isExclusive(Material mat) { + return mats.containsKey(mat); + } + + public static List getReinforceableMaterials(Material mat) { + return mats.get(mat); + } + + /** + * Returns whether or not a given material can be used to reinforce another material + * @param The material to reinforce with + * @param The material to be reinforced + */ + public static boolean canReinforce(Material reinforcer, Material reinforcee) { + if(!isExclusive(reinforcer)) { + return true; + } + return mats.get(reinforcer).contains(reinforcee); + } +} From 5713cd91c8ea68caacba2268c8f7d167aa72ba38 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sun, 12 Jun 2016 00:50:29 -0400 Subject: [PATCH 007/255] Expansion on old commit #2c6624bebf6 including new soil-plant type beetroot --- .gitignore | 6 ++++-- src/vg/civcraft/mc/citadel/Utility.java | 3 ++- src/vg/civcraft/mc/citadel/listener/EntityListener.java | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 4190d768..c8523d52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ -.gitignore -/target \ No newline at end of file +/target +.project +.settings/** +.classpath diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index f25f4590..5a93e47f 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -313,7 +313,8 @@ private static boolean isSoilPlant(Material mat) { || Material.POTATO.equals(mat) || Material.CROPS.equals(mat) || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); + || Material.PUMPKIN.equals(mat) + || Material.BEETROOT_BLOCK.equals(mat); } private static boolean isDirtPlant(Material mat) { diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 4b1bd586..85f687a8 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -79,8 +79,8 @@ public void explode(EntityExplodeEvent eee) { Block block = Utility.getRealBlock(b); //if it's a plant we want to check the reinforcement of the soil block if(Utility.isPlant(block)) { - Block soilBlock = block.getRelative(BlockFace.DOWN); - if(Citadel.getReinforcementManager().isReinforced(soilBlock)) { + Block soilBlock = Utility.findPlantSoil(block); + if(soilBlock != null && Citadel.getReinforcementManager().isReinforced(soilBlock)) { block.getDrops().clear(); iterator.remove(); } From 73e3c38ca24747bde93c9c63626346217aa1ad03 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sun, 12 Jun 2016 00:54:54 -0400 Subject: [PATCH 008/255] Version updates for 1.10 synchronicity across plugins --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index f02096e3..6b00e712 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,8 @@ maven-compiler-plugin 2.3.2 - 1.8 - 1.8 + 1.7 + 1.7 @@ -46,7 +46,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.3.2 + 1.4.0 provided From 0472345be0bb4164d223b96c2ac6a21e89b2ab7e Mon Sep 17 00:00:00 2001 From: Soerxpso Date: Fri, 29 Jan 2016 19:40:58 -0800 Subject: [PATCH 009/255] Added support for exclusive reinforcement types (rebase of several commits) (cherry picked from commit 641b385a6abf0151901d4816c661c21e8a5eb572) | This is the 2nd commit message: Oops. Forgot to add this in the last commit. (cherry picked from commit 1fd9fdece4e7d579cb74c2b80ddaeeab6721c001) | This is the 3rd commit message: Fixed bug where exclusive reinforcement types could reinforce disallowed blocks using /ctareareinforce (cherry picked from commit a038ac4d0004bf9186f129cfff05a12ef4c9b77d) Conflicts: src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java | This is the 4th commit message: Increment pom, normatives Conflicts: src/vg/civcraft/mc/citadel/listener/BlockListener.java --- config.yml | 4 ++ src/vg/civcraft/mc/citadel/Citadel.java | 2 + .../mc/citadel/CitadelConfigManager.java | 7 +++ .../command/commands/AreaReinforce.java | 6 ++ .../mc/citadel/listener/BlockListener.java | 14 +++++ .../ExclusiveReinforcementType.java | 56 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java diff --git a/config.yml b/config.yml index af95ff6c..bcf5a773 100644 --- a/config.yml +++ b/config.yml @@ -22,6 +22,10 @@ reinforcements: # Delete the comment char to use lore. Three spaces are required # after lore. You can add multiple lines by adding - # - Some string representation required for this reinforcement. +# +# # Uncomment below to add limits to what blocks this reinforcement can be applied to +# reinforceables: +# - STONE iron: material: IRON_INGOT requirements: 1 diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 978419b5..2b951b90 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -20,6 +20,7 @@ import vg.civcraft.mc.citadel.listener.ShardListener; import vg.civcraft.mc.citadel.listener.WorldListener; import vg.civcraft.mc.citadel.misc.CitadelStatics; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -49,6 +50,7 @@ public void onEnable(){ ReinforcementType.initializeReinforcementTypes(); NaturalReinforcementType.initializeNaturalReinforcementsTypes(); NonReinforceableType.initializeNonReinforceableTypes(); + ExclusiveReinforcementType.initializeExclusiveReinforcementTypes(); initializeDatabase(); rm = new ReinforcementManager(db); diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 50d5f3af..693e37e6 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -20,6 +20,13 @@ public static List getReinforcementTypes(){ return reinforcementTypes; } + public static List getReinforceableMaterials(String mat){ + if(config.getConfigurationSection("reinforcements." + mat).contains("reinforceables")) { + return config.getConfigurationSection("reinforcements." + mat).getStringList("reinforceables"); + } + return null; + } + public static List getNaturalReinforcementTypes(){ List naturalReinforcementTypes = new ArrayList(); if (config.getConfigurationSection("natural_reinforcements") == null) diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java index 2ae540cf..7175954b 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java @@ -15,6 +15,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -95,6 +96,11 @@ public boolean execute(CommandSender sender, String[] args) { .getBlockAt(x, y, z)); if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) && !Utility.wouldPlantDoubleReinforce(current)) { + if (!ExclusiveReinforcementType.canReinforce(rt.getMaterial(), current.getType())) { + sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + + " was not reinforced because the material type you are using cannot reinforce that type of block."); + continue; + } Utility.createPlayerReinforcementWithoutMaterialConsumption(p, g, current, rt); } } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 87b5d203..49001e7d 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -57,6 +57,7 @@ import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -138,6 +139,12 @@ public void onFortificationMode(BlockPlaceEvent event){ event.setCancelled(true); return; } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), b.getType())) { + sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + event.setCancelled(true); + return; + } int required = type.getRequiredAmount(); if (type.getItemStack().isSimilar(event.getItemInHand())){ required++; @@ -605,6 +612,13 @@ public void interact(PlayerInteractEvent pie) { state.reset(); return; } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), block.getType())) { + sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); + state.reset(); + return; + } state.setFortificationItemStack(type.getItemStack()); // Break any natural reinforcement before placing the player // reinforcement diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java new file mode 100644 index 00000000..ee2eac60 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java @@ -0,0 +1,56 @@ +package vg.civcraft.mc.citadel.reinforcementtypes; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; + +import vg.civcraft.mc.citadel.CitadelConfigManager; + +//An ExclusiveReinforcementType is a reinforcement type that can only reinforce certain blocks +//For example, maybe you want players to be able to reinforce chests with emeralds, +//but unable to reinforce obsidian with emeralds +public class ExclusiveReinforcementType { + + public static Map> mats = new HashMap>(); + + public static void initializeExclusiveReinforcementTypes() { + for(String reinforcementType : CitadelConfigManager.getReinforcementTypes()) { + Material mat = CitadelConfigManager.getMaterial(reinforcementType); + List canReinforceNames = CitadelConfigManager.getReinforceableMaterials(reinforcementType); + if(canReinforceNames == null) { + continue; + } + List canReinforce = new ArrayList(); + for(String s : canReinforceNames) { + canReinforce.add(Material.getMaterial(s)); + } + //Check if the reinforcement type is meant to be exclusive + if(!canReinforce.isEmpty()) { + mats.put(mat, canReinforce); + } + } + } + + public static boolean isExclusive(Material mat) { + return mats.containsKey(mat); + } + + public static List getReinforceableMaterials(Material mat) { + return mats.get(mat); + } + + /** + * Returns whether or not a given material can be used to reinforce another material + * @param The material to reinforce with + * @param The material to be reinforced + */ + public static boolean canReinforce(Material reinforcer, Material reinforcee) { + if(!isExclusive(reinforcer)) { + return true; + } + return mats.get(reinforcer).contains(reinforcee); + } +} From 259b4c4384f8397fc7257f9d85f78ab270ed4fa0 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sun, 12 Jun 2016 00:50:29 -0400 Subject: [PATCH 010/255] Expansion on old commit #2c6624bebf6 including new soil-plant type beetroot --- .gitignore | 6 ++++-- src/vg/civcraft/mc/citadel/Utility.java | 3 ++- src/vg/civcraft/mc/citadel/listener/EntityListener.java | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 4190d768..c8523d52 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ -.gitignore -/target \ No newline at end of file +/target +.project +.settings/** +.classpath diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index f25f4590..5a93e47f 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -313,7 +313,8 @@ private static boolean isSoilPlant(Material mat) { || Material.POTATO.equals(mat) || Material.CROPS.equals(mat) || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); + || Material.PUMPKIN.equals(mat) + || Material.BEETROOT_BLOCK.equals(mat); } private static boolean isDirtPlant(Material mat) { diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 4b1bd586..85f687a8 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -79,8 +79,8 @@ public void explode(EntityExplodeEvent eee) { Block block = Utility.getRealBlock(b); //if it's a plant we want to check the reinforcement of the soil block if(Utility.isPlant(block)) { - Block soilBlock = block.getRelative(BlockFace.DOWN); - if(Citadel.getReinforcementManager().isReinforced(soilBlock)) { + Block soilBlock = Utility.findPlantSoil(block); + if(soilBlock != null && Citadel.getReinforcementManager().isReinforced(soilBlock)) { block.getDrops().clear(); iterator.remove(); } From 2d7e626298d405e07de05d6d87b07cfe49282949 Mon Sep 17 00:00:00 2001 From: ShadedJon Date: Wed, 22 Jun 2016 13:41:31 -0700 Subject: [PATCH 011/255] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9c790e29..45da1b61 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,5 @@ Original Citadel Jenkins Build Server can be found here: http://build.civcraft.c Basic new player tutorial: https://www.reddit.com/r/Devoted/wiki/plugins/citadel If you need help installing Citadel, follow this guide: https://github.com/ProgrammerDan/civcraft-vm + +https://www.devotedmc.com/citadel.html From 469a81d231221fb240f10c3d7ba11cb46012c149 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Jun 2016 21:31:30 +0200 Subject: [PATCH 012/255] Add toggleable easy mode command --- plugin.yml | 2 + pom.xml | 2 +- src/vg/civcraft/mc/citadel/PlayerState.java | 16 ++++++- .../mc/citadel/command/CommandHandler.java | 2 + .../command/commands/ToggleEasyMode.java | 43 +++++++++++++++++++ .../database/CitadelReinforcementData.java | 9 ++++ .../mc/citadel/listener/BlockListener.java | 6 +++ .../mc/citadel/listener/ShardListener.java | 7 +++ 8 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java diff --git a/plugin.yml b/plugin.yml index 243fb595..4567a11d 100644 --- a/plugin.yml +++ b/plugin.yml @@ -32,6 +32,8 @@ commands: ctsl: permission: citadel.admin aliases: [ctsetlogging] + cte: + aliases: [cteasy,toggleeasymode] permissions: citadel.admin: default: op diff --git a/pom.xml b/pom.xml index f02096e3..1c559493 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.2 + 3.5.3 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/PlayerState.java b/src/vg/civcraft/mc/citadel/PlayerState.java index a2b5f5dc..f127426d 100644 --- a/src/vg/civcraft/mc/citadel/PlayerState.java +++ b/src/vg/civcraft/mc/citadel/PlayerState.java @@ -7,7 +7,6 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitScheduler; @@ -65,6 +64,7 @@ public static void remove(Player player) { private boolean bypassMode; private Integer cancelModePid; private ItemStack fortificationStack; + private boolean easyMode; public PlayerState(Player player) { this(player.getUniqueId()); @@ -74,6 +74,7 @@ public PlayerState(UUID uuid) { reset(); this.accountId = uuid; bypassMode = false; + this.easyMode = true; } /** @@ -142,6 +143,19 @@ public boolean toggleBypassMode() { return bypassMode; } + public boolean getEasyMode() { + return easyMode; + } + + /** + * Toggles Easy Mode. + * @return Returns the new value. + */ + public boolean toggleEasyMode() { + easyMode = !easyMode; + return easyMode; + } + /** * Prepares a scheduled task to reset the mode after a configured amount * of time. diff --git a/src/vg/civcraft/mc/citadel/command/CommandHandler.java b/src/vg/civcraft/mc/citadel/command/CommandHandler.java index 3cc44f84..bfe582a5 100644 --- a/src/vg/civcraft/mc/citadel/command/CommandHandler.java +++ b/src/vg/civcraft/mc/citadel/command/CommandHandler.java @@ -21,6 +21,7 @@ import vg.civcraft.mc.citadel.command.commands.Reinforce; import vg.civcraft.mc.citadel.command.commands.SetLogging; import vg.civcraft.mc.citadel.command.commands.Stats; +import vg.civcraft.mc.citadel.command.commands.ToggleEasyMode; import vg.civcraft.mc.citadel.command.commands.UpdateReinforcements; import vg.civcraft.mc.civmodcore.command.Command; @@ -42,6 +43,7 @@ public void registerCommands(){ addCommands(new UpdateReinforcements("UpdateReinforcements")); addCommands(new AreaReinforce("AreaReinforce")); addCommands(new SetLogging("SetLogging")); + addCommands(new ToggleEasyMode("ToggleEasyMode")); } private void addCommands(Command command){ diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java new file mode 100644 index 00000000..3356f777 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -0,0 +1,43 @@ +package vg.civcraft.mc.citadel.command.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.PlayerState; + +public class ToggleEasyMode extends PlayerCommandMiddle { + + public ToggleEasyMode(String name) { + super(name); + setIdentifier("cte"); + setDescription("Toggle easy mode"); + setUsage("/cte"); + setArguments(0, 0); + } + + @Override + public boolean execute(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("Must be a player to perform that command."); + return true; + } + Player p = (Player) sender; + PlayerState state = PlayerState.get(p); + if (state.toggleEasyMode()) { + sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); + } else { + sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); + } + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + return new ArrayList(); + } + +} diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index df783364..508b8d61 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -180,6 +180,15 @@ private void createTables(){ ver = checkVersion(plugin.getName()); Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); } + if (ver == 9) { + long first_time = System.currentTimeMillis(); + Citadel.Log("Updating to version 10: Reinforcement state "); + db.execute("alter table reinforcement add acid_time int not null;"); + db.execute("update reinforcement set acid_time = maturation_time;"); // Might take a minute. + updateVersion(ver, plugin.getName()); + ver = checkVersion(plugin.getName()); + Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); + } Citadel.Log("The total time it took Citadel to update was " + (System.currentTimeMillis() - begin_time) / 1000 + " seconds."); } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 49001e7d..3087bf22 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -112,6 +112,9 @@ public void onFortificationMode(BlockPlaceEvent event){ type = state.getReinforcementType(); groupToReinforceTo = state.getGroup(); }else if(state.getMode() == ReinforcementMode.NORMAL) { + if (!state.getEasyMode()) { + return; + } type = ReinforcementType.getReinforcementType(p.getInventory().getItemInOffHand()); if (type == null) { return; @@ -458,6 +461,9 @@ public void interact(PlayerInteractEvent pie) { GroupManager gm = NameAPI.getGroupManager(); switch (placementMode) { case NORMAL: + if (!state.getEasyMode()) { + return; + } if (pie.getAction() == Action.LEFT_CLICK_BLOCK && generic_reinforcement == null) { ItemStack stack = player.getInventory().getItemInMainHand(); ReinforcementType type = ReinforcementType diff --git a/src/vg/civcraft/mc/citadel/listener/ShardListener.java b/src/vg/civcraft/mc/citadel/listener/ShardListener.java index 5fe33229..284aa390 100644 --- a/src/vg/civcraft/mc/citadel/listener/ShardListener.java +++ b/src/vg/civcraft/mc/citadel/listener/ShardListener.java @@ -32,6 +32,8 @@ public void serverChange(PlayerChangeServerEvent e) { sb.append("|"); PlayerState ps = PlayerState.get(e.getPlayerUUID()); sb.append(ps.getMode().toString()); + sb.append("|"); + sb.append(ps.getEasyMode()); if (ps.getMode() == ReinforcementMode.REINFORCEMENT || ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { sb.append("|"); @@ -69,6 +71,11 @@ public void messageReceive(AsyncPluginBroadcastMessageEvent e) { PlayerState ps = PlayerState.get(uuid); ReinforcementMode mode = ReinforcementMode.valueOf(data[2]); ps.setMode(mode); + boolean easyMode = Boolean.valueOf(data[3]); + if (!easyMode) { + //default for easy mode is true, so only change if its turned off + ps.toggleEasyMode(); + } if (mode == ReinforcementMode.REINFORCEMENT || mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { Group g = NameAPI.getGroupManager().getGroup(data[3]); From 6aaf9a008e645fa706b488c777c7dd5aecefa834 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Jun 2016 21:32:56 +0200 Subject: [PATCH 013/255] Revert accidental change --- .../mc/citadel/database/CitadelReinforcementData.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 508b8d61..df783364 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -180,15 +180,6 @@ private void createTables(){ ver = checkVersion(plugin.getName()); Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); } - if (ver == 9) { - long first_time = System.currentTimeMillis(); - Citadel.Log("Updating to version 10: Reinforcement state "); - db.execute("alter table reinforcement add acid_time int not null;"); - db.execute("update reinforcement set acid_time = maturation_time;"); // Might take a minute. - updateVersion(ver, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); - } Citadel.Log("The total time it took Citadel to update was " + (System.currentTimeMillis() - begin_time) / 1000 + " seconds."); } From c3e888ea6adebbd41acce0d6e3b9dbf0a5e9803a Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Jun 2016 21:31:30 +0200 Subject: [PATCH 014/255] Add toggleable easy mode command --- plugin.yml | 2 + pom.xml | 2 +- src/vg/civcraft/mc/citadel/PlayerState.java | 16 ++++++- .../mc/citadel/command/CommandHandler.java | 2 + .../command/commands/ToggleEasyMode.java | 43 +++++++++++++++++++ .../database/CitadelReinforcementData.java | 9 ++++ .../mc/citadel/listener/BlockListener.java | 6 +++ .../mc/citadel/listener/ShardListener.java | 7 +++ 8 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java diff --git a/plugin.yml b/plugin.yml index f29dd6cf..9cd0085e 100644 --- a/plugin.yml +++ b/plugin.yml @@ -32,6 +32,8 @@ commands: ctsl: permission: citadel.admin aliases: [ctsetlogging] + cte: + aliases: [cteasy,toggleeasymode] permissions: citadel.admin: default: op diff --git a/pom.xml b/pom.xml index 6b00e712..514e2c96 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.2 + 3.5.3 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/PlayerState.java b/src/vg/civcraft/mc/citadel/PlayerState.java index a2b5f5dc..f127426d 100644 --- a/src/vg/civcraft/mc/citadel/PlayerState.java +++ b/src/vg/civcraft/mc/citadel/PlayerState.java @@ -7,7 +7,6 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitScheduler; @@ -65,6 +64,7 @@ public static void remove(Player player) { private boolean bypassMode; private Integer cancelModePid; private ItemStack fortificationStack; + private boolean easyMode; public PlayerState(Player player) { this(player.getUniqueId()); @@ -74,6 +74,7 @@ public PlayerState(UUID uuid) { reset(); this.accountId = uuid; bypassMode = false; + this.easyMode = true; } /** @@ -142,6 +143,19 @@ public boolean toggleBypassMode() { return bypassMode; } + public boolean getEasyMode() { + return easyMode; + } + + /** + * Toggles Easy Mode. + * @return Returns the new value. + */ + public boolean toggleEasyMode() { + easyMode = !easyMode; + return easyMode; + } + /** * Prepares a scheduled task to reset the mode after a configured amount * of time. diff --git a/src/vg/civcraft/mc/citadel/command/CommandHandler.java b/src/vg/civcraft/mc/citadel/command/CommandHandler.java index 3cc44f84..bfe582a5 100644 --- a/src/vg/civcraft/mc/citadel/command/CommandHandler.java +++ b/src/vg/civcraft/mc/citadel/command/CommandHandler.java @@ -21,6 +21,7 @@ import vg.civcraft.mc.citadel.command.commands.Reinforce; import vg.civcraft.mc.citadel.command.commands.SetLogging; import vg.civcraft.mc.citadel.command.commands.Stats; +import vg.civcraft.mc.citadel.command.commands.ToggleEasyMode; import vg.civcraft.mc.citadel.command.commands.UpdateReinforcements; import vg.civcraft.mc.civmodcore.command.Command; @@ -42,6 +43,7 @@ public void registerCommands(){ addCommands(new UpdateReinforcements("UpdateReinforcements")); addCommands(new AreaReinforce("AreaReinforce")); addCommands(new SetLogging("SetLogging")); + addCommands(new ToggleEasyMode("ToggleEasyMode")); } private void addCommands(Command command){ diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java new file mode 100644 index 00000000..3356f777 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -0,0 +1,43 @@ +package vg.civcraft.mc.citadel.command.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.PlayerState; + +public class ToggleEasyMode extends PlayerCommandMiddle { + + public ToggleEasyMode(String name) { + super(name); + setIdentifier("cte"); + setDescription("Toggle easy mode"); + setUsage("/cte"); + setArguments(0, 0); + } + + @Override + public boolean execute(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("Must be a player to perform that command."); + return true; + } + Player p = (Player) sender; + PlayerState state = PlayerState.get(p); + if (state.toggleEasyMode()) { + sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); + } else { + sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); + } + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + return new ArrayList(); + } + +} diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index df783364..508b8d61 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -180,6 +180,15 @@ private void createTables(){ ver = checkVersion(plugin.getName()); Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); } + if (ver == 9) { + long first_time = System.currentTimeMillis(); + Citadel.Log("Updating to version 10: Reinforcement state "); + db.execute("alter table reinforcement add acid_time int not null;"); + db.execute("update reinforcement set acid_time = maturation_time;"); // Might take a minute. + updateVersion(ver, plugin.getName()); + ver = checkVersion(plugin.getName()); + Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); + } Citadel.Log("The total time it took Citadel to update was " + (System.currentTimeMillis() - begin_time) / 1000 + " seconds."); } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 49001e7d..3087bf22 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -112,6 +112,9 @@ public void onFortificationMode(BlockPlaceEvent event){ type = state.getReinforcementType(); groupToReinforceTo = state.getGroup(); }else if(state.getMode() == ReinforcementMode.NORMAL) { + if (!state.getEasyMode()) { + return; + } type = ReinforcementType.getReinforcementType(p.getInventory().getItemInOffHand()); if (type == null) { return; @@ -458,6 +461,9 @@ public void interact(PlayerInteractEvent pie) { GroupManager gm = NameAPI.getGroupManager(); switch (placementMode) { case NORMAL: + if (!state.getEasyMode()) { + return; + } if (pie.getAction() == Action.LEFT_CLICK_BLOCK && generic_reinforcement == null) { ItemStack stack = player.getInventory().getItemInMainHand(); ReinforcementType type = ReinforcementType diff --git a/src/vg/civcraft/mc/citadel/listener/ShardListener.java b/src/vg/civcraft/mc/citadel/listener/ShardListener.java index 5fe33229..284aa390 100644 --- a/src/vg/civcraft/mc/citadel/listener/ShardListener.java +++ b/src/vg/civcraft/mc/citadel/listener/ShardListener.java @@ -32,6 +32,8 @@ public void serverChange(PlayerChangeServerEvent e) { sb.append("|"); PlayerState ps = PlayerState.get(e.getPlayerUUID()); sb.append(ps.getMode().toString()); + sb.append("|"); + sb.append(ps.getEasyMode()); if (ps.getMode() == ReinforcementMode.REINFORCEMENT || ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { sb.append("|"); @@ -69,6 +71,11 @@ public void messageReceive(AsyncPluginBroadcastMessageEvent e) { PlayerState ps = PlayerState.get(uuid); ReinforcementMode mode = ReinforcementMode.valueOf(data[2]); ps.setMode(mode); + boolean easyMode = Boolean.valueOf(data[3]); + if (!easyMode) { + //default for easy mode is true, so only change if its turned off + ps.toggleEasyMode(); + } if (mode == ReinforcementMode.REINFORCEMENT || mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { Group g = NameAPI.getGroupManager().getGroup(data[3]); From 0ceaa502b97ca4ff24a2ee49acd7466353504512 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Jun 2016 21:32:56 +0200 Subject: [PATCH 015/255] Revert accidental change --- .../mc/citadel/database/CitadelReinforcementData.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 508b8d61..df783364 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -180,15 +180,6 @@ private void createTables(){ ver = checkVersion(plugin.getName()); Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); } - if (ver == 9) { - long first_time = System.currentTimeMillis(); - Citadel.Log("Updating to version 10: Reinforcement state "); - db.execute("alter table reinforcement add acid_time int not null;"); - db.execute("update reinforcement set acid_time = maturation_time;"); // Might take a minute. - updateVersion(ver, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); - } Citadel.Log("The total time it took Citadel to update was " + (System.currentTimeMillis() - begin_time) / 1000 + " seconds."); } From d531fb2a4b0c254e02d934e7900f1f61edb841b2 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 30 Jun 2016 02:36:34 -0400 Subject: [PATCH 016/255] Addressing (again) null ref warning on xplosion block breaks. --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/Utility.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 514e2c96..a9598504 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.3 + 3.5.4 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 5a93e47f..90f54e2e 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -694,7 +694,7 @@ public static boolean isAuthorizedPlayerNear(PlayerReinforcement reinforcement, * @return Returns a natural Reinforcement for the block or null if it isn't meant to have one. */ public static NaturalReinforcement createNaturalReinforcement(Block block, Player player) { - if (block == null || player == null) { + if (block == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility createNaturalReinforcement called with null"); return null; From b71989f9cf850cac72fb8936f746475b311abe10 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 30 Jun 2016 02:36:34 -0400 Subject: [PATCH 017/255] Addressing (again) null ref warning on xplosion block breaks. --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/Utility.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1c559493..4490f9a5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.3 + 3.5.4 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 5a93e47f..90f54e2e 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -694,7 +694,7 @@ public static boolean isAuthorizedPlayerNear(PlayerReinforcement reinforcement, * @return Returns a natural Reinforcement for the block or null if it isn't meant to have one. */ public static NaturalReinforcement createNaturalReinforcement(Block block, Player player) { - if (block == null || player == null) { + if (block == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility createNaturalReinforcement called with null"); return null; From d6a429279edf5e11e35c54c43e814d033fd19fb9 Mon Sep 17 00:00:00 2001 From: BlackXnt Date: Thu, 7 Jul 2016 16:12:50 +0300 Subject: [PATCH 018/255] Adding particles to reinforcements (#185) * Adding particles to reinforcements * improve reinforcement effect customization --- config.yml | 26 ++++ .../mc/citadel/CitadelConfigManager.java | 26 ++++ src/vg/civcraft/mc/citadel/Utility.java | 26 ++++ .../ReinforcementEffect.java | 115 ++++++++++++++++++ .../reinforcementtypes/ReinforcementType.java | 24 ++-- 5 files changed, 210 insertions(+), 7 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java diff --git a/config.yml b/config.yml index bcf5a773..13a8e407 100644 --- a/config.yml +++ b/config.yml @@ -3,6 +3,16 @@ # return is the amount of material to return. # percent_chance is the chance to return the block. Scales with damage. # scale_amount is, if maturation is enabled, the amount extra to damage a block if it is not fully matured. The forumla for calculating the extra damage is 1/(1-((time left of maturation) / (default amount of time for maturation))) * scale. So if a block has 5 minutes left of maturation on a 10 minute default period with a scale of 3 we do 1/(5 / 10) * 3 = 6 damage. Setting scale amount to 0 disables this function. +# effect allows to add particles around a reinforced block when it is created or damaged. +# type: The bukkit name of the particle. +# id: the item/block/data id for the effect +# data: the data value of the block/item for the effect +# offsetX: the amount to be randomly offset by in the X axis +# offsetY: the amount to be randomly offset by in the Y axis +# offsetZ: the amount to be randomly offset by in the Z axis +# speed: the speed of the particles +# particleCount: the amount of particle to display. +# view_distance: the distance from which players will be able to see the effect. default is 16. internal_logging: true command_logging: true break_logging: true @@ -19,6 +29,10 @@ reinforcements: acid_time: 1440 scale_amount: 1 lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 # Delete the comment char to use lore. Three spaces are required # after lore. You can add multiple lines by adding - # - Some string representation required for this reinforcement. @@ -36,6 +50,10 @@ reinforcements: acid_time: 60 scale_amount: 1 lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 stone: material: STONE requirements: 1 @@ -46,6 +64,10 @@ reinforcements: acid_time: 10 scale_amount: 1 lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 bedrock: material: BEDROCK requirements: 1 @@ -56,6 +78,10 @@ reinforcements: acid_time: 147483646 scale_amount: 1 lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 #natural_reinforcements: #diamond_ore: #material: DIAMOND_ORE diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 693e37e6..f2cd50aa 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -2,10 +2,14 @@ import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementEffect; + public class CitadelConfigManager { private static FileConfiguration config; @@ -83,6 +87,28 @@ public static List getLoreValues(String type){ return config.getStringList("reinforcements." + type + ".lore"); } + public static ReinforcementEffect getReinforcementEffect(String type){ + Effect effect = null; + if (config.getString("reinforcements." + type + ".effect.type") != null) { + try { + effect = Effect.valueOf(config.getString("reinforcements." + type + ".effect.type")); + } catch (IllegalArgumentException e) { + Citadel.getInstance().getLogger().log(Level.WARNING, "Invalid effect at: " + config.getCurrentPath()); + return null; + } + int id = config.getInt("reinforcements." + type + ".effect.id", 0); + int data = config.getInt("reinforcements." + type + ".effect.data", 0); + float offsetX = (float) config.getDouble("reinforcements." + type + ".effect.offsetX", 0); + float offsetY = (float) config.getDouble("reinforcements." + type + ".effect.offsetY", 0); + float offsetZ = (float) config.getDouble("reinforcements." + type + ".effect.offsetZ", 0); + float speed = (float) config.getDouble("reinforcements." + type + ".effect.speed", 1); + int amount = config.getInt("reinforcements." + type + ".effect.particleCount", 1); + int viewDistance = config.getInt("reinforcements." + type + ".effect.view_distance", 16); + return new ReinforcementEffect(effect, id, data, offsetX, offsetY, offsetZ, speed, amount, viewDistance); + } + return null; + } + public static Material getNaturalReinforcementMaterial(String type){ return Material.valueOf(config.getString("natural_reinforcements." + type + ".material")); diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 90f54e2e..87f5c382 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -12,10 +12,14 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.Effect.Type; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -35,6 +39,7 @@ import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementEffect; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -196,7 +201,9 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group requirements, type.getRequiredAmount())); } player.updateInventory(); + rm.saveInitialReinforcement(rein); + playReinforcementEffect(rein); return rein; } @@ -239,6 +246,7 @@ public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsum throw new ReinforcemnetFortificationCancelException(); } rm.saveInitialReinforcement(rein); + playReinforcementEffect(rein); return rein; } @@ -459,6 +467,9 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc // leave message } rm.saveReinforcement(reinforcement); + if(reinforcement instanceof PlayerReinforcement){ + playReinforcementEffect((PlayerReinforcement)reinforcement); + } } return cancelled; } @@ -878,6 +889,21 @@ public static MultiBlockReinforcement createMultiBlockReinforcement(List types = new HashMap(); public ReinforcementType(Material mat, int amount, double percentReturn, int returnValue, int hitpoints, int maturationTime, int acidTime, - int scale, List lore) { + int scale, List lore, ReinforcementEffect effect) { this.mat = mat; this.amount = amount; this.percentReturn = percentReturn/100; @@ -39,6 +40,7 @@ public ReinforcementType(Material mat, int amount, double percentReturn, this.maturationTime = maturationTime; this.acidTime = acidTime; this.scale = scale; + this.effect = effect; ItemStack stack = new ItemStack(mat, amount); ItemMeta meta = stack.getItemMeta(); meta.setLore(lore); @@ -59,14 +61,16 @@ public static void initializeReinforcementTypes(){ int acid = CitadelConfigManager.getAcidTime(type); int maturation_scale = CitadelConfigManager.getMaturationScale(type); List lore = CitadelConfigManager.getLoreValues(type); + ReinforcementEffect effect = CitadelConfigManager.getReinforcementEffect(type); new ReinforcementType(mat, amount, percentReturn, returnValue, - hitpoints, maturation, acid, maturation_scale, lore); + hitpoints, maturation, acid, maturation_scale, lore, effect); if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Adding Reinforcement {0} with:\n material {1} \n amount {2} " + - "\n return rate {3} \n return? {4} \n health {5} \n maturation {6} " + - "\n acid {7} \n scaling {8} \n lore: {9}", new Object[] { - type, mat.toString(), amount, percentReturn, returnValue, hitpoints, - maturation, acid, maturation_scale, (lore != null ? String.join(" ", lore) : "")}); + Citadel.getInstance().getLogger().log(Level.INFO, + "Adding Reinforcement {0} with:\n material {1} \n amount {2} " + + "\n return rate {3} \n return? {4} \n health {5} \n maturation {6} " + + "\n acid {7} \n scaling {8} \n lore: {9} \n effect: \n {10}", + new Object[] { type, mat.toString(), amount, percentReturn, returnValue, hitpoints, maturation, + acid, maturation_scale, (lore != null ? String.join(" ", lore) : ""), (effect != null ? effect : "")}); } } } @@ -118,6 +122,12 @@ public int getAcidTime() { public int getMaturationScale(){ return scale; } + /** + * @return Get the effect to spawn around this type of reinforcement when it is created or damaged. + */ + public ReinforcementEffect getReinforcementEffect(){ + return effect; + } /** * Returns the ReinforcementType for a given ItemStack. * @param The ItemStack that a player may be holding. From 1170e618ed4cb0f2f8984e22a3569b37b05d363e Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 13 Jul 2016 13:40:16 -0400 Subject: [PATCH 019/255] Citadel is causing massive lag spikes on player join, worse yet if the database is under load. This should help, by putting asynchronous the database-heavy update query added recently to joins --- .../mc/citadel/listener/EntityListener.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 85f687a8..904972f5 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -43,6 +43,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelConfigManager; @@ -360,13 +361,20 @@ public void entityDamageEvent(EntityDamageByEntityEvent event){ @EventHandler(priority=EventPriority.LOWEST) public void playerJoinEvent(PlayerJoinEvent event){ Player p = event.getPlayer(); - UUID uuid = p.getUniqueId(); - GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); - for (String groupName : db.getGroupNames(uuid)){ - if(NameAPI.getGroupManager().hasAccess(groupName, p.getUniqueId(), PermissionType.getPermission("REINFORCE"))) { - db.updateTimestamp(groupName); + final UUID uuid = p.getUniqueId(); + + new BukkitRunnable() { + @Override + public void run() { + GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); + for (String groupName : db.getGroupNames(uuid)){ + if(NameAPI.getGroupManager().hasAccess(groupName, uuid, PermissionType.getPermission("REINFORCE"))) { + db.updateTimestamp(groupName); + } + } } - } + }.runTaskAsynchronously(Citadel.getInstance()); + if (CitadelConfigManager.defaultBypassOn()) { PlayerState state = PlayerState.get(p); if (!state.isBypassMode()) { From 98f22b9efa2f5848fe091e4e55777f1596d931a4 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 13 Jul 2016 13:40:16 -0400 Subject: [PATCH 020/255] Citadel is causing massive lag spikes on player join, worse yet if the database is under load. This should help, by putting asynchronous the database-heavy update query added recently to joins --- .../mc/citadel/listener/EntityListener.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 85f687a8..904972f5 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -43,6 +43,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelConfigManager; @@ -360,13 +361,20 @@ public void entityDamageEvent(EntityDamageByEntityEvent event){ @EventHandler(priority=EventPriority.LOWEST) public void playerJoinEvent(PlayerJoinEvent event){ Player p = event.getPlayer(); - UUID uuid = p.getUniqueId(); - GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); - for (String groupName : db.getGroupNames(uuid)){ - if(NameAPI.getGroupManager().hasAccess(groupName, p.getUniqueId(), PermissionType.getPermission("REINFORCE"))) { - db.updateTimestamp(groupName); + final UUID uuid = p.getUniqueId(); + + new BukkitRunnable() { + @Override + public void run() { + GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); + for (String groupName : db.getGroupNames(uuid)){ + if(NameAPI.getGroupManager().hasAccess(groupName, uuid, PermissionType.getPermission("REINFORCE"))) { + db.updateTimestamp(groupName); + } + } } - } + }.runTaskAsynchronously(Citadel.getInstance()); + if (CitadelConfigManager.defaultBypassOn()) { PlayerState state = PlayerState.get(p); if (!state.isBypassMode()) { From bafbbf8bebd72a45d099e1a7af92842921109335 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 13 Jul 2016 13:43:34 -0400 Subject: [PATCH 021/255] Forgot to increment pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a9598504..f42b7d45 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.4 + 3.5.5 Citadel https://github.com/Civcraft/Citadel From c2782deebb5251880f2275f6c6dacd8b50778d37 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 13 Jul 2016 13:43:34 -0400 Subject: [PATCH 022/255] Forgot to increment pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4490f9a5..1cab2064 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.4 + 3.5.5 Citadel https://github.com/Civcraft/Citadel From 35205733c8511a16ed9e2aff311c78ba949b9a75 Mon Sep 17 00:00:00 2001 From: Daniel Boston Date: Wed, 13 Jul 2016 18:39:39 -0400 Subject: [PATCH 023/255] As discussed, all types and tiers. (#187) --- config.yml | 90 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 76 insertions(+), 14 deletions(-) diff --git a/config.yml b/config.yml index 13a8e407..8d83d89c 100644 --- a/config.yml +++ b/config.yml @@ -18,15 +18,15 @@ command_logging: true break_logging: true reinf_logging: false reinforcements: - diamond: - material: DIAMOND + stone_tier: + material: STONE requirements: 1 return: 1 percent_chance: 100 - hit_points: 1800 + hit_points: 50 # mature time is in minutes - mature_time: 1440 - acid_time: 1440 + mature_time: 5 + acid_time: 30 scale_amount: 1 lore: effect: @@ -40,30 +40,92 @@ reinforcements: # # Uncomment below to add limits to what blocks this reinforcement can be applied to # reinforceables: # - STONE - iron: - material: IRON_INGOT + bracers: + material: NETHER_BRICK_ITEM + requirements: 1 + return: 0 + percent_chance: 0 + hit_points: 750 + mature_time: 129600 + acid_time: 10080 + scale_amount: 1 + lore: + - Structure Bracing + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 + basic_tier: + material: CLAY_BALL requirements: 1 return: 1 percent_chance: 100 hit_points: 250 - mature_time: 60 - acid_time: 60 + mature_time: 20 + acid_time: 120 scale_amount: 1 lore: + - Basic Reinforcement effect: type: FLYING_GLYPH speed: 0.5 particleCount: 50 - stone: - material: STONE + decent_tier: + material: SLIME_BALL + requirements: 1 + return: 1 + percent_chance: 100 + hit_points: 750 + mature_time: 180 + acid_time: 480 + scale_amount: 1 + lore: + - Decent Reinforcement + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 + good_tier: + material: MAGMA_CREAM requirements: 1 return: 1 percent_chance: 100 - hit_points: 25 - mature_time: 10 - acid_time: 10 + hit_points: 1500 + mature_time: 640 + acid_time: 1440 + scale_amount: 1 + lore: + - Good Reinforcement + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 + best_tier: + material: QUARTZ + requirements: 1 + return: 1 + percent_chance: 100 + hit_points: 2000 + mature_time: 2560 + acid_time: 2880 + scale_amount: 2 + lore: + - Best Reinforcement + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 + good_tier_instant: + material: FIREWORK_CHARGE + requirements: 1 + return: 1 + percent_chance: 95 + hit_points: 1500 + mature_time: 5 + acid_time: 1440 scale_amount: 1 lore: + - Rapid Reinforcement effect: type: FLYING_GLYPH speed: 0.5 From 9da6e361f81650c4c11e0a8a5c74f4f36acb1e70 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 7 Aug 2016 03:32:55 +0200 Subject: [PATCH 024/255] Prevent NPE on placing --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/Utility.java | 6 ------ src/vg/civcraft/mc/citadel/listener/BlockListener.java | 6 ++++++ src/vg/civcraft/mc/citadel/listener/EntityListener.java | 4 ---- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 1cab2064..668a9af8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.5 + 3.5.6 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 87f5c382..c3328e2e 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -12,14 +12,10 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Effect.Type; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Particle; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -27,7 +23,6 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.Bed; -import org.bukkit.material.Door; import org.bukkit.util.Vector; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; @@ -43,7 +38,6 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; /** diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 3087bf22..7552b289 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -110,6 +110,12 @@ public void onFortificationMode(BlockPlaceEvent event){ Group groupToReinforceTo = null; if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { type = state.getReinforcementType(); + if (type == null) { + sendAndLog(p, ChatColor.RED, "Something went wrong, you dont seem to have a reinforcement material selected?"); + state.reset(); + event.setCancelled(true); + return; + } groupToReinforceTo = state.getGroup(); }else if(state.getMode() == ReinforcementMode.NORMAL) { if (!state.getEasyMode()) { diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 904972f5..902dce46 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -33,7 +33,6 @@ import org.bukkit.event.entity.EntityBreakDoorEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; @@ -58,12 +57,9 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.database.GroupManagerDao; -import vg.civcraft.mc.namelayer.events.PromotePlayerEvent; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.GroupPermission; import vg.civcraft.mc.namelayer.permission.PermissionType; From 2041e1243606660e9185edc31e3248dccd1c19c5 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 7 Aug 2016 04:10:36 +0200 Subject: [PATCH 025/255] Prevent null groups --- src/vg/civcraft/mc/citadel/listener/ShardListener.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vg/civcraft/mc/citadel/listener/ShardListener.java b/src/vg/civcraft/mc/citadel/listener/ShardListener.java index 284aa390..65c19b7d 100644 --- a/src/vg/civcraft/mc/citadel/listener/ShardListener.java +++ b/src/vg/civcraft/mc/citadel/listener/ShardListener.java @@ -37,6 +37,9 @@ public void serverChange(PlayerChangeServerEvent e) { if (ps.getMode() == ReinforcementMode.REINFORCEMENT || ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { sb.append("|"); + if (ps.getGroup() == null) { + return; + } sb.append(ps.getGroup().getName()); if (ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { sb.append("|"); From de29827bf0aa216bf67d8042050e672dccff335c Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 7 Aug 2016 22:38:04 +0200 Subject: [PATCH 026/255] Add reinforcements GUI --- plugin.yml | 2 + pom.xml | 2 +- .../mc/citadel/command/CommandHandler.java | 5 +- .../command/commands/ReinforcementsGUI.java | 95 +++++++++++++++++++ 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java diff --git a/plugin.yml b/plugin.yml index 4567a11d..ae9ca04b 100644 --- a/plugin.yml +++ b/plugin.yml @@ -34,6 +34,8 @@ commands: aliases: [ctsetlogging] cte: aliases: [cteasy,toggleeasymode] + ctdl: + aliases: [reinforcements,rein] permissions: citadel.admin: default: op diff --git a/pom.xml b/pom.xml index 668a9af8..39968133 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.6 + 3.5.7 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/command/CommandHandler.java b/src/vg/civcraft/mc/citadel/command/CommandHandler.java index bfe582a5..cbc06bb3 100644 --- a/src/vg/civcraft/mc/citadel/command/CommandHandler.java +++ b/src/vg/civcraft/mc/citadel/command/CommandHandler.java @@ -3,13 +3,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.logging.Level; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; import vg.civcraft.mc.citadel.command.commands.Acid; import vg.civcraft.mc.citadel.command.commands.AreaReinforce; import vg.civcraft.mc.citadel.command.commands.Bypass; @@ -19,6 +16,7 @@ import vg.civcraft.mc.citadel.command.commands.Materials; import vg.civcraft.mc.citadel.command.commands.Off; import vg.civcraft.mc.citadel.command.commands.Reinforce; +import vg.civcraft.mc.citadel.command.commands.ReinforcementsGUI; import vg.civcraft.mc.citadel.command.commands.SetLogging; import vg.civcraft.mc.citadel.command.commands.Stats; import vg.civcraft.mc.citadel.command.commands.ToggleEasyMode; @@ -44,6 +42,7 @@ public void registerCommands(){ addCommands(new AreaReinforce("AreaReinforce")); addCommands(new SetLogging("SetLogging")); addCommands(new ToggleEasyMode("ToggleEasyMode")); + addCommands(new ReinforcementsGUI("ReinforcementGUI")); } private void addCommands(Command command){ diff --git a/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java b/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java new file mode 100644 index 00000000..665368a0 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java @@ -0,0 +1,95 @@ +package vg.civcraft.mc.citadel.command.commands; + +import java.text.DecimalFormat; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; + +import net.md_5.bungee.api.ChatColor; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.inventorygui.ClickableInventory; +import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; +import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; + +public class ReinforcementsGUI extends PlayerCommandMiddle { + + private DecimalFormat format; + + public ReinforcementsGUI(String name) { + super(name); + setIdentifier("ctdl"); + setDescription("Open GUI to display all reinforcement materials"); + setUsage("/ctdl"); + setArguments(0, 0); + this.format = new DecimalFormat("##.##"); + } + + @Override + public boolean execute(CommandSender sender, String[] arg1) { + if (!(sender instanceof Player)) { + sender.sendMessage(ChatColor.RED + "Sorry bae, I cant open GUIs for you"); + return true; + } + List types = ReinforcementType.getReinforcementTypes(); + int rows = types.size() / 9; + if ((types.size() % 9) != 0) { + rows++; + } + //sort ascending by health + Collections.sort(types, new Comparator() { + + @Override + public int compare(ReinforcementType o1, ReinforcementType o2) { + return new Integer(o1.getHitPoints()).compareTo(o2.getHitPoints()); + } + }); + ClickableInventory ci = new ClickableInventory(rows * 9, ChatColor.GOLD + "Citadel"); + int slot = 0; + List items = new LinkedList(); + for (ReinforcementType type : types) { + ItemStack is = type.getItemStack().clone(); + is.setAmount(type.getRequiredAmount()); + ISUtils.addLore(is, ChatColor.GREEN + "Hit points: " + type.getHitPoints()); + int daysMature = type.getMaturationTime() / 60 / 24; + int hoursMature = (type.getMaturationTime() - (daysMature * 60 * 24)) / 60; + int minutesMature = (type.getMaturationTime() - (daysMature * 60 * 24) - (hoursMature * 60)); + String matureString = ChatColor.AQUA + "Maturation time: " + createOutputTime(daysMature, "day") + + createOutputTime(hoursMature, "hour") + createOutputTime(minutesMature, "minute"); + ISUtils.addLore(is, matureString.substring(0, matureString.length() - 2)); + int daysAcid = type.getAcidTime() / 60 / 24; + int hoursAcid = (type.getAcidTime() - (daysAcid * 60 * 24)) / 60; + int minutesAcid = (type.getAcidTime() - (daysAcid * 60 * 24) - (hoursAcid * 60)); + String acidString = ChatColor.GOLD + "Acidblock maturation time: " + createOutputTime(daysAcid, "day") + + createOutputTime(hoursAcid, "hour") + createOutputTime(minutesAcid, "minute"); + ISUtils.addLore(is, acidString.substring(0, acidString.length() - 2)); + ISUtils.addLore(is, ChatColor.WHITE + "Return chance: " + format.format(type.getPercentReturn() * 100.0) + " %"); + items.add(is); + ci.setSlot(new DecorationStack(is), slot); + slot++; + } + ci.showInventory((Player) sender); + return true; + } + + private String createOutputTime(int value, String timeUnit) { + if (value == 0) { + return ""; + } + if (value == 1) { + return value + " " + timeUnit + ", "; + } + return value + " " + timeUnit + "s, "; + } + + @Override + public List tabComplete(CommandSender arg0, String[] arg1) { + return null; + } + +} From 88194ffd4c1c712fb965385a48ab2e44773b6874 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 8 Aug 2016 16:45:19 +0200 Subject: [PATCH 027/255] Fix zombie door breaking --- src/vg/civcraft/mc/citadel/listener/EntityListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 902dce46..aaf48a60 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -4,6 +4,7 @@ import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; import static vg.civcraft.mc.citadel.Utility.explodeReinforcement; +import static vg.civcraft.mc.citadel.Utility.getRealBlock; import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; @@ -102,7 +103,7 @@ public void explode(EntityExplodeEvent eee) { @EventHandler(ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { - ebde.setCancelled(maybeReinforcementDamaged(ebde.getBlock())); + ebde.setCancelled(maybeReinforcementDamaged(getRealBlock(ebde.getBlock()))); } @EventHandler(ignoreCancelled = true) From 7bb66080b3a82585718449a5ceb68b9c55df04f4 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 11 Aug 2016 20:54:07 +0200 Subject: [PATCH 028/255] Cutoff long percentages in cti caused by floating point errors --- .../mc/citadel/reinforcement/PlayerReinforcement.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index d938ab75..7c0e2fac 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -1,6 +1,7 @@ package vg.civcraft.mc.citadel.reinforcement; import java.sql.Timestamp; +import java.text.DecimalFormat; import java.util.logging.Level; import org.bukkit.Location; @@ -145,7 +146,8 @@ public double getHealth() { public String getHealthText() { double health = getHealth(); if (CitadelConfigManager.showHealthAsPercent()) { - return health * 100 + "%"; + DecimalFormat df = new DecimalFormat("#.##"); + return df.format(health * 100) + "%"; } else { if (health > 0.75) { return "excellently"; From a91e6108da2d6dc7d5ad9720490fb6427e50bbe7 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 11 Aug 2016 14:52:57 -0400 Subject: [PATCH 029/255] Addressing some less then great logspamming due to what gets logged for each config item. Needs testing but should resolve. Also includes minor fix for extremely low probability chance that when breaking a 0 health reinforced block, the reinforcement would drop, due to how Random.nextDouble() works. --- .editorconfig | 20 ++++++++++ config.yml | 11 +++++- pom.xml | 2 +- .../mc/citadel/CitadelConfigManager.java | 10 ++++- src/vg/civcraft/mc/citadel/Utility.java | 38 ++++++++++++------- .../mc/citadel/command/commands/Acid.java | 2 +- .../citadel/command/commands/SetLogging.java | 22 +++++++---- 7 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..abc68a4d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.java] +indent_style = tab +tab_width = 4 +trim_trailing_whitespace = true + +[*.xml] +indent_style = tab +tab_width = 4 +trim_trailing_whitespace = true + +[*.yml] +indent_style = space +tab_width = 2 +trim_trailing_whitespace = true diff --git a/config.yml b/config.yml index 8d83d89c..dafdf7b6 100644 --- a/config.yml +++ b/config.yml @@ -13,10 +13,19 @@ # speed: the speed of the particles # particleCount: the amount of particle to display. # view_distance: the distance from which players will be able to see the effect. default is 16. +# internal_logging logs Citadel internal status messages, config notices, and the like. Strongly recommend it be on. internal_logging: true +# command_logging logs the _response_ that Citadel sends to the player; very useful. command_logging: true -break_logging: true +# break_logging logs all reinforcement breaks that are done in /ctb mode (e.g. friendly breaks). +break_logging: false +# hostile_logging logs all reinforcement breaks that are done without bypass (e.g. hostile breaks). +hostile_logging: true +# damage_logging logs all reinforcement break attempts. Leave off unless you need it. +damage_logging: false +# reinf_logging logs all reinforcement creation and also logs when group lookups fail. Can get super spammy. reinf_logging: false +# All logging states can be controlled using /ctsl reinforcements: stone_tier: material: STONE diff --git a/pom.xml b/pom.xml index 39968133..0e739915 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.7 + 3.5.8 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index f2cd50aa..50479b8b 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -182,10 +182,18 @@ public static boolean shouldLogPlayerCommands() { return config.getBoolean("command_logging", false); } - public static boolean shouldLogBreaks() { + public static boolean shouldLogFriendlyBreaks() { return config.getBoolean("break_logging", false); } + public static boolean shouldLogHostileBreaks() { + return config.getBoolean("hostile_logging", false); + } + + public static boolean shouldLogDamage() { + return config.getBoolean("damage_logging", false); + } + public static boolean shouldLogReinforcement() { return config.getBoolean("reinf_logging", false); } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index c3328e2e..199e097d 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -418,10 +418,22 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc reinforcement.setDurability(durability); boolean cancelled = durability > 0; if (durability <= 0) { - cancelled = reinforcementBroken(null, reinforcement); + if (CitadelConfigManager.shouldLogHostileBreaks()) { + StringBuffer slb = new StringBuffer(); + if (player != null) { + slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) + .append("] "); + } else { + slb.append("Something "); + } + slb.append("broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") + .append(reinforcement.getLocation()); + Citadel.Log(slb.toString()); + } + cancelled = reinforcementBroken(null, reinforcement); } else { /* TODO: Move to ReinforcementEvent listener*/ - if (CitadelConfigManager.shouldLogBreaks()) { + if (CitadelConfigManager.shouldLogDamage()) { StringBuffer slb = new StringBuffer(); if (player != null) { slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) @@ -456,6 +468,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc slb.append("excellent ("); } slb.append(durability).append(") at ").append(reinforcement.getLocation()); + Citadel.Log(slb.toString()); } if (reinforcement instanceof PlayerReinforcement) { // leave message @@ -539,22 +552,19 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce return false; } StringBuffer slb = null; - if (CitadelConfigManager.shouldLogBreaks()) { + boolean logIt = CitadelConfigManager.shouldLogFriendlyBreaks() && player != null; + if (logIt) { slb = new StringBuffer(); - if (player != null) { - slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("]"); - } else { - slb.append("Something "); - } - slb.append("broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") + slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) + .append("] broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") .append(reinforcement.getLocation()); } Citadel.getReinforcementManager().deleteReinforcement(reinforcement); if (reinforcement instanceof PlayerReinforcement) { PlayerReinforcement pr = (PlayerReinforcement)reinforcement; ReinforcementType material = ReinforcementType.getReinforcementType(pr.getStackRepresentation()); - if (rng.nextDouble() <= pr.getHealth() * material.getPercentReturn()) { + // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. + if (rng.nextDouble() < pr.getHealth() * material.getPercentReturn()) { Location location = pr.getLocation(); if (player != null){ Inventory inv = player.getInventory(); @@ -579,17 +589,17 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce dropItemAtLocation(location, new ItemStack(material.getMaterial() , material.getReturnValue())); } - if (CitadelConfigManager.shouldLogBreaks()) { + if (logIt) { slb.append(" - reinf mat refunded"); Citadel.Log(slb.toString()); } - } else if (CitadelConfigManager.shouldLogBreaks()) { + } else if (logIt) { slb.append(" - reinf mat lost"); Citadel.Log(slb.toString()); } return (pr.isDoor() || pr.isContainer()); } - if (CitadelConfigManager.shouldLogBreaks()) { + if (logIt) { Citadel.Log(slb.toString()); } return false; // implicit isSecureable() == false diff --git a/src/vg/civcraft/mc/citadel/command/commands/Acid.java b/src/vg/civcraft/mc/citadel/command/commands/Acid.java index 412e998f..6f9b9a62 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Acid.java @@ -109,7 +109,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } - if (CitadelConfigManager.shouldLogBreaks()) { + if (CitadelConfigManager.shouldLogHostileBreaks()) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}", new Object[] {block.getLocation(), topFace.getType(), topFace.getLocation()}); } diff --git a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java b/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java index 9d4b4363..fe7010a0 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java +++ b/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java @@ -17,7 +17,7 @@ public SetLogging(String name) { super(name); setIdentifier("ctsl"); setDescription("Allows admins to toggle special logging types live or show current status"); - setUsage("/ctsl [internal|playercommands|breaks|reinforcements [on|off]]"); + setUsage("/ctsl [internal|playercommands|breaks|hostilebreaks|damage|reinforcements [on|off]]"); setArguments(0, 2); } @@ -43,7 +43,9 @@ public boolean execute(CommandSender sender, String[] args) { StringBuilder sb = new StringBuilder("Current deep logging set to: \n"); sb.append(" Internal: ").append(CitadelConfigManager.shouldLogInternal()).append("\n"); sb.append(" Player Command Responses: ").append(CitadelConfigManager.shouldLogPlayerCommands()).append("\n"); - sb.append(" Breaks: ").append(CitadelConfigManager.shouldLogBreaks()).append("\n"); + sb.append(" Friendly/CTB Breaks: ").append(CitadelConfigManager.shouldLogFriendlyBreaks()).append("\n"); + sb.append(" Hostile Breaks: ").append(CitadelConfigManager.shouldLogHostileBreaks()).append("\n"); + sb.append(" Damage: ").append(CitadelConfigManager.shouldLogDamage()).append("\n"); sb.append(" Reinforcements: ").append(CitadelConfigManager.shouldLogReinforcement()).append("\n"); sendAndLog(sender, ChatColor.GREEN, sb.toString()); @@ -54,13 +56,19 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length >= 1) { if ("internal".equalsIgnoreCase(args[0])) { flag = "internal_logging"; - newval = CitadelConfigManager.shouldLogInternal(); + newval = CitadelConfigManager.shouldLogInternal(); } else if ("playercommands".equalsIgnoreCase(args[0])) { flag = "command_logging"; - newval = CitadelConfigManager.shouldLogPlayerCommands(); + newval = CitadelConfigManager.shouldLogPlayerCommands(); } else if ("breaks".equalsIgnoreCase(args[0])) { flag = "break_logging"; - newval = CitadelConfigManager.shouldLogBreaks(); + newval = CitadelConfigManager.shouldLogFriendlyBreaks(); + } else if ("hostilebreaks".equalsIgnoreCase(args[0])) { + flag = "hostile_logging"; + newval = CitadelConfigManager.shouldLogHostileBreaks(); + } else if ("damage".equalsIgnoreCase(args[0])) { + flag = "damage_logging"; + newval = CitadelConfigManager.shouldLogDamage(); } else if ("reinforcements".equalsIgnoreCase(args[0])) { flag = "reinf_logging"; newval = CitadelConfigManager.shouldLogReinforcement(); @@ -76,7 +84,7 @@ public boolean execute(CommandSender sender, String[] args) { if (flag != null) { Citadel.getInstance().getConfig().set(flag, newval); - sendAndLog(sender, ChatColor.GREEN, "Flag " + newval + " is " + (newval ? "on" : "off")); + sendAndLog(sender, ChatColor.GREEN, "Flag " + flag + " is " + (newval ? "on" : "off")); return true; } else { sendAndLog(sender, ChatColor.RED, "Unknown setting!"); @@ -84,7 +92,7 @@ public boolean execute(CommandSender sender, String[] args) { } } - private static List cmds = Arrays.asList("internal","playercommands", "breaks", "reinforcements"); + private static List cmds = Arrays.asList("internal","playercommands", "hostilebreaks", "breaks", "damage", "reinforcements"); private static List flgs = Arrays.asList("on", "off"); @Override public List tabComplete(CommandSender arg0, String[] arg1) { From 3e9f9c9ac6ad8c719e7b7b142aa6b42ed23f1c89 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 11 Aug 2016 16:20:22 -0400 Subject: [PATCH 030/255] Small fix --- src/vg/civcraft/mc/citadel/Utility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 199e097d..f5bbd3e4 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -556,7 +556,7 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce if (logIt) { slb = new StringBuffer(); slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("] broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") + .append("] bypassed a ").append(reinforcement.getMaterial()).append(" reinforcement at ") .append(reinforcement.getLocation()); } Citadel.getReinforcementManager().deleteReinforcement(reinforcement); From c8f03c062681c1cc119744f1132adf0a1e1ce117 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Fri, 19 Aug 2016 10:41:27 -0400 Subject: [PATCH 031/255] Rebalance prep --- config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yml b/config.yml index dafdf7b6..07a4a038 100644 --- a/config.yml +++ b/config.yml @@ -54,7 +54,7 @@ reinforcements: requirements: 1 return: 0 percent_chance: 0 - hit_points: 750 + hit_points: 500 mature_time: 129600 acid_time: 10080 scale_amount: 1 From c9fd9dc19be5b1bffc531ecc735f005207657024 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 28 Aug 2016 23:13:00 +0200 Subject: [PATCH 032/255] Allow changing reinforcement type without breaking block --- pom.xml | 2 +- .../events/ReinforcementChangeTypeEvent.java | 64 +++++++++++++++++++ .../mc/citadel/listener/BlockListener.java | 36 +++++++++-- .../reinforcement/PlayerReinforcement.java | 2 +- 4 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java diff --git a/pom.xml b/pom.xml index 0e739915..4937b55d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.5.8 + 3.5.9 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java new file mode 100644 index 00000000..ee11d8a5 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java @@ -0,0 +1,64 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; + +public class ReinforcementChangeTypeEvent extends Event implements Cancellable{ + private static final HandlerList handlers = new HandlerList(); + + private Reinforcement rein; + private ReinforcementType newType; + private Player player; + + private boolean isCancelled = false; + + public ReinforcementChangeTypeEvent(Reinforcement rein, ReinforcementType newType, Player p){ + this.rein = rein; + this.newType = newType; + this.player = p; + } + /** + * Gets the Reinforcement that was just modified. + * @return Returns the Reinforcement. + */ + public Reinforcement getReinforcement(){ + return rein; + } + /** + * + * @return Future reinforcement type + */ + public ReinforcementType getNewType(){ + return newType; + } + /** + * @return Returns the Player that modified the Reinforcement. + */ + public Player getPlayer(){ + return player; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean value) { + isCancelled = value; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 7552b289..95fe6b2f 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -52,6 +52,7 @@ import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; @@ -127,7 +128,7 @@ public void onFortificationMode(BlockPlaceEvent event){ } String gName = gm.getDefaultGroup(p.getUniqueId()); if (gName != null) { - groupToReinforceTo = gm.getGroup(gName); + groupToReinforceTo = GroupManager.getGroup(gName); } if (groupToReinforceTo == null) { return; @@ -483,7 +484,7 @@ public void interact(PlayerInteractEvent pie) { String gName = gm.getDefaultGroup(player.getUniqueId()); Group g = null; if (gName != null) { - g = gm.getGroup(gName); + g = GroupManager.getGroup(gName); } if (g != null) { try { @@ -613,7 +614,7 @@ public void interact(PlayerInteractEvent pie) { if (reinforcement == null) { // set the reinforcemet material to what the player is // holding - ItemStack stack = player.getItemInHand(); + ItemStack stack = player.getInventory().getItemInMainHand(); ReinforcementType type = ReinforcementType .getReinforcementType(stack); if (type == null) { @@ -669,8 +670,35 @@ public void interact(PlayerInteractEvent pie) { message = "Group has been changed to: " + group.getName() + "."; sendAndLog(player, ChatColor.GREEN, message); - } else + } else { reinforcement.setGroup(old_group); + } + } + ItemStack stack = player.getInventory().getItemInMainHand(); + ReinforcementType type = ReinforcementType.getReinforcementType(stack); + if (type != null && !reinforcement.getStackRepresentation().isSimilar(type.getItemStack())) { + //hit with different rein material, so switch material + if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), block.getType())) { + sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + } + else { + ReinforcementChangeTypeEvent e = new ReinforcementChangeTypeEvent(reinforcement, type, player); + Bukkit.getPluginManager().callEvent(e); + if (!e.isCancelled()) { + reinforcementBroken(player, reinforcement); + ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); + Bukkit.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + try { + createPlayerReinforcement(player, state.getGroup(), block, type, null); + sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); + } catch (ReinforcemnetFortificationCancelException ex) { + Citadel.getInstance().getLogger().log(Level.WARNING, + "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", ex); + } + } + } + } } } else { sendAndLog(player, ChatColor.RED, diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index 7c0e2fac..29aca7c3 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -225,7 +225,7 @@ private void checkValid(){ return; } if (!g.isValid()){ // incase it was recently merged/ deleted. - g = NameAPI.getGroupManager().getGroup(g.getGroupId()); + g = GroupManager.getGroup(g.getGroupId()); if (g == null) { Citadel.getInstance().getLogger().log(Level.INFO, "Group " + g.getGroupId() + " was deleted or merged but not marked invalid!"); } From 6234684af1631d6f93bf4f204ae62c3d580da78e Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 7 Sep 2016 07:07:41 +0200 Subject: [PATCH 033/255] Increment CivModCore version to rebuild against latest inventory API --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4937b55d..5d3e1b5f 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.3.2 + 1.4.50 provided From 622c48fa19d1113f9d92652b0efa196819b35a4f Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 12 Sep 2016 15:43:44 +0200 Subject: [PATCH 034/255] Disable entity reinforcing for now --- .../mc/citadel/listener/EntityListener.java | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index aaf48a60..6211c5e2 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -151,10 +151,17 @@ public void playerQuitEvent(PlayerQuitEvent event){ } - @EventHandler(priority = EventPriority.HIGHEST) + //@EventHandler(priority = EventPriority.HIGHEST) public void hangingPlaceEvent(HangingPlaceEvent event){ Player p = event.getPlayer(); Block b = event.getBlock().getRelative(event.getBlockFace()); + if (rm.getReinforcement(b) != null) { + //reinforcement already exists in this location from an actual physical block, so we dont want to allow entity reinforcements here. + //We even dont want to allow placement here as otherwise we would have no way to tell whether the actual underlying block or the entitiy + //"owns" the reinforcement + event.setCancelled(true); + return; + } Inventory inv = p.getInventory(); PlayerState state = PlayerState.get(p); if (ReinforcementMode.REINFORCEMENT_FORTIFICATION != state.getMode()) { @@ -173,12 +180,12 @@ public void hangingPlaceEvent(HangingPlaceEvent event){ return; } int required = type.getRequiredAmount(); - if (type.getItemStack().isSimilar(p.getItemInHand())){ + if (type.getItemStack().isSimilar(p.getInventory().getItemInMainHand())){ required++; } if (inv.containsAtLeast(type.getItemStack(), required)) { try { - if (createPlayerReinforcement(p, state.getGroup(), b, type, p.getItemInHand()) == null) { + if (createPlayerReinforcement(p, state.getGroup(), b, type, p.getInventory().getItemInMainHand()) == null) { sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); } else { state.checkResetMode(); @@ -194,7 +201,7 @@ public void hangingPlaceEvent(HangingPlaceEvent event){ } } - @EventHandler(priority = EventPriority.HIGHEST) + //@EventHandler(priority = EventPriority.HIGHEST) public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ Reinforcement rein = rm.getReinforcement(event.getEntity().getLocation()); if (rein == null){return;} if (RemoveCause.PHYSICS.equals(event.getCause())){ @@ -217,7 +224,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ PlayerReinforcement pr = (PlayerReinforcement) rein; PlayerState state = PlayerState.get(player); ReinforcementMode mode = state.getMode(); - if (ReinforcementMode.REINFORCEMENT_INFORMATION.equals(mode)){ + if (ReinforcementMode.REINFORCEMENT_INFORMATION == mode){ Group group = pr.getGroup(); StringBuilder sb; if (player.hasPermission("citadel.admin.ctinfodetails")) { @@ -304,22 +311,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ } } - @EventHandler(priority = EventPriority.HIGHEST) - public void hangingBreakEvent(HangingBreakEvent event){ - Reinforcement rein = rm.getReinforcement(event.getEntity().getLocation()); if (rein == null){return;} - if (RemoveCause.PHYSICS.equals(event.getCause())){ - //Checks if block entity was attached to was broken - if (event.getEntity().getLocation().getBlock().getRelative( - event.getEntity().getAttachedFace()).getType().equals(Material.AIR)){ - //Comment out these next two lines to keep floating hanging entities if they are reinforced - rm.deleteReinforcement(rein); - return; - } - } - event.setCancelled(true); - } - - @EventHandler(priority = EventPriority.HIGHEST) + //@EventHandler(priority = EventPriority.HIGHEST) public void playerEntityInteractEvent(PlayerInteractEntityEvent event){ Entity entity = event.getRightClicked(); if (entity instanceof ItemFrame){ @@ -336,7 +328,7 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event){ } } - @EventHandler(priority = EventPriority.HIGHEST) + //@EventHandler(priority = EventPriority.HIGHEST) public void entityDamageEvent(EntityDamageByEntityEvent event){ Entity entity = event.getEntity(); if (entity instanceof ItemFrame){ From 6247e3852db09819e1260d58db952ba3fc61be45 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 17 Sep 2016 17:26:16 +0200 Subject: [PATCH 035/255] Fix reinforceable material exclusion Conflicts: pom.xml --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/Citadel.java | 2 - .../mc/citadel/CitadelConfigManager.java | 1 + .../command/commands/AreaReinforce.java | 3 +- .../mc/citadel/listener/BlockListener.java | 7 +-- .../ExclusiveReinforcementType.java | 56 ------------------- .../reinforcementtypes/ReinforcementType.java | 35 +++++++++++- 7 files changed, 38 insertions(+), 68 deletions(-) delete mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java diff --git a/pom.xml b/pom.xml index 398836e1..4abee4ae 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.6.0 + 3.6.1 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 2b951b90..978419b5 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -20,7 +20,6 @@ import vg.civcraft.mc.citadel.listener.ShardListener; import vg.civcraft.mc.citadel.listener.WorldListener; import vg.civcraft.mc.citadel.misc.CitadelStatics; -import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -50,7 +49,6 @@ public void onEnable(){ ReinforcementType.initializeReinforcementTypes(); NaturalReinforcementType.initializeNaturalReinforcementsTypes(); NonReinforceableType.initializeNonReinforceableTypes(); - ExclusiveReinforcementType.initializeExclusiveReinforcementTypes(); initializeDatabase(); rm = new ReinforcementManager(db); diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 50479b8b..4129971b 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -1,6 +1,7 @@ package vg.civcraft.mc.citadel; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.logging.Level; diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java index 7175954b..458aa8a9 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java @@ -15,7 +15,6 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -96,7 +95,7 @@ public boolean execute(CommandSender sender, String[] args) { .getBlockAt(x, y, z)); if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) && !Utility.wouldPlantDoubleReinforce(current)) { - if (!ExclusiveReinforcementType.canReinforce(rt.getMaterial(), current.getType())) { + if (!rt.canBeReinforced(current.getType())) { sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + " was not reinforced because the material type you are using cannot reinforce that type of block."); continue; diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 95fe6b2f..d8519652 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -58,7 +58,6 @@ import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ExclusiveReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -150,7 +149,7 @@ public void onFortificationMode(BlockPlaceEvent event){ return; } // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), b.getType())) { + if (!type.canBeReinforced(b.getType())) { sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); event.setCancelled(true); return; @@ -626,7 +625,7 @@ public void interact(PlayerInteractEvent pie) { return; } // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), block.getType())) { + if (!type.canBeReinforced(block.getType())) { sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); state.reset(); @@ -678,7 +677,7 @@ public void interact(PlayerInteractEvent pie) { ReinforcementType type = ReinforcementType.getReinforcementType(stack); if (type != null && !reinforcement.getStackRepresentation().isSimilar(type.getItemStack())) { //hit with different rein material, so switch material - if (!ExclusiveReinforcementType.canReinforce(type.getMaterial(), block.getType())) { + if (!type.canBeReinforced(block.getType())) { sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); } else { diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java deleted file mode 100644 index ee2eac60..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ExclusiveReinforcementType.java +++ /dev/null @@ -1,56 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcementtypes; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.bukkit.Material; - -import vg.civcraft.mc.citadel.CitadelConfigManager; - -//An ExclusiveReinforcementType is a reinforcement type that can only reinforce certain blocks -//For example, maybe you want players to be able to reinforce chests with emeralds, -//but unable to reinforce obsidian with emeralds -public class ExclusiveReinforcementType { - - public static Map> mats = new HashMap>(); - - public static void initializeExclusiveReinforcementTypes() { - for(String reinforcementType : CitadelConfigManager.getReinforcementTypes()) { - Material mat = CitadelConfigManager.getMaterial(reinforcementType); - List canReinforceNames = CitadelConfigManager.getReinforceableMaterials(reinforcementType); - if(canReinforceNames == null) { - continue; - } - List canReinforce = new ArrayList(); - for(String s : canReinforceNames) { - canReinforce.add(Material.getMaterial(s)); - } - //Check if the reinforcement type is meant to be exclusive - if(!canReinforce.isEmpty()) { - mats.put(mat, canReinforce); - } - } - } - - public static boolean isExclusive(Material mat) { - return mats.containsKey(mat); - } - - public static List getReinforceableMaterials(Material mat) { - return mats.get(mat); - } - - /** - * Returns whether or not a given material can be used to reinforce another material - * @param The material to reinforce with - * @param The material to be reinforced - */ - public static boolean canReinforce(Material reinforcer, Material reinforcee) { - if(!isExclusive(reinforcer)) { - return true; - } - return mats.get(reinforcer).contains(reinforcee); - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index e3924d3a..e5f8f3e8 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -2,8 +2,10 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.logging.Level; import org.bukkit.Material; @@ -25,13 +27,14 @@ public class ReinforcementType { private int scale; private ItemStack stack; private ReinforcementEffect effect; + private Set allowedReinforceables; private static Map types = new HashMap(); public ReinforcementType(Material mat, int amount, double percentReturn, int returnValue, int hitpoints, int maturationTime, int acidTime, - int scale, List lore, ReinforcementEffect effect) { + int scale, List lore, ReinforcementEffect effect, Set allowsReinforceables) { this.mat = mat; this.amount = amount; this.percentReturn = percentReturn/100; @@ -47,6 +50,7 @@ public ReinforcementType(Material mat, int amount, double percentReturn, stack.setItemMeta(meta); this.stack = stack; types.put(stack, this); + this.allowedReinforceables = allowsReinforceables; } public static void initializeReinforcementTypes(){ @@ -62,8 +66,25 @@ public static void initializeReinforcementTypes(){ int maturation_scale = CitadelConfigManager.getMaturationScale(type); List lore = CitadelConfigManager.getLoreValues(type); ReinforcementEffect effect = CitadelConfigManager.getReinforcementEffect(type); + List reinforceableMatString = CitadelConfigManager.getReinforceableMaterials(type); + Set reinforceableMats; + if (reinforceableMatString.size() == 0) { + reinforceableMats = null; + } + else { + reinforceableMats = new HashSet(); + for(String s : reinforceableMatString) { + try { + Material reinmat = Material.valueOf(s); + reinforceableMats.add(reinmat); + } + catch (IllegalArgumentException e) { + Citadel.getInstance().getLogger().warning("The specified reinforceable material " + s + " could not be parsed"); + } + } + } new ReinforcementType(mat, amount, percentReturn, returnValue, - hitpoints, maturation, acid, maturation_scale, lore, effect); + hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats); if (CitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.INFO, "Adding Reinforcement {0} with:\n material {1} \n amount {2} " @@ -136,8 +157,9 @@ public ReinforcementEffect getReinforcementEffect(){ */ public static ReinforcementType getReinforcementType(ItemStack stack){ for (ItemStack storedStack: types.keySet()) - if (storedStack.isSimilar(stack)) + if (storedStack.isSimilar(stack)) { return types.get(storedStack); + } return null; } /** @@ -147,6 +169,13 @@ public ItemStack getItemStack(){ return stack; } + public boolean canBeReinforced(Material mat) { + if (allowedReinforceables == null) { + return true; + } + return allowedReinforceables.contains(mat); + } + public static List getReinforcementTypes(){ List type = new ArrayList(); type.addAll(types.values()); From 8dadbb79b3a61fde63db958936056ac84841f8c7 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 17 Sep 2016 17:40:15 +0200 Subject: [PATCH 036/255] Add exclusion material for reinforcement type --- .../mc/citadel/CitadelConfigManager.java | 28 +++++++++++++++ .../reinforcementtypes/ReinforcementType.java | 35 ++++++++----------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 4129971b..cd09c239 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.logging.Level; import org.bukkit.Effect; @@ -32,6 +33,13 @@ public static List getReinforceableMaterials(String mat){ return null; } + public static List getNonReinforceableMaterials(String mat){ + if(config.getConfigurationSection("reinforcements." + mat).contains("non_reinforceables")) { + return config.getConfigurationSection("reinforcements." + mat).getStringList("non_reinforceables"); + } + return null; + } + public static List getNaturalReinforcementTypes(){ List naturalReinforcementTypes = new ArrayList(); if (config.getConfigurationSection("natural_reinforcements") == null) @@ -206,4 +214,24 @@ public static boolean showHealthAsPercent(){ public static boolean defaultBypassOn() { return config.getBoolean("default_bypass_mode"); } + + public static Set parseMaterialList(List stringList) { + Set reinforceableMats; + if (stringList == null || stringList.size() == 0) { + reinforceableMats = null; + } + else { + reinforceableMats = new HashSet(); + for(String s : stringList) { + try { + Material reinmat = Material.valueOf(s); + reinforceableMats.add(reinmat); + } + catch (IllegalArgumentException e) { + Citadel.getInstance().getLogger().warning("The specified reinforceable material " + s + " could not be parsed"); + } + } + } + return reinforceableMats; + } } diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index e5f8f3e8..4e9c2724 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -28,13 +27,15 @@ public class ReinforcementType { private ItemStack stack; private ReinforcementEffect effect; private Set allowedReinforceables; + private Set disallowedReinforceables; private static Map types = new HashMap(); public ReinforcementType(Material mat, int amount, double percentReturn, int returnValue, int hitpoints, int maturationTime, int acidTime, - int scale, List lore, ReinforcementEffect effect, Set allowsReinforceables) { + int scale, List lore, ReinforcementEffect effect, Set allowsReinforceables, + Set disallowedReinforceables) { this.mat = mat; this.amount = amount; this.percentReturn = percentReturn/100; @@ -51,6 +52,7 @@ public ReinforcementType(Material mat, int amount, double percentReturn, this.stack = stack; types.put(stack, this); this.allowedReinforceables = allowsReinforceables; + this.disallowedReinforceables = disallowedReinforceables; } public static void initializeReinforcementTypes(){ @@ -67,24 +69,11 @@ public static void initializeReinforcementTypes(){ List lore = CitadelConfigManager.getLoreValues(type); ReinforcementEffect effect = CitadelConfigManager.getReinforcementEffect(type); List reinforceableMatString = CitadelConfigManager.getReinforceableMaterials(type); - Set reinforceableMats; - if (reinforceableMatString.size() == 0) { - reinforceableMats = null; - } - else { - reinforceableMats = new HashSet(); - for(String s : reinforceableMatString) { - try { - Material reinmat = Material.valueOf(s); - reinforceableMats.add(reinmat); - } - catch (IllegalArgumentException e) { - Citadel.getInstance().getLogger().warning("The specified reinforceable material " + s + " could not be parsed"); - } - } - } + Set reinforceableMats = CitadelConfigManager.parseMaterialList(reinforceableMatString); + List unreinforceableMatString = CitadelConfigManager.getNonReinforceableMaterials(type); + Set nonReinforceableMats = CitadelConfigManager.parseMaterialList(unreinforceableMatString); new ReinforcementType(mat, amount, percentReturn, returnValue, - hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats); + hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats, nonReinforceableMats); if (CitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.INFO, "Adding Reinforcement {0} with:\n material {1} \n amount {2} " @@ -95,6 +84,7 @@ public static void initializeReinforcementTypes(){ } } } + /** * @return Returns the Material associated with this ReinforcementType. */ @@ -171,7 +161,12 @@ public ItemStack getItemStack(){ public boolean canBeReinforced(Material mat) { if (allowedReinforceables == null) { - return true; + if (disallowedReinforceables == null || !disallowedReinforceables.contains(mat)) { + return true; + } + else { + return false; + } } return allowedReinforceables.contains(mat); } From 005a93c70f59faf1d6978c46fb2c22bbb50974eb Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 21 Sep 2016 01:45:36 +0200 Subject: [PATCH 037/255] Easy mode reinforcements respect material specific excluding Conflicts: pom.xml --- pom.xml | 2 +- .../mc/citadel/listener/BlockListener.java | 51 +++++++++++-------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 4abee4ae..c3135592 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.6.1 + 3.6.2 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index d8519652..6c6f2061 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -475,27 +475,36 @@ public void interact(PlayerInteractEvent pie) { ReinforcementType type = ReinforcementType .getReinforcementType(stack); if (type != null) { - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(block)) { - sendAndLog(player, ChatColor.RED, - "Cancelled reinforcement, crop would already be reinforced."); - } else { - String gName = gm.getDefaultGroup(player.getUniqueId()); - Group g = null; - if (gName != null) { - g = GroupManager.getGroup(gName); - } - if (g != null) { - try { - createPlayerReinforcement(player, g, - block, type, null); - } catch (ReinforcemnetFortificationCancelException e) { - Citadel.getInstance() - .getLogger() - .log(Level.WARNING, - "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", - e); - } + // Don't allow double reinforcing reinforceable plants + if (wouldPlantDoubleReinforce(block)) { + sendAndLog(player, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); + return; + } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!type.canBeReinforced(block.getType())) { + sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + return; + } + if (!canPlace(block, player)){ + sendAndLog(player, ChatColor.RED, "Cancelled interact easymode rein, mismatched reinforcement."); + return; + } + + String gName = gm.getDefaultGroup(player.getUniqueId()); + Group g = null; + if (gName != null) { + g = GroupManager.getGroup(gName); + } + if (g != null) { + try { + createPlayerReinforcement(player, g, + block, type, null); + } catch (ReinforcemnetFortificationCancelException e) { + Citadel.getInstance() + .getLogger() + .log(Level.WARNING, + "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", + e); } } } From 4f6e78c9cecb0000b4892884107cdae1f1fc21df Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 5 Oct 2016 03:28:47 -0400 Subject: [PATCH 038/255] Refactored Database to be ManagedDatasource compliant. Untested. Beginning design for batched inserts of reinfs. --- pom.xml | 4 +- .../mc/citadel/ReinforcementManager.java | 15 + .../database/CitadelReinforcementData.java | 905 ++++++++++-------- 3 files changed, 522 insertions(+), 402 deletions(-) diff --git a/pom.xml b/pom.xml index c3135592..d44f432d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.6.2 + 3.7.0 Citadel https://github.com/Civcraft/Citadel @@ -46,7 +46,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.5.0 + 1.5.02 provided diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 28584386..82b33e1b 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -25,6 +25,19 @@ public class ReinforcementManager { + // TODO : Batching of inserts, saves, and deletes. + // Thinking: + // Second layer cache. Situation exists where a reinf is scheduled for + // real save (in queue) but batch isn't executed. + // So a cache load miss should read from this queue first; if no match, + // then DB load. + // Given architecture at present, this cache needs to be more persistent then top cache, and + // clear atomically into batched inserts, updates, and deletes. + // Idea would be that since we've disambiguated final outcome "state" in the dirty-cache, + // we are clear to batch all operations of like-kind as there will be no overlap. + // Meanwhile, a new dirty cache will begin accumulating. + + private CitadelReinforcementData db; private long dayMultiplier; @@ -56,6 +69,7 @@ public Reinforcement load(Location loc) throws Exception { return new NullReinforcement(loc); } CitadelStatics.updateHitStat(CitadelStatics.LOAD); + // TODO: count misses in a chunk, and fucking load the whole chunk if we cross a threshold. // decrement cache because it gets increased from getReinforcement() CitadelStatics.decrementHitStat(CitadelStatics.CACHE); return rein; @@ -279,6 +293,7 @@ public List getReinforcementsByChunk(Chunk chunk){ return reins_new; } + // TODO how tf is this not used, mfw public void loadReinforcementChunk(Chunk chunk) { if (chunk == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager loadReinforcementChunk called with null"); diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index df783364..2b57b1ce 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -1,14 +1,19 @@ package vg.civcraft.mc.citadel.database; +import java.sql.CallableStatement; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.concurrent.Callable; import java.util.logging.Level; +import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Chunk; @@ -23,65 +28,97 @@ import vg.civcraft.mc.citadel.reinforcement.NaturalReinforcement; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.group.Group; public class CitadelReinforcementData { - private Database db; + private ManagedDatasource db; private Citadel plugin = Citadel.getInstance(); - public CitadelReinforcementData(Database db){ + private Logger logger = plugin.getLogger(); + + private static final String getRein = "select r.material_id, r.durability, " + + "r.insecure, r.maturation_time, r.acid_time, rt.rein_type, " + + "r.lore, r.group_id, r.rein_id from reinforcement r " + + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " + + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " + + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.chunk_id = ? and ri.world = ?"; + private static final String getReins = "select ri.x, ri.y, ri.z, ri.world, r.material_id, r.durability, " + + "r.insecure, r.maturation_time, rt.rein_type, " + + "r.lore, r.group_id, r.rein_id, r.acid_time from reinforcement r " + + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " + + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " + + "where ri.chunk_id = ?"; + private static final String addRein = "insert into reinforcement (" + + "material_id, durability, " + + "insecure, group_id, maturation_time, rein_type_id," + + "lore, rein_id, acid_time) select ?, ?, ?, ?, ?, rt.rein_type_id, ?, ?, ? " + + "from reinforcement_type rt where rt.rein_type = ?"; + private static final String removeRein = "delete r.*, ri.* from reinforcement r " + + "left join reinforcement_id ri on r.rein_id = ri.rein_id " + + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world = ?"; + private static final String updateRein = "update reinforcement r " + + "inner join reinforcement_id ri on ri.rein_id = r.rein_id " + + "set r.durability = ?, r.insecure = ?, r.group_id = ?, " + + "maturation_time = ?, acid_time = ? " + + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world =?"; + + private static final String insertReinID = "call insertReinID(?,?,?,?,?)"; + private static final String insertCustomReinID = "call insertCustomReinID(?,?,?,?,?,?)"; + private static final String insertReinFully = "call insertRein(?,?,?,?,?,?,?,?,?,?,?,?,?)"; + private static final String getCordsbyReinID = "select x, y, z, world from reinforcement_id where rein_id = ?"; + private static final String selectReinCountForGroup = "select count(*) as count from reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; + private static final String selectReinCount = "select count(*) as count from reinforcement r"; + + + public CitadelReinforcementData(ManagedDatasource db){ this.db = db; - if (db.connect()){ - initalizePreparedStatements(); - createTables(); - intitializeProcedures(); + + if (!db.isManaged()) { + // First "migration" is conversion from old system to new + boolean isNew = true; + try (Connection connection = db.getConnection(); + PreparedStatement checkNewInstall = connection.prepareStatement("SELECT * FROM db_version LIMIT 1;"); + // See if this was a new install. If it was, db_version statement will fail. If it isn't, it'll succeed. + // If the version statement fails, return true; this is new install, carryon. + ResultSet rs = checkNewInstall.executeQuery();) { + isNew = !rs.next(); + } catch (SQLException se) { + logger.log(Level.INFO, "New installation: Welcome to Citadel!"); + } + + if (!isNew) { + try (Connection connection = db.getConnection(); + PreparedStatement migrateInstall = connection.prepareStatement( + "INSERT INTO managed_plugin_data (plugin_name, current_migration_number, last_migration)" + + " SELECT plugin_name, str_to_date(update_time, '%Y-%m-%d %H:%i:%s' ), version FROM db_version WHERE plugin_name = '" + + plugin.getName() + "' LIMIT 1;");) { + int rows = migrateInstall.executeUpdate(); + if (rows == 1) { + logger.log(Level.INFO, "Migration successful!"); + } else { + Bukkit.shutdown(); + logger.log(Level.SEVERE, "Migration failed; db_version exists but uncaptured. Could be version problem."); + return; + } + } catch (SQLException se) { + Bukkit.shutdown(); + // Migration failed... + logger.log(Level.SEVERE, "Migration failure!"); + return; + } + } + } else { + logger.log(Level.INFO, "Still at it, eh?"); } - } - private void intitializeProcedures(){ - db.execute("drop procedure if exists insertReinID;"); - db.execute("create definer=current_user procedure insertReinID(" + - "in x int," - + "in y int," - + "in z int," - + "in chunk_id varchar(255)," - + "in world varchar(255)" + - ") sql security invoker begin " - + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" - + "end;"); - db.execute("drop procedure if exists insertCustomReinID;"); - db.execute("create definer=current_user procedure insertCustomReinID(" - + "in rein_id int," + - "in x int," - + "in y int," - + "in z int," - + "in chunk_id varchar(255)," - + "in world varchar(255)" + - ") sql security invoker begin " - + "insert into reinforcement_id(rein_id, x, y, z, chunk_id, world) values (rein_id, x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" - + "end;"); } - /** - * Creates the required mysql tables and updates the db if needed. - */ - private void createTables(){ - int ver = checkVersion(plugin.getName()); - long begin_time = System.currentTimeMillis(); - db.execute("create table if not exists db_version (db_version int not null," + - "update_time varchar(24)," - + "plugin_name varchar(40));"); - if (ver == 0){ - db.execute(String.format("update db_version set plugin_name = '%s' " + - "where plugin_name is null", plugin.getName())); - ver = checkVersion(plugin.getName()); - if (ver == 0){ - Citadel.Log("Creating tables from scratch, this is a new " + - "instance of citadel."); - } - else{ + + public void registerMigrations() { + /* Multipath migration is bad, mmmkay? + * This is super legacy, just keeping it here as a nod to the past. Citadel.Log("Detected previous version of Citadel, " + "updating to new db.\n" + "You should have backed up your data, " + @@ -102,12 +139,32 @@ private void createTables(){ + "add lore varchar(255);"); db.execute("drop table citadel_account_id_map;"); Citadel.Log("The update to new format took " + (System.currentTimeMillis() - first_time) / 1000 + " seconds."); - } - } - if (ver == 5 || ver == 0){ - long first_time = System.currentTimeMillis(); - Citadel.Log("Updating to Citadel Version 6."); - db.execute("create table if not exists reinforcement(" + + */ + + db.registerMigration(6, false, + new Callable () { + @Override + public Boolean call() throws Exception { + String[] types = {"PlayerReinforcement", "NaturalReinforcement", "MultiBlockReinforcement"}; + try (Connection connection = db.getConnection(); + PreparedStatement dotypes = connection.prepareStatement("insert into reinforcement_type(rein_type) values (?);")) { + for (String x: types) { + dotypes.setString(1, x); + dotypes.addBatch(); + } + int[] rez = dotypes.executeBatch(); + if (rez.length == types.length) { + return true; + } else { + logger.log(Level.SEVERE, "Failed to insert reinforcement types."); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "Failed to insert reinforcement types.", e); + } + return null; + } + }, + "create table if not exists reinforcement(" + "x int not null," + "y int not null," + "z int not null," + @@ -120,24 +177,12 @@ private void createTables(){ "maturation_time int not null," + "rein_type_id int not null," + "lore varchar(255)," - + "primary key (x,y,z,world));"); - db.execute("create table if not exists reinforcement_type(" + + "primary key (x,y,z,world));", + "create table if not exists reinforcement_type(" + "rein_type_id int not null auto_increment," + "rein_type varchar(30) not null," + "primary key rein_type_key (rein_type_id));"); - String[] types = {"PlayerReinforcement", "NaturalReinforcement", "MultiBlockReinforcement"}; - for (String x: types) { - db.execute(String.format("insert into reinforcement_type(rein_type)" - + "values('%s');", x)); - } - updateVersion(5, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 6 took " + (System.currentTimeMillis() - first_time) / 1000 + " seconds."); - } - if (ver == 6){ - long first_time = System.currentTimeMillis(); - Citadel.Log("Updating to version 7. No fun message for you :("); - db.execute("create table if not exists reinforcement_id(" + db.registerMigration(7, false, "create table if not exists reinforcement_id(" + "rein_id int not null auto_increment," + "x int not null," + "y int not null," @@ -145,147 +190,73 @@ private void createTables(){ + "chunk_id varchar(255)," + "world varchar (255) not null," + "primary key rein_id_key (rein_id)," - + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos"); - // I like turtles mother fucker. Never program because then you get turtles. - db.execute("insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;"); // populate that bitch. - db.execute("alter table reinforcement add rein_id int not null, drop chunk_id;"); - db.execute("update reinforcement r inner join reinforcement_id ri on " + + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", + // I like turtles mother fucker. Never program because then you get turtles. + "insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;", // populate that bitch. + "alter table reinforcement add rein_id int not null, drop chunk_id;", + "update reinforcement r inner join reinforcement_id ri on " + "ri.x = r.x and ri.y = r.y and ri.z = r.z and ri.world = r.world " - + "set r.rein_id = ri.rein_id"); - db.execute("alter table reinforcement DROP PRIMARY KEY, " + + "set r.rein_id = ri.rein_id", + "alter table reinforcement DROP PRIMARY KEY, " + "add primary key rein_id_key(rein_id), " + "drop x," + "drop y," + "drop z," - + "drop world;"); - db.execute("alter table reinforcement_id add index `chunk_id_index` (chunk_id);"); - updateVersion(ver, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 7 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); - } - if (ver == 7){ - long first_time = System.currentTimeMillis(); - db.execute("alter table reinforcement_id drop primary key," + + "drop world;", + "alter table reinforcement_id add index `chunk_id_index` (chunk_id);"); + db.registerMigration(8, false, "alter table reinforcement_id drop primary key," + " add primary key (rein_id, x, y, z, world);"); - updateVersion(ver, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 8 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); - } - if (ver == 8) { - long first_time = System.currentTimeMillis(); - Citadel.Log("Updating to version 9: The acid test. Note: This will take a while."); - db.execute("alter table reinforcement add acid_time int not null;"); - db.execute("update reinforcement set acid_time = maturation_time;"); // Might take a minute. - updateVersion(ver, plugin.getName()); - ver = checkVersion(plugin.getName()); - Citadel.Log("The update to Version 9 took " + (System.currentTimeMillis() / first_time) / 1000 + " seconds."); - } - Citadel.Log("The total time it took Citadel to update was " + - (System.currentTimeMillis() - begin_time) / 1000 + " seconds."); - } - /** - * Reconnects and reinitializes the mysql connection and preparedstatements. - */ - private void reconnectAndReinitialize(){ - if (db.isConnected()) { - return; - } - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.Log("Database went away, reconnecting."); - } - db.connect(); - initalizePreparedStatements(); - } - - private String version, updateVersion; - private String getRein, getReins, addRein, removeRein, updateRein; - //private PreparedStatement deleteGroup, insertDeleteGroup, removeDeleteGroup, getDeleteGroup; - private String insertReinID, insertCustomReinID, getCordsbyReinID, selectReinCountForGroup, selectReinCount; - /** - * Initializes the PreparedStatements. Gets called on db connect or - * reconnect. - */ - private void initalizePreparedStatements(){ - getRein = "select r.material_id, r.durability, " + - "r.insecure, r.maturation_time, r.acid_time, rt.rein_type, " - + "r.lore, r.group_id, r.rein_id from reinforcement r " - + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " - + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.chunk_id = ? and ri.world = ?"; - getReins = "select ri.x, ri.y, ri.z, ri.world, r.material_id, r.durability, " + - "r.insecure, r.maturation_time, rt.rein_type, " - + "r.lore, r.group_id, r.rein_id, r.acid_time from reinforcement r " - + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " - + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " - + "where ri.chunk_id = ?"; - addRein = "insert into reinforcement (" - + "material_id, durability, " - + "insecure, group_id, maturation_time, rein_type_id," - + "lore, rein_id, acid_time) select ?, ?, ?, ?, ?, rt.rein_type_id, ?, ?, ? " - + "from reinforcement_type rt where rt.rein_type = ?"; - removeRein = "delete r.*, ri.* from reinforcement r " - + "left join reinforcement_id ri on r.rein_id = ri.rein_id " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world = ?"; - updateRein = "update reinforcement r " - + "inner join reinforcement_id ri on ri.rein_id = r.rein_id " - + "set r.durability = ?, r.insecure = ?, r.group_id = ?, " - + "maturation_time = ?, acid_time = ? " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world =?"; - insertReinID = "call insertReinID(?,?,?,?,?)"; - insertCustomReinID = "call insertCustomReinID(?,?,?,?,?,?)"; - getCordsbyReinID = "select x, y, z, world from reinforcement_id where rein_id = ?"; - selectReinCountForGroup = "select count(*) as count from reinforcement r " - + "inner join faction_id f on f.group_id = r.group_id " - + "where f.group_name = ?"; - selectReinCount = "select count(*) as count from reinforcement r"; - - version = "select max(db_version) as db_version from db_version where plugin_name=?"; - updateVersion = "insert into db_version (db_version, update_time, plugin_name) values (?,?,?)"; - } - - /** - * Checks the version of a specific plugin's db. - * @param name- The name of the plugin. - * @return Returns the version of the plugin or 0 if none was found. - */ - public int checkVersion(String name){ - reconnectAndReinitialize(); - PreparedStatement version = db.prepareStatement(this.version); - try { - version.setString(1, name); - ResultSet set = version.executeQuery(); - if (!set.next()) - return 0; - return set.getInt("db_version"); - } catch (SQLException e) { - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Version control table missing for Citadel!", e); - } - return 0; - } + db.registerMigration(9, false, "alter table reinforcement add acid_time int not null;", + "update reinforcement set acid_time = maturation_time;"); // Might take a minute. + db.registerMigration(10, false, "drop procedure if exists insertReinID;", + "create definer=current_user procedure insertReinID(" + + "in x int," + + "in y int," + + "in z int," + + "in chunk_id varchar(255)," + + "in world varchar(255)" + + ") sql security invoker begin " + + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" + + "select LAST_INSERT_ID() as id;" + + "end;", + "drop procedure if exists insertCustomReinID;", + "create definer=current_user procedure insertCustomReinID(" + + "in rein_id int," + + "in x int," + + "in y int," + + "in z int," + + "in chunk_id varchar(255)," + + "in world varchar(255)" + + ") sql security invoker begin " + + "insert into reinforcement_id(rein_id, x, y, z, chunk_id, world) values (rein_id, x, y, z, chunk_id, world);" + + "select LAST_INSERT_ID() as id;" + + "end;"); + db.registerMigration(11, false, "drop procedure if exists insertRein;", + "create definer=current_user procedure insertRein(" + + "in x int," + + "in y int," + + "in z int," + + "in chunk_id varchar(255)," + + "in world varchar(255)" + + "in material_id int," + + "in durability varchar(10)," + + "in insecure tinyint(1)," + + "in group_id int," + + "in maturation_time int," + + "in lore varchar(255)," + + "in acid_time int," + + "in rein_type varchar(30)" + + ") sql security invoker begin " + + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" + + "select LAST_INSERT_ID() as id;" + + "insert into reinforcement (" + + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, rein_id, acid_time) VALUES (" + + "material_id, durability, insecure, group_id, maturation_time, " + + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " + + "lore, id, acid_time);" + + "end;"); } - /** - * Updates the version number for a plugin. You must specify what - * the current version number is. - * @param version- The current version of the plugin. - * @param pluginname- The plugin name. - * @return Returns the new version of the db. - */ - public synchronized int updateVersion(int version, String pluginname){ - reconnectAndReinitialize(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - PreparedStatement updateVersion = db.prepareStatement(this.updateVersion); - try { - updateVersion.setInt(1, version+ 1); - updateVersion.setString(2, sdf.format(new Date())); - updateVersion.setString(3, pluginname); - updateVersion.execute(); - } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Version control table error; unable to update DB version for Citadel!", e); - } - return ++version; - } /** * Is used to grab the reinforcement from the mysql db. @@ -297,13 +268,12 @@ public synchronized int updateVersion(int version, String pluginname){ */ public Reinforcement getReinforcement(Location loc){ if (loc == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData getReinforcement called with null"); + logger.log(Level.WARNING, "CitadelReinforcementData getReinforcement called with null"); return null; } - reconnectAndReinitialize(); - PreparedStatement getRein = db.prepareStatement(this.getRein); - try { + + try(Connection connection = db.getConnection(); + PreparedStatement getRein = connection.prepareStatement(CitadelReinforcementData.getRein);) { int x = loc.getBlockX(); int y = loc.getBlockY(); int z = loc.getBlockZ(); @@ -340,7 +310,7 @@ public Reinforcement getReinforcement(Location loc){ Group g = GroupManager.getGroup(group_id); if (g == null) { if (CitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.WARNING, + logger.log(Level.WARNING, "Player Reinforcement at {0} lacks a valid group (group {1} failed lookup)", new Object[] {loc, group_id}); } @@ -361,21 +331,26 @@ public Reinforcement getReinforcement(Location loc){ if (rein != null) { return rein; } - PreparedStatement getCordsbyReinID = db.prepareStatement(this.getCordsbyReinID); - getCordsbyReinID.setInt(1, id); - set = getCordsbyReinID.executeQuery(); List locs = new ArrayList(); - while (set.next()){ - int xx = set.getInt(1), yy = set.getInt(2), zz = set.getInt(3); - String world = set.getString(4); - locs.add(new Location(Bukkit.getWorld(world), xx, yy, zz)); + // TODO: How can I defer or embed these second-tier lookups? + try (PreparedStatement getCordsbyReinID = connection.prepareStatement(CitadelReinforcementData.getCordsbyReinID);) { + getCordsbyReinID.setInt(1, id); + try (ResultSet get = getCordsbyReinID.executeQuery();) { + while (get.next()){ + int xx = get.getInt(1), yy = get.getInt(2), zz = get.getInt(3); + String world = get.getString(4); + locs.add(new Location(Bukkit.getWorld(world), xx, yy, zz)); + } + } + } catch (Exception e) { + logger.log(Level.SEVERE, "Error getting multiblock reinforcement {0}", id); + logger.log(Level.SEVERE, "Error getting multiblock reinforcement", e); } - set.close(); Group g = GroupManager.getGroup(group_id); if (g == null) { if (CitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.WARNING, + logger.log(Level.WARNING, "Multiblock Reinforcement touching {0} lacks a valid group (group {1} failed lookup)", new Object[] {loc, group_id}); } @@ -385,11 +360,10 @@ public Reinforcement getReinforcement(Location loc){ return rein; } } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Failed while retrieving reinforcement from database", e); + logger.log(Level.SEVERE, "Failed while retrieving reinforcement from database", e); } if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData getReinforcement failed for {0}", loc); + logger.log(Level.WARNING, "CitadelReinforcementData getReinforcement failed for {0}", loc); } return null; } @@ -401,98 +375,100 @@ public Reinforcement getReinforcement(Location loc){ */ public List getReinforcements(Chunk chunk){ if (chunk == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData getReinforcements called with null"); + logger.log(Level.WARNING, "CitadelReinforcementData getReinforcements called with null"); return null; } - reconnectAndReinitialize(); - PreparedStatement getReins = db.prepareStatement(this.getReins); - String formatChunk = formatChunk(chunk); - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData getReinforcements chunk called for {0}", formatChunk); - } + List reins = new ArrayList(); - try { + String formatChunk = formatChunk(chunk); + + try (Connection connection = db.getConnection(); + PreparedStatement getReins = connection.prepareStatement(CitadelReinforcementData.getReins);) { + if (CitadelConfigManager.shouldLogInternal()) { + logger.log(Level.WARNING, + "CitadelReinforcementData getReinforcements chunk called for {0}", formatChunk); + } getReins.setString(1, formatChunk); - ResultSet set = getReins.executeQuery(); - while (set.next()) { - int x = set.getInt(1), y = set.getInt(2), z = set.getInt(3); - String world = set.getString(4); - @SuppressWarnings("deprecation") - Material mat = Material.getMaterial(set.getInt(5)); - int durability = set.getInt(6); - boolean inSecure = set.getBoolean(7); - int mature = set.getInt(8); - String rein_type = set.getString(9); - String lore = set.getString(10); - int group_id = set.getInt(11); - int acid = set.getInt(13); - - Location loc = new Location(Bukkit.getWorld(world), x, y, z); - - if ("PlayerReinforcement".equals(rein_type)){ - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", - new Object[] {formatChunk, loc, group_id}); + + try (ResultSet set = getReins.executeQuery();) { + while (set.next()) { + int x = set.getInt(1), y = set.getInt(2), z = set.getInt(3); + String world = set.getString(4); + @SuppressWarnings("deprecation") + Material mat = Material.getMaterial(set.getInt(5)); + int durability = set.getInt(6); + boolean inSecure = set.getBoolean(7); + int mature = set.getInt(8); + String rein_type = set.getString(9); + String lore = set.getString(10); + int group_id = set.getInt(11); + int acid = set.getInt(13); + + Location loc = new Location(Bukkit.getWorld(world), x, y, z); + + if ("PlayerReinforcement".equals(rein_type)) { + Group g = GroupManager.getGroup(group_id); + if (g == null) { + if (CitadelConfigManager.shouldLogReinforcement()) { + logger.log(Level.WARNING, + "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", + new Object[] {formatChunk, loc, group_id}); + } + continue; // group not found! } - continue; // group not found! - } - ItemStack stack = new ItemStack(mat); - if (lore != null){ - ItemMeta meta = stack.getItemMeta(); - List array = Arrays.asList(lore.split("\n")); - meta.setLore(array); - stack.setItemMeta(meta); - } - PlayerReinforcement rein = new PlayerReinforcement(loc, durability, - mature, acid, g, stack); - rein.setInsecure(inSecure); - reins.add(rein); - } - else if("NaturalReinforcement".equals(rein_type)){ - NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); - reins.add(rein); - } - else if ("MultiBlockReinforcement".equals(rein_type)){ - int id = set.getInt(12); - MultiBlockReinforcement rein = MultiBlockReinforcement.getMultiRein(id); - if (rein != null) { + ItemStack stack = new ItemStack(mat); + if (lore != null){ + ItemMeta meta = stack.getItemMeta(); + List array = Arrays.asList(lore.split("\n")); + meta.setLore(array); + stack.setItemMeta(meta); + } + PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); + rein.setInsecure(inSecure); reins.add(rein); - continue; - } - - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "During Chunk {0} load, Multiblock Reinforcement at {1} lacks a valid group (group {2} failed lookup)", - new Object[] {formatChunk, loc, group_id}); + } else if("NaturalReinforcement".equals(rein_type)) { + NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); + reins.add(rein); + } else if ("MultiBlockReinforcement".equals(rein_type)) { + int id = set.getInt(12); + MultiBlockReinforcement rein = MultiBlockReinforcement.getMultiRein(id); + if (rein != null) { + reins.add(rein); + continue; } - continue; // group not found! - } - PreparedStatement getCordsbyReinID = db.prepareStatement(this.getCordsbyReinID); - getCordsbyReinID.setInt(1, id); - ResultSet multi = getCordsbyReinID.executeQuery(); - List locs = new ArrayList(); - while (multi.next()){ - int xx = multi.getInt(1), yy = multi.getInt(2), zz = multi.getInt(3); - String w = multi.getString(4); - locs.add(new Location(Bukkit.getWorld(w), xx, yy, zz)); + + Group g = GroupManager.getGroup(group_id); + if (g == null) { + if (CitadelConfigManager.shouldLogReinforcement()) { + logger.log(Level.WARNING, + "During Chunk {0} load, Multiblock Reinforcement at {1} lacks a valid group (group {2} failed lookup)", + new Object[] {formatChunk, loc, group_id}); + } + continue; // group not found! + } + List locs = new ArrayList(); + try (PreparedStatement getCordsbyReinID = connection.prepareStatement(CitadelReinforcementData.getCordsbyReinID);) { + getCordsbyReinID.setInt(1, id); + try (ResultSet multi = getCordsbyReinID.executeQuery();) { + while (multi.next()){ + int xx = multi.getInt(1), yy = multi.getInt(2), zz = multi.getInt(3); + String w = multi.getString(4); + locs.add(new Location(Bukkit.getWorld(w), xx, yy, zz)); + } + } + } catch (Exception e) { + logger.log(Level.SEVERE, "Failed to get a multiblock reinforcement {0} due to {1}", new Object[] { + id, e.getMessage() + }); + } + + rein = new MultiBlockReinforcement(locs, g, durability, mature, acid, id); + reins.add(rein); } - multi.close(); - - rein = new MultiBlockReinforcement(locs, g, durability, mature, acid, id); - reins.add(rein); } } - set.close(); } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Failed while retrieving chunk " + - formatChunk + " reinforcement from database", e); + logger.log(Level.SEVERE, "Failed while retrieving chunk " + formatChunk + " reinforcement from database", e); } return reins; } @@ -505,14 +481,87 @@ public void insertReinforcement(Reinforcement rein){ insertReinforcement(rein, false); } + /** + * Use this to insert a set of Player reinforcements all at once. Note that this automatically fails over to single-insertions if the batch fails in any way. + * + * @param reins + */ + public void insertManyPlayerReinforcements(Collection reins) { + boolean failover = false; + try (Connection connection = db.getConnection(); + CallableStatement insertRein = connection.prepareCall(CitadelReinforcementData.insertReinFully);) { + for (PlayerReinforcement rein : reins) { + Location loc = rein.getLocation(); + int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + String world = loc.getWorld().getName(); + Material mat = rein.getMaterial(); + int dur = rein.getDurability(); + int maturationTime = rein.getMaturationTime(); + int acidTime = rein.getAcidTime(); + boolean insecure = false; + String reinType = "PlayerReinforcement"; + insecure = rein.isInsecure(); + ItemMeta meta = rein.getStackRepresentation().getItemMeta(); + String lore = ""; + if (meta.hasLore()) { + for (String xx: meta.getLore()) { + lore += xx + "\n"; + } + } else { + lore = null; + } + + Group g = rein.getGroup(); + if (g == null) { + logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); + } + + insertRein.setInt(1, x); + insertRein.setInt(2, y); + insertRein.setInt(3, z); + String formatChunk = formatChunk(loc); + insertRein.setString(4, formatChunk); + insertRein.setString(5, world); + insertRein.setInt(1, mat.getId()); + insertRein.setInt(2, dur); + insertRein.setBoolean(3, insecure); + insertRein.setInt(4, rein.getGroupId()); + insertRein.setInt(5, maturationTime); + insertRein.setString(6, lore); + insertRein.setInt(8, acidTime); + insertRein.setString(9, reinType); + insertRein.addBatch(); + } + + int[] done = insertRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch insert of Player reinforcements -- {0} attempted -- appears to have failed.", reins.size()); + failover = true; + } else if (done.length == reins.size()){ + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted", reins.size()); + } else { + failover = true; + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + } + } catch (SQLException e) { + failover = true; + logger.log(Level.SEVERE, "Citadel encountered a critical error while inserting a batch of reinforcements", e); + } + + if (failover) { + logger.log(Level.WARNING, "Citadel encountered uncertainty while inserting a batch of records. Failing over to individual insertion logic."); + for (PlayerReinforcement rein : reins) { + insertReinforcement(rein, true); + } + } + } + @SuppressWarnings("deprecation") public void insertReinforcement(Reinforcement rein, boolean retry){ if (rein == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData insertReinforcement called with null"); + logger.log(Level.WARNING, "CitadelReinforcementData insertReinforcement called with null"); return; } - reconnectAndReinitialize(); if (rein instanceof PlayerReinforcement){ Location loc = rein.getLocation(); @@ -539,35 +588,26 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ Group g = pRein.getGroup(); if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); + logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); } - try { - PreparedStatement insertReinID = db.prepareStatement(this.insertReinID); + try (Connection connection = db.getConnection(); + CallableStatement insertReinID = connection.prepareCall(CitadelReinforcementData.insertReinFully);) { insertReinID.setInt(1, x); insertReinID.setInt(2, y); insertReinID.setInt(3, z); String formatChunk = formatChunk(loc); insertReinID.setString(4, formatChunk); insertReinID.setString(5, world); - ResultSet set = insertReinID.executeQuery(); - if (!set.next()) { - throw new SQLException("Failed ID insertion"); - } - int id = set.getInt("id"); - - PreparedStatement addRein = db.prepareStatement(this.addRein); - addRein.setInt(1, mat.getId()); - addRein.setInt(2, dur); - addRein.setBoolean(3, insecure); - addRein.setInt(4, pRein.getGroupId()); - addRein.setInt(5, maturationTime); - addRein.setString(6, lore); - addRein.setInt(7, id); - addRein.setInt(8, acidTime); - addRein.setString(9, reinType); - addRein.execute(); + insertReinID.setInt(1, mat.getId()); + insertReinID.setInt(2, dur); + insertReinID.setBoolean(3, insecure); + insertReinID.setInt(4, pRein.getGroupId()); + insertReinID.setInt(5, maturationTime); + insertReinID.setString(6, lore); + insertReinID.setInt(8, acidTime); + insertReinID.setString(9, reinType); + insertReinID.execute(); } catch (SQLException e) { Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it and trying again. " + "Including the stack incase it is useful.", e); @@ -582,6 +622,7 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ } else if (rein instanceof NaturalReinforcement) { /* * TODO: Why removed? We had thoughts of using this.. + * TODO: update * * We don't need to worry about saving this right now. * @@ -631,32 +672,33 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ Group g = mbRein.getGroup(); // let's confirm it's good. if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Multiblock Reinforcement insert request lacks a valid group (lookup failed)"); + logger.log(Level.WARNING, "Multiblock Reinforcement insert request lacks a valid group (lookup failed)"); } int id = -1; // We add one because we haven't added it yet. - try { - PreparedStatement insertCustomReinID = db.prepareStatement(this.insertCustomReinID); + try (Connection connection = db.getConnection(); + PreparedStatement insertCustomReinID = connection.prepareStatement(CitadelReinforcementData.insertCustomReinID);) { // add all the locations into the db. - int count = 0; + boolean first = true; try { for (Location lo: mbRein.getLocations()){ - if (count == 0) { - PreparedStatement insertReinID = db.prepareStatement(this.insertReinID); - insertReinID.setInt(1, lo.getBlockX()); - insertReinID.setInt(2, lo.getBlockY()); - insertReinID.setInt(3, lo.getBlockZ()); - String formatChunk = formatChunk(lo); - insertReinID.setString(4, formatChunk); - insertReinID.setString(5, lo.getWorld().getName()); - ResultSet set = insertReinID.executeQuery(); - if (!set.next()) { - throw new SQLException("Failed ID insertion"); + if (first) { + try (PreparedStatement insertReinID = connection.prepareStatement(CitadelReinforcementData.insertReinID);) { + insertReinID.setInt(1, lo.getBlockX()); + insertReinID.setInt(2, lo.getBlockY()); + insertReinID.setInt(3, lo.getBlockZ()); + String formatChunk = formatChunk(lo); + insertReinID.setString(4, formatChunk); + insertReinID.setString(5, lo.getWorld().getName()); + ResultSet set = insertReinID.executeQuery(); + if (!set.next()) { + throw new SQLException("Failed ID insertion"); + } + + id = set.getInt("id"); + mbRein.setReinId(id); + first = false; } - - id = set.getInt("id"); - mbRein.setReinId(id); continue; } insertCustomReinID.setInt(1, id); @@ -670,27 +712,26 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ } insertCustomReinID.executeBatch(); } catch (SQLException se) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has failed to insert locations in a" + - " multiblock reinforcement insertion. ", se); + logger.log(Level.SEVERE, "Citadel has failed to insert locations in a multiblock reinforcement insertion. ", se); insertCustomReinID.clearBatch(); // TODO: Consider forcing the reinf ID removal. throw se; // propagate the exception. } - PreparedStatement addRein = db.prepareStatement(this.addRein); - addRein.setInt(1, -1); - addRein.setInt(2, mbRein.getDurability()); - addRein.setBoolean(3, false); - addRein.setInt(4, mbRein.getGroupId()); - addRein.setInt(5, mbRein.getMaturationTime()); - addRein.setString(6, null); - addRein.setInt(7, id); - addRein.setInt(8, mbRein.getAcidTime()); - addRein.setString(9, "MultiBlockReinforcement"); - addRein.execute(); + try (PreparedStatement addRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { + addRein.setInt(1, -1); + addRein.setInt(2, mbRein.getDurability()); + addRein.setBoolean(3, false); + addRein.setInt(4, mbRein.getGroupId()); + addRein.setInt(5, mbRein.getMaturationTime()); + addRein.setString(6, null); + addRein.setInt(7, id); + addRein.setInt(8, mbRein.getAcidTime()); + addRein.setString(9, "MultiBlockReinforcement"); + addRein.execute(); + } } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has failed to insert a" + - " multiblock reinforcement. ", e); + logger.log(Level.SEVERE, "Citadel has failed to insert a multiblock reinforcement. ", e); deleteReinforcement(rein); // Now lets try again. if (!retry) { @@ -698,8 +739,8 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ } } } - } + /** * Deletes a Reinforcement from the database. Should only be called * within SaveManager @@ -711,24 +752,82 @@ public void deleteReinforcement(Reinforcement rein){ "CitadelReinforcementData deleteReinforcement called with null"); return; } - reconnectAndReinitialize(); - Location loc = rein.getLocation(); int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); String world = loc.getWorld().getName(); - try { - PreparedStatement removeRein = db.prepareStatement(this.removeRein); + try (Connection connection = db.getConnection(); + PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { removeRein.setInt(1, x); removeRein.setInt(2, y); removeRein.setInt(3, z); removeRein.setString(4, world); removeRein.execute(); } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has failed to delete a" + - " reinforcement at "+ loc, e); + logger.log(Level.SEVERE, "Citadel has failed to delete a reinforcement at "+ loc, e); } } + /** + * Save many reinforcements all at once! + * + * @param reins + */ + public void saveManyPlayerReinforcements(Collection reins) { + boolean failover = false; + try (Connection connection = db.getConnection(); + PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { + for (PlayerReinforcement rein : reins) { + int dur = rein.getDurability(); + boolean insecure = false; + int groupId = -1; + int mature = rein.getMaturationTime(); + int acid = rein.getAcidTime(); + Location loc = rein.getLocation(); + int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + String world = loc.getWorld().getName(); + insecure = rein.isInsecure(); + Group g = rein.getGroup(); + if (g == null) { + logger.log(Level.WARNING, "Player saveManyReinforcement at {0} lacks a valid group (lookup failed)", loc); + } else { + groupId = g.getGroupId(); + } + + updateRein.setInt(1, dur); + updateRein.setBoolean(2, insecure); + updateRein.setInt(3, groupId); + updateRein.setInt(4, mature); + updateRein.setInt(5, acid); + updateRein.setInt(6, x); + updateRein.setInt(7, y); + updateRein.setInt(8, z); + updateRein.setString(9, world); + updateRein.addBatch(); + } + + int[] done = updateRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch save of Player reinforcements -- {0} attempted -- appears to have failed.", reins.size()); + failover = true; + } else if (done.length == reins.size()){ + logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted", reins.size()); + } else { + failover = true; + logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + } + } catch (SQLException e) { + failover = true; + logger.log(Level.SEVERE, "Citadel encountered a critical error while saving a batch of reinforcements", e); + } + + if (failover) { + logger.log(Level.WARNING, "Citadel encountered uncertainty while saving a batch of records. Failing over to individual save logic."); + for (PlayerReinforcement rein : reins) { + saveReinforcement(rein); + } + } + } + /** * Saves the Reinforcement to the Database. Should only be called * from SaveManager. @@ -736,11 +835,9 @@ public void deleteReinforcement(Reinforcement rein){ */ public void saveReinforcement(Reinforcement rein){ if (rein == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData saveReinforcement called with null"); + logger.log(Level.WARNING, "CitadelReinforcementData saveReinforcement called with null"); return; } - reconnectAndReinitialize(); int dur = rein.getDurability(); boolean insecure = false; @@ -755,25 +852,22 @@ public void saveReinforcement(Reinforcement rein){ insecure = pRein.isInsecure(); Group g = pRein.getGroup(); if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Player saveReinforcement at {0} lacks a valid group (lookup failed)", loc); + logger.log(Level.WARNING, "Player saveReinforcement at {0} lacks a valid group (lookup failed)", loc); } else { groupId = g.getGroupId(); } - } - if (rein instanceof MultiBlockReinforcement){ + } else if (rein instanceof MultiBlockReinforcement){ MultiBlockReinforcement mbRein = (MultiBlockReinforcement) rein; insecure = false; Group g = mbRein.getGroup(); if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Player saveinsert at {0} lacks a valid group (lookup failed)", loc); + logger.log(Level.WARNING, "Player saveinsert at {0} lacks a valid group (lookup failed)", loc); } else { groupId = g.getGroupId(); } } - try { - PreparedStatement updateRein = db.prepareStatement(this.updateRein); + try (Connection connection = db.getConnection(); + PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { updateRein.setInt(1, dur); updateRein.setBoolean(2, insecure); updateRein.setInt(3, groupId); @@ -785,8 +879,10 @@ public void saveReinforcement(Reinforcement rein){ updateRein.setString(9, world); updateRein.execute(); } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, String.format("The Null Group Exception that is being followed has to deal with the group id: %s," - + " at location: %d, %d, %d, at world: %s", groupId, x, y, z, world), e); + logger.log(Level.WARNING, + "The Exception that is being followed has to deal with the group id: {0}," + + " at location: {1}, {2}, {3}, at world: {4}", new Object[]{groupId, x, y, z, world}); + logger.log(Level.SEVERE, "The Exception on saving a reinforcement:", e); } } @@ -803,39 +899,48 @@ private String formatChunk(Chunk c){ public int getReinCountForGroup(String group){ if (group == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData getReinCountForGroup called with null"); + logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called with null"); return 0; } - try { - PreparedStatement selectReinCountForGroup = db.prepareStatement(this.selectReinCountForGroup); - selectReinCountForGroup.setString(1, group); - ResultSet set = selectReinCountForGroup.executeQuery(); - if (!set.next()) { - throw new SQLException("Failed Count"); + + Group gg = GroupManager.getGroup(group); + if (gg == null) { + logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called for {0} which does not exist", group); + return 0; + } + StringBuilder allIDs = new StringBuilder(); + for (Integer id : gg.getGroupIds()) { + allIDs.append(id).append(","); + } + allIDs.append(gg.getGroupId()); + + String finalIDs = allIDs.toString(); + + try (Connection connection = db.getConnection(); + PreparedStatement selectReinCountForGroup = connection.prepareStatement(CitadelReinforcementData.selectReinCountForGroup);) { + selectReinCountForGroup.setString(1, finalIDs); + try (ResultSet set = selectReinCountForGroup.executeQuery();) { + if (!set.next()) { + throw new SQLException("Failed Count"); + } + return set.getInt(1); } - int r = set.getInt(1); - set.close(); - return r; } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "getReinCountForGroup has failed for " + - group, e); + logger.log(Level.SEVERE, "getReinCountForGroup has failed for " + group, e); } return 0; } public int getReinCountForAllGroups(){ - try { - PreparedStatement selectReinCount = db.prepareStatement(this.selectReinCount); - ResultSet set = selectReinCount.executeQuery(); + try (Connection connection = db.getConnection(); + PreparedStatement selectReinCount = connection.prepareStatement(CitadelReinforcementData.selectReinCount); + ResultSet set = selectReinCount.executeQuery();) { if (!set.next()) { throw new SQLException("Failed Count"); } - int r = set.getInt(1); - set.close(); - return r; + return set.getInt(1); } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "getReinCountForAllGroups has failed", e); + logger.log(Level.SEVERE, "getReinCountForAllGroups has failed", e); } return 0; } From de7acabbb37a82f04461d681271145371888f664 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 5 Oct 2016 17:56:11 -0400 Subject: [PATCH 039/255] Adding needed config options --- src/vg/civcraft/mc/citadel/Citadel.java | 19 +++++++++++++++++-- .../mc/citadel/CitadelConfigManager.java | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 978419b5..064aa392 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -23,6 +23,7 @@ import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.mercury.MercuryAPI; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; @@ -72,8 +73,22 @@ public void initializeDatabase(){ String password = CitadelConfigManager.getPassword(); int port = CitadelConfigManager.getPort(); String dbName = CitadelConfigManager.getDBName(); - Database data = new Database(host, port, dbName, user, password, getLogger()); - db = new CitadelReinforcementData(data); + int poolsize = CitadelConfigManager.getPoolSize(); + long connectionTimeout = CitadelConfigManager.getConnectionTimeout(); + long idleTimeout = CitadelConfigManager.getIdleTimeout(); + long maxLifetime = CitadelConfigManager.getMaxLifetime(); + try { + ManagedDatasource idb = new ManagedDatasource(this, user, password, host, port, + dbName, poolsize, connectionTimeout, idleTimeout, maxLifetime); + idb.getConnection().close(); + + db = new CitadelReinforcementData(idb); + } catch (Exception se) { + getLogger().log(Level.WARNING, "Could not connect to database, shutting down!"); + Bukkit.shutdown(); + return; + } + } /** * Registers the listeners for Citadel. diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index cd09c239..95a50e8f 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -183,6 +183,22 @@ public static String getPassword(){ return config.getString("mysql.password", ""); } + public static int getPoolSize() { + return config.getInt("mysql.poolsize", 20); + } + + public static long getConnectionTimeout() { + return config.getLong("mysql.connection_timeout", 10000l); + } + + public static long getIdleTimeout() { + return config.getLong("mysql.idle_timeout", 600000l); + } + + public static long getMaxLifetime() { + return config.getLong("mysql.max_lifetime", 7200000l); + } + public static boolean shouldLogInternal() { return config.getBoolean("internal_logging", false); } From 1c96019fa7f784af933a509d684a40cb3d140bbe Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 6 Oct 2016 00:59:01 -0400 Subject: [PATCH 040/255] Somewhat working, although either my testing db is messed up or my new insertion storedproc is flawed... --- src/vg/civcraft/mc/citadel/Citadel.java | 44 +++++-- .../mc/citadel/ReinforcementManager.java | 51 +++++++- src/vg/civcraft/mc/citadel/Utility.java | 18 +-- .../database/CitadelReinforcementData.java | 94 ++++++++++---- .../mc/citadel/database/Database.java | 122 ------------------ .../mc/citadel/misc/CitadelStatics.java | 2 +- 6 files changed, 154 insertions(+), 177 deletions(-) delete mode 100644 src/vg/civcraft/mc/citadel/database/Database.java diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 064aa392..a5743c0c 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -8,11 +8,9 @@ import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.plugin.java.JavaPlugin; import vg.civcraft.mc.citadel.command.CommandHandler; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; -import vg.civcraft.mc.citadel.database.Database; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.GroupsListener; @@ -23,12 +21,13 @@ import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.ACivMod; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.mercury.MercuryAPI; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Citadel extends JavaPlugin{ +public class Citadel extends ACivMod{ private static Logger logger; private static CitadelReinforcementData db; @@ -36,11 +35,18 @@ public class Citadel extends JavaPlugin{ private CommandHandler cHandle; private static Citadel instance; + // Calling this for ACivMod + @Override + public void onLoad(){ + //super.onLoad(); + } + public void onEnable(){ + //super.onEnable(); instance = this; logger = getLogger(); if (!Bukkit.getPluginManager().isPluginEnabled("NameLayer")){ - Log("Citadel is shutting down because it could not find NameLayer"); + logger.info("Citadel is shutting down because it could not find NameLayer"); this.getPluginLoader().disablePlugin(this); // shut down } saveDefaultConfig(); @@ -83,6 +89,20 @@ public void initializeDatabase(){ idb.getConnection().close(); db = new CitadelReinforcementData(idb); + + try { + getLogger().log(Level.INFO, "Update prepared, starting database update."); + db.registerMigrations(); + + if (!idb.updateDatabase()) { + getLogger().log(Level.SEVERE, "Update failed, terminating Bukkit."); + Bukkit.shutdown(); + } + } catch (Exception e) { + getLogger().log(Level.SEVERE, "Update failed, terminating Bukkit. Cause:", e); + Bukkit.shutdown(); + } + } catch (Exception se) { getLogger().log(Level.WARNING, "Could not connect to database, shutting down!"); Bukkit.shutdown(); @@ -105,6 +125,7 @@ private void registerListeners(){ } } + @SuppressWarnings("unchecked") public void registerNameLayerPermissions() { LinkedList membersAndAbove = new LinkedList(); membersAndAbove.add(PlayerType.MEMBERS); @@ -129,17 +150,11 @@ public void registerNameLayerPermissions() { /** * Registers the commands for Citadel. */ - private void registerCommands(){ + public void registerCommands(){ cHandle = new CommandHandler(); cHandle.registerCommands(); } - /** - * Logs info for Citadel messages. - * @param message - */ - public static void Log(String message){ - logger.log(Level.INFO, "[Citadel] " + message); - } + /** * @return The ReinforcementManager of Citadel. */ @@ -166,4 +181,9 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args){ return cHandle.complete(sender, cmd, args); } + + @Override + public String getPluginName() { + return "Citadel"; + } } diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 82b33e1b..7c703f38 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -21,6 +21,7 @@ import vg.civcraft.mc.citadel.misc.CitadelStatics; import vg.civcraft.mc.citadel.misc.LoadingCacheNullException; import vg.civcraft.mc.citadel.reinforcement.NullReinforcement; +import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; public class ReinforcementManager { @@ -104,6 +105,41 @@ public void saveReinforcement(Reinforcement rein) { db.saveReinforcement(rein); rein.setDirty(false); } + + public void saveManyReinforcements(List reins) { + if (reins == null || reins.size() == 0) { + Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager saveManyReinforcement called with null or empty"); + return; + } + List removes = new ArrayList(reins.size()); + List updates = new ArrayList(reins.size()); + List remainder = new ArrayList(reins.size()); + for (Reinforcement rein : reins) { + if (rein.getDurability() <= 0) { + reinforcements.invalidate(rein.getLocation()); + CitadelStatics.updateHitStat(CitadelStatics.DELETE); + removes.add(rein); + } else { + if (rein instanceof PlayerReinforcement) { + CitadelStatics.updateHitStat(CitadelStatics.UPDATE); + rein.setDirty(false); + updates.add((PlayerReinforcement) rein); + } else { + remainder.add(rein); + } + } + } + Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement removing {0}", removes.size()); + db.deleteManyReinforcements(removes); + + Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving player reinfs {0}", updates.size()); + db.saveManyPlayerReinforcements(updates); + + Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving other reinfs {0}", remainder.size()); + for (Reinforcement rein : remainder) { + saveReinforcement(rein); + } + } /** * Saves the initial reinforcement into the database. @@ -233,10 +269,10 @@ public void run() { long dirty = 0l; long s = 0l; if (CitadelConfigManager.shouldLogInternal()) { - Citadel.Log("Running Scheduled Save"); + Citadel.getInstance().getLogger().log(Level.INFO, "Running Scheduled Save"); s = System.currentTimeMillis(); } - List reins = new ArrayList(); + List reins = new ArrayList(100); synchronized(reinforcements){ for (Reinforcement r: reinforcements.asMap().values()) { if (r.isDirty()) { @@ -246,13 +282,14 @@ public void run() { cached++; } } - for (Reinforcement r: reins) { - saveReinforcement(r); - } + + saveManyReinforcements(reins); + if (CitadelConfigManager.shouldLogInternal()) { s = System.currentTimeMillis() - s; - Citadel.Log("Scheduled Save complete in " + s + " ms. Cache holds " + - cached + " entries, " + dirty + " entries saved to DB."); + Citadel.getInstance().getLogger().log(Level.INFO, + "Scheduled Save complete in {0} ms. Cache holds {1} entries, {2} entries saved to DB.", + new Object[] {s, cached, dirty}); } } catch (Exception e) { Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager scheduled save encountered a problem", e); diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index f5bbd3e4..6571cec5 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -98,7 +98,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group List slots = new ArrayList(type.getRequiredAmount()); int requirementscheck = type.getRequiredAmount(); if (requirementscheck <= 0) { - Citadel.Log("Reinforcement requirements too low for " + itemType.getType().name()); + Citadel.getInstance().getLogger().info("Reinforcement requirements too low for " + itemType.getType().name()); return null; } if (reinfMat != null && itemType.isSimilar(reinfMat)){ // only in CTF. @@ -152,7 +152,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group slb.append("reinforced a ").append(block.getType()).append(" with a ") .append(rein.getMaterial()).append(" reinforcement at ") .append(rein.getLocation()); - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } // Now eat the materials @@ -191,7 +191,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group requirements -= deduction; } if (requirements != 0) { - Citadel.Log(String.format( "Reinforcement material out of sync %d vs %d", + Citadel.getInstance().getLogger().info(String.format( "Reinforcement material out of sync %d vs %d", requirements, type.getRequiredAmount())); } player.updateInventory(); @@ -428,7 +428,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc } slb.append("broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") .append(reinforcement.getLocation()); - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } cancelled = reinforcementBroken(null, reinforcement); } else { @@ -468,7 +468,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc slb.append("excellent ("); } slb.append(durability).append(") at ").append(reinforcement.getLocation()); - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } if (reinforcement instanceof PlayerReinforcement) { // leave message @@ -591,16 +591,16 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce } if (logIt) { slb.append(" - reinf mat refunded"); - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } } else if (logIt) { slb.append(" - reinf mat lost"); - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } return (pr.isDoor() || pr.isContainer()); } if (logIt) { - Citadel.Log(slb.toString()); + Citadel.getInstance().getLogger().info(slb.toString()); } return false; // implicit isSecureable() == false } @@ -698,7 +698,7 @@ public static boolean isAuthorizedPlayerNear(PlayerReinforcement reinforcement, } } } catch (ConcurrentModificationException e) { - Citadel.Log("ConcurrentModificationException at redstonePower() in BlockListener"); + Citadel.getInstance().getLogger().warning("ConcurrentModificationException at redstonePower() in BlockListener"); } return result; } diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 2b57b1ce..73310f8c 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -5,11 +5,9 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import java.util.logging.Level; @@ -30,7 +28,6 @@ import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.group.Group; public class CitadelReinforcementData { @@ -72,7 +69,6 @@ public class CitadelReinforcementData { private static final String selectReinCountForGroup = "select count(*) as count from reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; private static final String selectReinCount = "select count(*) as count from reinforcement r"; - public CitadelReinforcementData(ManagedDatasource db){ this.db = db; @@ -93,8 +89,8 @@ public CitadelReinforcementData(ManagedDatasource db){ try (Connection connection = db.getConnection(); PreparedStatement migrateInstall = connection.prepareStatement( "INSERT INTO managed_plugin_data (plugin_name, current_migration_number, last_migration)" - + " SELECT plugin_name, str_to_date(update_time, '%Y-%m-%d %H:%i:%s' ), version FROM db_version WHERE plugin_name = '" - + plugin.getName() + "' LIMIT 1;");) { + + " SELECT plugin_name, max(db_version), max(str_to_date(update_time, '%Y-%m-%d %H:%i:%s' )) FROM db_version WHERE plugin_name = ? LIMIT 1;");) { + migrateInstall.setString(1, Citadel.getInstance().getPluginName()); int rows = migrateInstall.executeUpdate(); if (rows == 1) { logger.log(Level.INFO, "Migration successful!"); @@ -106,7 +102,7 @@ public CitadelReinforcementData(ManagedDatasource db){ } catch (SQLException se) { Bukkit.shutdown(); // Migration failed... - logger.log(Level.SEVERE, "Migration failure!"); + logger.log(Level.SEVERE, "Migration failure!", se); return; } } @@ -237,7 +233,7 @@ public Boolean call() throws Exception { + "in y int," + "in z int," + "in chunk_id varchar(255)," - + "in world varchar(255)" + + "in world varchar(255)," + "in material_id int," + "in durability varchar(10)," + "in insecure tinyint(1)," @@ -248,12 +244,11 @@ public Boolean call() throws Exception { + "in rein_type varchar(30)" + ") sql security invoker begin " + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" + "insert into reinforcement (" + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, rein_id, acid_time) VALUES (" + "material_id, durability, insecure, group_id, maturation_time, " + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " - + "lore, id, acid_time);" + + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); } @@ -487,6 +482,7 @@ public void insertReinforcement(Reinforcement rein){ * @param reins */ public void insertManyPlayerReinforcements(Collection reins) { + if (reins == null || reins.size() == 0) return; boolean failover = false; try (Connection connection = db.getConnection(); CallableStatement insertRein = connection.prepareCall(CitadelReinforcementData.insertReinFully);) { @@ -522,14 +518,14 @@ public void insertManyPlayerReinforcements(Collection reins String formatChunk = formatChunk(loc); insertRein.setString(4, formatChunk); insertRein.setString(5, world); - insertRein.setInt(1, mat.getId()); - insertRein.setInt(2, dur); - insertRein.setBoolean(3, insecure); - insertRein.setInt(4, rein.getGroupId()); - insertRein.setInt(5, maturationTime); - insertRein.setString(6, lore); - insertRein.setInt(8, acidTime); - insertRein.setString(9, reinType); + insertRein.setInt(6, mat.getId()); + insertRein.setInt(7, dur); + insertRein.setBoolean(8, insecure); + insertRein.setInt(9, rein.getGroupId()); + insertRein.setInt(10, maturationTime); + insertRein.setString(11, lore); + insertRein.setInt(12, acidTime); + insertRein.setString(13, reinType); insertRein.addBatch(); } @@ -599,14 +595,14 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ String formatChunk = formatChunk(loc); insertReinID.setString(4, formatChunk); insertReinID.setString(5, world); - insertReinID.setInt(1, mat.getId()); - insertReinID.setInt(2, dur); - insertReinID.setBoolean(3, insecure); - insertReinID.setInt(4, pRein.getGroupId()); - insertReinID.setInt(5, maturationTime); - insertReinID.setString(6, lore); - insertReinID.setInt(8, acidTime); - insertReinID.setString(9, reinType); + insertReinID.setInt(6, mat.getId()); + insertReinID.setInt(7, dur); + insertReinID.setBoolean(8, insecure); + insertReinID.setInt(9, pRein.getGroupId()); + insertReinID.setInt(10, maturationTime); + insertReinID.setString(11, lore); + insertReinID.setInt(12, acidTime); + insertReinID.setString(13, reinType); insertReinID.execute(); } catch (SQLException e) { Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it and trying again. " @@ -740,6 +736,51 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ } } } + + /** + * Delete a bunch of reinforcements in a batch. + * @param reins + */ + public void deleteManyReinforcements(Collection reins) { + if (reins == null || reins.size() == 0) return; + boolean failover = false; + try (Connection connection = db.getConnection(); + PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { + for (Reinforcement rein : reins) { + Location loc = rein.getLocation(); + int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + String world = loc.getWorld().getName(); + + removeRein.setInt(1, x); + removeRein.setInt(2, y); + removeRein.setInt(3, z); + removeRein.setString(4, world); + + removeRein.addBatch(); + } + + int[] done = removeRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch removal of Reinforcements -- {0} attempted -- appears to have failed.", reins.size()); + failover = true; + } else if (done.length == reins.size()){ + logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted", reins.size()); + } else { + failover = true; + logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + } + } catch (SQLException e) { + failover = true; + logger.log(Level.SEVERE, "Citadel encountered a critical error while removing a batch of reinforcements", e); + } + + if (failover) { + logger.log(Level.WARNING, "Citadel encountered uncertainty while deleting a batch of records. Failing over to individual deleting logic."); + for (Reinforcement rein : reins) { + deleteReinforcement(rein); + } + } + } /** * Deletes a Reinforcement from the database. Should only be called @@ -773,6 +814,7 @@ public void deleteReinforcement(Reinforcement rein){ * @param reins */ public void saveManyPlayerReinforcements(Collection reins) { + if (reins == null || reins.size() == 0) return; boolean failover = false; try (Connection connection = db.getConnection(); PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { diff --git a/src/vg/civcraft/mc/citadel/database/Database.java b/src/vg/civcraft/mc/citadel/database/Database.java deleted file mode 100644 index 369c9d36..00000000 --- a/src/vg/civcraft/mc/citadel/database/Database.java +++ /dev/null @@ -1,122 +0,0 @@ - package vg.civcraft.mc.citadel.database; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.avaje.ebeaninternal.server.lib.sql.DataSourceException; -public class Database { - private String host; - private int port; - private String db; - private String user; - private String password; - private Logger logger; - private Connection connection; - - public Database(String host, int port, String db, String user, String password, Logger logger) { - this.host = host; - this.port = port; - this.db = db; - this.user = user; - this.password = password; - this.logger = logger; - } - - public String getDb() { - return db; - } - - public String getHost() { - return host; - } - - public String getPassword() { - return password; - } - - public String getUser() { - return user; - } - - /** - * Connects to the database. - * - * @since 0.1 - */ - public boolean connect() { - String jdbc = "jdbc:mysql://" + host + ":" + port + "/" + db + "?user=" + user + "&password=" + password; - try { - Class.forName("com.mysql.jdbc.Driver").newInstance(); - } catch (Exception ex) { - throw new DataSourceException("Failed to initialize JDBC driver."); - } - try { - connection = DriverManager.getConnection(jdbc); - this.logger.log(Level.INFO, "Connected to database!"); - return true; - } catch (SQLException ex) { //Error handling below: - this.logger.log(Level.SEVERE, "Could not connnect to the database!", ex); - return false; - } - } - - /** - * Closes the database connection. - * - * @since 0.1 - */ - public void close() { - try { - connection.close(); - } catch (SQLException ex) { - this.logger.log(Level.SEVERE, "An error occured while closing the connection.", ex); - } - } - - /** - * Are we connected to the database? - * - * @return Connected - * @throws SQLException - */ - public boolean isConnected() { - try { - return connection.isValid(5); - } catch (SQLException ex) { - this.logger.log(Level.SEVERE, "isConnected error!", ex); - } - return false; - } - - /** - * Prepare the SQL statements - * - * @return PreparedStatement - * @throws SQLException - */ - public PreparedStatement prepareStatement(String sqlStatement) { - try { - return connection.prepareStatement(sqlStatement); - } catch (SQLException ex) { - this.logger.log(Level.SEVERE, "Failed to prepare statement! " + sqlStatement, ex); - } - return null; - } - - public void execute(String sql) { - try { - if (isConnected()) { - connection.prepareStatement(sql).executeUpdate(); - } else { - connect(); - execute(sql); - } - } catch (SQLException ex) { - this.logger.log(Level.SEVERE, "Could not execute SQL statement!", ex); - } - } -} diff --git a/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java b/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java index c73ce481..8be6ceae 100644 --- a/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java +++ b/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java @@ -68,6 +68,6 @@ public static void displayStatisticsToConsole(){ stats.append(" Amount of Reinforcement saves ").append(reins_updated_to_db).append(".\n"); stats.append(" Reinforcements deleted from the db ").append(reins_deleted_from_db).append(".\n"); stats.append(" Reinforcements created and saved to db ").append(reins_insert_to_db).append(".\n"); - Citadel.Log(stats.toString()); + Citadel.getInstance().getLogger().info(stats.toString()); } } From e019cd1a086b0b6d4b2dc3909d219851041791dd Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Tue, 11 Oct 2016 08:29:45 -0400 Subject: [PATCH 041/255] Starting thoughts on migration to non join based insertions updates and deletes' ' --- .../civcraft/mc/citadel/database/CitadelReinforcementData.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 73310f8c..552e56ef 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -250,6 +250,9 @@ public Boolean call() throws Exception { + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); + db.registerMigration(12, false, "CREATE TABLE reinforcements_temp AS SELECT a.rein_id, x, y, z, world, " + + "material_id, durability, insecure, group_id, maturation_time, lore, acid_time, rein_type_id " + + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;"); } From 42d59509d4e0be81173d5a5fd2c29cc5e46f928d Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Tue, 11 Oct 2016 18:21:25 -0400 Subject: [PATCH 042/255] part 1 --- .../database/CitadelReinforcementData.java | 273 ++++++++---------- 1 file changed, 121 insertions(+), 152 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 552e56ef..9a8eac16 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -36,38 +36,54 @@ public class CitadelReinforcementData { private Citadel plugin = Citadel.getInstance(); private Logger logger = plugin.getLogger(); - private static final String getRein = "select r.material_id, r.durability, " + - "r.insecure, r.maturation_time, r.acid_time, rt.rein_type, " - + "r.lore, r.group_id, r.rein_id from reinforcement r " - + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " - + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.chunk_id = ? and ri.world = ?"; - private static final String getReins = "select ri.x, ri.y, ri.z, ri.world, r.material_id, r.durability, " + - "r.insecure, r.maturation_time, rt.rein_type, " - + "r.lore, r.group_id, r.rein_id, r.acid_time from reinforcement r " - + "inner join reinforcement_id ri on r.rein_id = ri.rein_id " - + "inner join reinforcement_type rt on rt.rein_type_id = r.rein_type_id " - + "where ri.chunk_id = ?"; - private static final String addRein = "insert into reinforcement (" - + "material_id, durability, " - + "insecure, group_id, maturation_time, rein_type_id," - + "lore, rein_id, acid_time) select ?, ?, ?, ?, ?, rt.rein_type_id, ?, ?, ? " - + "from reinforcement_type rt where rt.rein_type = ?"; - private static final String removeRein = "delete r.*, ri.* from reinforcement r " - + "left join reinforcement_id ri on r.rein_id = ri.rein_id " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world = ?"; - private static final String updateRein = "update reinforcement r " - + "inner join reinforcement_id ri on ri.rein_id = r.rein_id " - + "set r.durability = ?, r.insecure = ?, r.group_id = ?, " - + "maturation_time = ?, acid_time = ? " - + "where ri.x = ? and ri.y = ? and ri.z = ? and ri.world =?"; + private Map natures = new HashMap(); + + private static enum ReinforcementNature { + PLAYER_REINFORCEMENT ("PlayerReinforcement"), + NATURAL_REINFORCEMENT ("NaturalReinforcement"), + MULTIBLOCK_REINFORCEMENT ("MultiblockReinforcement"); + + private String label; + + ReinforcementNature(String label) { + this.label = label; + } + + public String getLabel() { + return this.label; + } + + public static ReinforcementNature decode(String label) { + if (!label == null) { + for (ReinforcementNature nature : ReinforcementNature.values()) { + if (nature.label.equalsIgnoreCase(label)) { + return nature; + } + } + } + throw new IllegalArgumentException("No ReinforcementNature matching " + label); + } + } + + private static final String getRein = + "SELECT material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " + + "FROM reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; + private static final String getReins = + "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " + + "FROM reinforcement WHERE chunk_x = ? and chunk_z = ? and world = ?;"; + private static final String addRein = + "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); " + private static final String removeRein = "DELETE from reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; + private static final String updateRein = + "UPDATE reinforcement SET durability = ?, insecure = ?, group_id = ?, maturation_time = ?, acid_time = ? " + + "WHERE x = ? and y = ? and z = ? and world = ?"; + private static final String getNatures = "SELECT rein_type_id, rein_type FROM reinforcement_type"; - private static final String insertReinID = "call insertReinID(?,?,?,?,?)"; - private static final String insertCustomReinID = "call insertCustomReinID(?,?,?,?,?,?)"; - private static final String insertReinFully = "call insertRein(?,?,?,?,?,?,?,?,?,?,?,?,?)"; - private static final String getCordsbyReinID = "select x, y, z, world from reinforcement_id where rein_id = ?"; - private static final String selectReinCountForGroup = "select count(*) as count from reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; - private static final String selectReinCount = "select count(*) as count from reinforcement r"; + private static final String getCoordsbyReinID = "SELECT x, y, z, world FROM reinforcement WHERE rein_id = ?"; + private static final String selectReinCountForGroup = + "SELECT count(*) AS count FROM reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; + private static final String selectReinCount = "SELECT count(*) AS count FROM reinforcement"; public CitadelReinforcementData(ManagedDatasource db){ this.db = db; @@ -113,30 +129,6 @@ public CitadelReinforcementData(ManagedDatasource db){ } public void registerMigrations() { - /* Multipath migration is bad, mmmkay? - * This is super legacy, just keeping it here as a nod to the past. - Citadel.Log("Detected previous version of Citadel, " + - "updating to new db.\n" + - "You should have backed up your data, " + - "if you havent already you have ten seconds to" + - " shut down the server and perform a backup."); - try { - Thread.sleep(10000); - } catch (InterruptedException e1) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Update sleep interrupted", e1); - } - long first_time = System.currentTimeMillis(); - db.execute("alter table reinforcement drop security_level, drop version, add group_id int not null;"); - db.execute("insert into faction_id (group_name) values (null);"); // For natural reinforcements - db.execute("delete from reinforcement where `name` is null;"); - db.execute("update ignore reinforcement r inner join faction_id f on f.group_name = r.`name` " - + "set r.group_id = f.group_id;"); - db.execute("alter table reinforcement drop `name`, add rein_type_id int not null default 1, " - + "add lore varchar(255);"); - db.execute("drop table citadel_account_id_map;"); - Citadel.Log("The update to new format took " + (System.currentTimeMillis() - first_time) / 1000 + " seconds."); - */ - db.registerMigration(6, false, new Callable () { @Override @@ -250,9 +242,37 @@ public Boolean call() throws Exception { + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); - db.registerMigration(12, false, "CREATE TABLE reinforcements_temp AS SELECT a.rein_id, x, y, z, world, " - + "material_id, durability, insecure, group_id, maturation_time, lore, acid_time, rein_type_id " - + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;"); + db.registerMigration(12, false, + "CREATE TABLE reinforcements_temp (" + + "rein_id int not null auto_increment," + + "x int not null," + + "y int not null," + + "z int not null," + + "chunk_x int not null default floor(x / 16)," + + "chunk_z int not null default floor(z / 16)," + + "world varchar(255) not null," + + "material_id int not null," + + "durability varchar(10) not null," + + "insecure tinyint(1) not null," + + "group_id int not null," + + "maturation_time int not null," + + "rein_type_id int not null," + + "lore varchar(255)," + + "acid_time int not null," + + "primary key rid (rein_id)," + + "unique index realcoord (x,y,z,world)," + + "index chunkcoord(chunk_x, chunk_z, world)" + + ");", + "INSERT IGNORE INTO reinforcements_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " + + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " + + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", + "RENAME TABLE reinforcements_id TO deprecated_reinforcements_id;", + "RENAME TABLE reinforcements TO deprecated_reinforcements;", + "RENAME TABLE reinforcements_temp TO reinforcements;", + "DROP PROCEDURE if exists insertReinID;", + "DROP PROCEDURE if exists insertCustomReinID;", + "DROP PROCEDURE if exists insertRein;", + ); } @@ -278,9 +298,7 @@ public Reinforcement getReinforcement(Location loc){ getRein.setInt(1, x); getRein.setInt(2, y); getRein.setInt(3, z); - String formatChunk = formatChunk(loc); - getRein.setString(4, formatChunk); - getRein.setString(5, loc.getWorld().getName()); + getRein.setString(4, loc.getWorld().getName()); ResultSet set = getRein.executeQuery(); if (!set.next()) { set.close(); @@ -292,12 +310,14 @@ public Reinforcement getReinforcement(Location loc){ boolean inSecure = set.getBoolean(3); int mature = set.getInt(4); int acid = set.getInt(5); - String rein_type = set.getString(6); + int rein_type_id = set.getInt(6); + ReinforcementNature rein_type = natures.get(rein_type_id); String lore = set.getString(7); int group_id = set.getInt(8); - // Check for what type of reinforcement and return the one needed. - if ("PlayerReinforcement".equals(rein_type)) { - set.close(); + int id = set.getInt(9); + set.close(); + switch(rein_type) { + case ReinforcementNature.PLAYER_REINFORCEMENT: ItemStack stack = new ItemStack(mat); if (lore != null) { ItemMeta meta = stack.getItemMeta(); @@ -314,48 +334,17 @@ public Reinforcement getReinforcement(Location loc){ } return null; // group not found! } - PlayerReinforcement rein = new PlayerReinforcement(loc, durability, - mature, acid, g,stack); + PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); rein.setInsecure(inSecure); return rein; - } else if ("NaturalReinforcement".equals(rein_type)){ - set.close(); + case ReinforcementNature.NATURAL_REINFORCEMENT: NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); return rein; - } else if ("MultiBlockReinforcement".equals(rein_type)) { - int id = set.getInt(9); - set.close(); - MultiBlockReinforcement rein = MultiBlockReinforcement.getMultiRein(id); - if (rein != null) { - return rein; - } - List locs = new ArrayList(); - // TODO: How can I defer or embed these second-tier lookups? - try (PreparedStatement getCordsbyReinID = connection.prepareStatement(CitadelReinforcementData.getCordsbyReinID);) { - getCordsbyReinID.setInt(1, id); - try (ResultSet get = getCordsbyReinID.executeQuery();) { - while (get.next()){ - int xx = get.getInt(1), yy = get.getInt(2), zz = get.getInt(3); - String world = get.getString(4); - locs.add(new Location(Bukkit.getWorld(world), xx, yy, zz)); - } - } - } catch (Exception e) { - logger.log(Level.SEVERE, "Error getting multiblock reinforcement {0}", id); - logger.log(Level.SEVERE, "Error getting multiblock reinforcement", e); - } - - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - logger.log(Level.WARNING, - "Multiblock Reinforcement touching {0} lacks a valid group (group {1} failed lookup)", - new Object[] {loc, group_id}); - } - return null; // group not found! - } - rein = new MultiBlockReinforcement(locs, g, durability, mature, acid, id); + case ReinforcementNature.MULTIBLOCK_REINFORCEMENT: + logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); return rein; + default: + logger.log(Level.SEVERE, "Unknown reinforcement type in database: {0}", rein_type_id); } } catch (SQLException e) { logger.log(Level.SEVERE, "Failed while retrieving reinforcement from database", e); @@ -378,33 +367,41 @@ public List getReinforcements(Chunk chunk){ } List reins = new ArrayList(); - String formatChunk = formatChunk(chunk); + int cx = chunk.getChunkX(); + int cz = chunk.getChunkZ(); + String world = chunk.getWorld().getName(); try (Connection connection = db.getConnection(); PreparedStatement getReins = connection.prepareStatement(CitadelReinforcementData.getReins);) { if (CitadelConfigManager.shouldLogInternal()) { logger.log(Level.WARNING, - "CitadelReinforcementData getReinforcements chunk called for {0}", formatChunk); + "CitadelReinforcementData getReinforcements chunk called for {0}", chunk); } - getReins.setString(1, formatChunk); + getReins.setInt(1, cx); + getReins.setInt(2, cz); + getReins.setString(3, world); + "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " try (ResultSet set = getReins.executeQuery();) { while (set.next()) { - int x = set.getInt(1), y = set.getInt(2), z = set.getInt(3); - String world = set.getString(4); + int x = set.getInt(1); + int y = set.getInt(2); + int z = set.getInt(3); @SuppressWarnings("deprecation") - Material mat = Material.getMaterial(set.getInt(5)); - int durability = set.getInt(6); - boolean inSecure = set.getBoolean(7); - int mature = set.getInt(8); - String rein_type = set.getString(9); + Material mat = Material.getMaterial(set.getInt(4)); + int durability = set.getInt(5); + boolean inSecure = set.getBoolean(6); + int mature = set.getInt(7); + int acid = set.getInt(8); + int rein_type_id = set.getInt(9); + ReinforcementNature rein_type = natures.get(rein_type_id); String lore = set.getString(10); int group_id = set.getInt(11); - int acid = set.getInt(13); - Location loc = new Location(Bukkit.getWorld(world), x, y, z); + Location loc = new Location(chunk.getWorld(), x, y, z); - if ("PlayerReinforcement".equals(rein_type)) { + switch(rein_type) { + case PLAYER_REINFORCEMENT: Group g = GroupManager.getGroup(group_id); if (g == null) { if (CitadelConfigManager.shouldLogReinforcement()) { @@ -424,49 +421,21 @@ public List getReinforcements(Chunk chunk){ PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); rein.setInsecure(inSecure); reins.add(rein); - } else if("NaturalReinforcement".equals(rein_type)) { + break; + case NATURAL_REINFORCEMENT: NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); reins.add(rein); - } else if ("MultiBlockReinforcement".equals(rein_type)) { - int id = set.getInt(12); - MultiBlockReinforcement rein = MultiBlockReinforcement.getMultiRein(id); - if (rein != null) { - reins.add(rein); - continue; - } - - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - logger.log(Level.WARNING, - "During Chunk {0} load, Multiblock Reinforcement at {1} lacks a valid group (group {2} failed lookup)", - new Object[] {formatChunk, loc, group_id}); - } - continue; // group not found! - } - List locs = new ArrayList(); - try (PreparedStatement getCordsbyReinID = connection.prepareStatement(CitadelReinforcementData.getCordsbyReinID);) { - getCordsbyReinID.setInt(1, id); - try (ResultSet multi = getCordsbyReinID.executeQuery();) { - while (multi.next()){ - int xx = multi.getInt(1), yy = multi.getInt(2), zz = multi.getInt(3); - String w = multi.getString(4); - locs.add(new Location(Bukkit.getWorld(w), xx, yy, zz)); - } - } - } catch (Exception e) { - logger.log(Level.SEVERE, "Failed to get a multiblock reinforcement {0} due to {1}", new Object[] { - id, e.getMessage() - }); - } - - rein = new MultiBlockReinforcement(locs, g, durability, mature, acid, id); - reins.add(rein); + break; + case MULTIBLOCK_REINFORCEMENT: + logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); + break; + default: + logger.log(Level.SEVERE, "Unknown reinforcement type in database: {0}", rein_type_id); } } } } catch (SQLException e) { - logger.log(Level.SEVERE, "Failed while retrieving chunk " + formatChunk + " reinforcement from database", e); + logger.log(Level.SEVERE, "Failed while retrieving chunk " + chunk.toString() + " reinforcements from database", e); } return reins; } From aadc170f3718c8ad49075e4f8b4ad458e48c8b83 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 12 Oct 2016 00:31:55 -0400 Subject: [PATCH 043/255] Rewritten reinforcement layer, no more joins. --- .../mc/citadel/ReinforcementManager.java | 32 +- .../database/CitadelReinforcementData.java | 638 ++++++++---------- 2 files changed, 290 insertions(+), 380 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 7c703f38..cbdb5481 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -112,33 +112,23 @@ public void saveManyReinforcements(List reins) { return; } List removes = new ArrayList(reins.size()); - List updates = new ArrayList(reins.size()); - List remainder = new ArrayList(reins.size()); + List updates = new ArrayList(reins.size()); for (Reinforcement rein : reins) { if (rein.getDurability() <= 0) { reinforcements.invalidate(rein.getLocation()); CitadelStatics.updateHitStat(CitadelStatics.DELETE); removes.add(rein); } else { - if (rein instanceof PlayerReinforcement) { - CitadelStatics.updateHitStat(CitadelStatics.UPDATE); - rein.setDirty(false); - updates.add((PlayerReinforcement) rein); - } else { - remainder.add(rein); - } + CitadelStatics.updateHitStat(CitadelStatics.UPDATE); + rein.setDirty(false); + updates.add((PlayerReinforcement) rein); } } Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement removing {0}", removes.size()); db.deleteManyReinforcements(removes); Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving player reinfs {0}", updates.size()); - db.saveManyPlayerReinforcements(updates); - - Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving other reinfs {0}", remainder.size()); - for (Reinforcement rein : remainder) { - saveReinforcement(rein); - } + db.saveManyReinforcements(updates); } /** @@ -313,16 +303,16 @@ public List getReinforcementsByChunk(Chunk chunk){ List reins = db.getReinforcements(chunk); List reins_new = new ArrayList(); for (Reinforcement rein: reins){ - if (reinforcements.getIfPresent(rein.getLocation()) == null){ + Reinforcement prep = reinforcements.getIfPresent(rein.getLocation()); + if (prep == null || prep instanceof NullReinforcement){ reinforcements.put(rein.getLocation(), rein); reins_new.add(rein); - } - else { + } else { Reinforcement r = null; try { r = reinforcements.get(rein.getLocation()); } catch (ExecutionException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcementsByChunk called with null", e); + Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcementsByChunk failed a get", e); } reins_new.add(r); } @@ -330,7 +320,9 @@ public List getReinforcementsByChunk(Chunk chunk){ return reins_new; } - // TODO how tf is this not used, mfw + /** + * Identical to {@link #getReinforcementsByChunk(Chunk)} + */ public void loadReinforcementChunk(Chunk chunk) { if (chunk == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager loadReinforcementChunk called with null"); diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 9a8eac16..6c686de0 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -1,6 +1,5 @@ package vg.civcraft.mc.citadel.database; -import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -8,7 +7,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.Callable; import java.util.logging.Level; import java.util.logging.Logger; @@ -37,6 +38,7 @@ public class CitadelReinforcementData { private Logger logger = plugin.getLogger(); private Map natures = new HashMap(); + private Map invNatures = new HashMap(); private static enum ReinforcementNature { PLAYER_REINFORCEMENT ("PlayerReinforcement"), @@ -54,7 +56,7 @@ public String getLabel() { } public static ReinforcementNature decode(String label) { - if (!label == null) { + if (label != null) { for (ReinforcementNature nature : ReinforcementNature.values()) { if (nature.label.equalsIgnoreCase(label)) { return nature; @@ -73,14 +75,13 @@ public static ReinforcementNature decode(String label) { + "FROM reinforcement WHERE chunk_x = ? and chunk_z = ? and world = ?;"; private static final String addRein = "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id) " - + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); "; private static final String removeRein = "DELETE from reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; private static final String updateRein = "UPDATE reinforcement SET durability = ?, insecure = ?, group_id = ?, maturation_time = ?, acid_time = ? " + "WHERE x = ? and y = ? and z = ? and world = ?"; private static final String getNatures = "SELECT rein_type_id, rein_type FROM reinforcement_type"; - private static final String getCoordsbyReinID = "SELECT x, y, z, world FROM reinforcement WHERE rein_id = ?"; private static final String selectReinCountForGroup = "SELECT count(*) AS count FROM reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; private static final String selectReinCount = "SELECT count(*) AS count FROM reinforcement"; @@ -125,7 +126,34 @@ public CitadelReinforcementData(ManagedDatasource db){ } else { logger.log(Level.INFO, "Still at it, eh?"); } - + + doPrepareNatures(); + } + + private void doPrepareNatures() { + try (Connection connection = db.getConnection(); + PreparedStatement statement = connection.prepareStatement(CitadelReinforcementData.getNatures); + ResultSet set = statement.executeQuery();) { + while (set.next()) { + int id = set.getInt(1); + String type = set.getString(2); + try { + ReinforcementNature nature = ReinforcementNature.decode(type); + natures.put(id, nature); + invNatures.put(nature, id); + } catch (IllegalArgumentException iae) { + logger.log(Level.WARNING, "Note that although configured, {0} is not a recognized Reinforcement Nature", type); + } + } + + if (natures.size() == 0) { + logger.log(Level.SEVERE, "Failed to find any reinforcement types, shutting down."); + Bukkit.shutdown(); + } + } catch (SQLException se) { + logger.log(Level.SEVERE, "Failed to load the reinforcement types, shutting down."); + Bukkit.shutdown(); + } } public void registerMigrations() { @@ -133,15 +161,14 @@ public void registerMigrations() { new Callable () { @Override public Boolean call() throws Exception { - String[] types = {"PlayerReinforcement", "NaturalReinforcement", "MultiBlockReinforcement"}; try (Connection connection = db.getConnection(); PreparedStatement dotypes = connection.prepareStatement("insert into reinforcement_type(rein_type) values (?);")) { - for (String x: types) { - dotypes.setString(1, x); + for (ReinforcementNature x: ReinforcementNature.values()) { + dotypes.setString(1, x.getLabel()); dotypes.addBatch(); } int[] rez = dotypes.executeBatch(); - if (rez.length == types.length) { + if (rez.length == ReinforcementNature.values().length) { return true; } else { logger.log(Level.SEVERE, "Failed to insert reinforcement types."); @@ -266,12 +293,12 @@ public Boolean call() throws Exception { "INSERT IGNORE INTO reinforcements_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", - "RENAME TABLE reinforcements_id TO deprecated_reinforcements_id;", - "RENAME TABLE reinforcements TO deprecated_reinforcements;", - "RENAME TABLE reinforcements_temp TO reinforcements;", - "DROP PROCEDURE if exists insertReinID;", - "DROP PROCEDURE if exists insertCustomReinID;", - "DROP PROCEDURE if exists insertRein;", + "RENAME TABLE reinforcement_id TO deprecated_reinforcement_id;", + "RENAME TABLE reinforcement TO deprecated_reinforcement;", + "RENAME TABLE reinforcement_temp TO reinforcement;", + "DROP PROCEDURE IF EXISTS insertReinID;", + "DROP PROCEDURE IF EXISTS insertCustomReinID;", + "DROP PROCEDURE IF EXISTS insertRein;" ); } @@ -314,10 +341,10 @@ public Reinforcement getReinforcement(Location loc){ ReinforcementNature rein_type = natures.get(rein_type_id); String lore = set.getString(7); int group_id = set.getInt(8); - int id = set.getInt(9); + //int linked_rein_id = set.getInt(9); set.close(); switch(rein_type) { - case ReinforcementNature.PLAYER_REINFORCEMENT: + case PLAYER_REINFORCEMENT: ItemStack stack = new ItemStack(mat); if (lore != null) { ItemMeta meta = stack.getItemMeta(); @@ -337,12 +364,12 @@ public Reinforcement getReinforcement(Location loc){ PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); rein.setInsecure(inSecure); return rein; - case ReinforcementNature.NATURAL_REINFORCEMENT: - NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); - return rein; - case ReinforcementNature.MULTIBLOCK_REINFORCEMENT: + case NATURAL_REINFORCEMENT: + NaturalReinforcement nrein = new NaturalReinforcement(loc.getBlock(), durability); + return nrein; + case MULTIBLOCK_REINFORCEMENT: logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); - return rein; + return null; default: logger.log(Level.SEVERE, "Unknown reinforcement type in database: {0}", rein_type_id); } @@ -367,8 +394,8 @@ public List getReinforcements(Chunk chunk){ } List reins = new ArrayList(); - int cx = chunk.getChunkX(); - int cz = chunk.getChunkZ(); + int cx = chunk.getX(); + int cz = chunk.getZ(); String world = chunk.getWorld().getName(); try (Connection connection = db.getConnection(); @@ -381,7 +408,6 @@ public List getReinforcements(Chunk chunk){ getReins.setInt(2, cz); getReins.setString(3, world); - "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " try (ResultSet set = getReins.executeQuery();) { while (set.next()) { int x = set.getInt(1); @@ -397,7 +423,8 @@ public List getReinforcements(Chunk chunk){ ReinforcementNature rein_type = natures.get(rein_type_id); String lore = set.getString(10); int group_id = set.getInt(11); - + // Sketch: when doing multiblock, have an FK that self-references the same table, so multiple locations link to a single rein. + //int linked_rein_id = set.getInt(12); Location loc = new Location(chunk.getWorld(), x, y, z); switch(rein_type) { @@ -407,7 +434,7 @@ public List getReinforcements(Chunk chunk){ if (CitadelConfigManager.shouldLogReinforcement()) { logger.log(Level.WARNING, "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", - new Object[] {formatChunk, loc, group_id}); + new Object[] {chunk, loc, group_id}); } continue; // group not found! } @@ -423,8 +450,8 @@ public List getReinforcements(Chunk chunk){ reins.add(rein); break; case NATURAL_REINFORCEMENT: - NaturalReinforcement rein = new NaturalReinforcement(loc.getBlock(), durability); - reins.add(rein); + NaturalReinforcement nrein = new NaturalReinforcement(loc.getBlock(), durability); + reins.add(nrein); break; case MULTIBLOCK_REINFORCEMENT: logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); @@ -445,7 +472,74 @@ public List getReinforcements(Chunk chunk){ * @param The Reinforcement to save. */ public void insertReinforcement(Reinforcement rein){ - insertReinforcement(rein, false); + insertReinforcement(rein, true); + } + + /** + * Internal, just sets the params correctly depending on nature. Assumes a single compatible query across all natures. + * @param rein + * @return + */ + @SuppressWarnings("deprecation") + private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement insertRein) throws SQLException { + // universal fields. + Location loc = rein.getLocation(); + int x = loc.getBlockX(); + int y = loc.getBlockY(); + int z = loc.getBlockZ(); + String world = loc.getWorld().getName(); + Material mat = rein.getMaterial(); + int dur = rein.getDurability(); + int maturationTime = rein.getMaturationTime(); + int acidTime = rein.getAcidTime(); + + // specific fields, "safe" values. + boolean insecure = false; + String lore = null; + int groupId = -1; + int type = 0; + + if (rein instanceof PlayerReinforcement) { + type = invNatures.get(ReinforcementNature.PLAYER_REINFORCEMENT); + + PlayerReinforcement prein = (PlayerReinforcement) rein; + insecure = prein.isInsecure(); + ItemMeta meta = prein.getStackRepresentation().getItemMeta(); + if (meta.hasLore()) { + StringBuilder newlore = new StringBuilder(); + for (String xx: meta.getLore()) { + newlore.append( xx ).append( "\n" ); + } + lore = newlore.toString(); + } else { + lore = null; + } + + Group g = prein.getGroup(); + if (g == null) { + logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); + } + groupId = prein.getGroupId(); + } else if (rein instanceof NaturalReinforcement) { + type = invNatures.get(ReinforcementNature.NATURAL_REINFORCEMENT); + } else if (rein instanceof MultiBlockReinforcement) { + type = invNatures.get(ReinforcementNature.MULTIBLOCK_REINFORCEMENT); + logger.log(Level.WARNING, "A Multiblock reinforcement was prepped for insert, but is not currently supported."); + } + + insertRein.setInt(1, x); + insertRein.setInt(2, y); + insertRein.setInt(3, z); + insertRein.setString(4, world); + insertRein.setInt(5, mat.getId()); + insertRein.setInt(6, dur); + insertRein.setBoolean(7, insecure); + insertRein.setInt(8, maturationTime); + insertRein.setInt(9, acidTime); + insertRein.setInt(10, type); + insertRein.setString(11, lore); + insertRein.setInt(12, groupId); + return insertRein; } /** @@ -453,63 +547,41 @@ public void insertReinforcement(Reinforcement rein){ * * @param reins */ - public void insertManyPlayerReinforcements(Collection reins) { + public void insertManyReinforcements(Collection reins) { if (reins == null || reins.size() == 0) return; boolean failover = false; try (Connection connection = db.getConnection(); - CallableStatement insertRein = connection.prepareCall(CitadelReinforcementData.insertReinFully);) { - for (PlayerReinforcement rein : reins) { - Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - Material mat = rein.getMaterial(); - int dur = rein.getDurability(); - int maturationTime = rein.getMaturationTime(); - int acidTime = rein.getAcidTime(); - boolean insecure = false; - String reinType = "PlayerReinforcement"; - insecure = rein.isInsecure(); - ItemMeta meta = rein.getStackRepresentation().getItemMeta(); - String lore = ""; - if (meta.hasLore()) { - for (String xx: meta.getLore()) { - lore += xx + "\n"; - } - } else { - lore = null; - } - - Group g = rein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); + PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { + int count = 0; + for (Reinforcement rein : reins) { + this.prepInsertRein(rein, insertRein).addBatch(); + count++; + if (count % 100 == 0) { + int[] done = insertRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch insert of Player reinforcements -- 100 attempted -- appears to have failed."); + failover = true; + break; + } else if (done.length == 100){ + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- 100 attempted"); + } else { + failover = true; + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- 100 attempted -- outcome indeterminate"); + break; + } } - - insertRein.setInt(1, x); - insertRein.setInt(2, y); - insertRein.setInt(3, z); - String formatChunk = formatChunk(loc); - insertRein.setString(4, formatChunk); - insertRein.setString(5, world); - insertRein.setInt(6, mat.getId()); - insertRein.setInt(7, dur); - insertRein.setBoolean(8, insecure); - insertRein.setInt(9, rein.getGroupId()); - insertRein.setInt(10, maturationTime); - insertRein.setString(11, lore); - insertRein.setInt(12, acidTime); - insertRein.setString(13, reinType); - insertRein.addBatch(); } - - int[] done = insertRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch insert of Player reinforcements -- {0} attempted -- appears to have failed.", reins.size()); - failover = true; - } else if (done.length == reins.size()){ - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted", reins.size()); - } else { - failover = true; - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + if (count % 100 != 0) { + int[] done = insertRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch insert of Player reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); + failover = true; + } else if (done.length == (count % 100)){ + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted", (count % 100)); + } else { + failover = true; + logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + } } } catch (SQLException e) { failover = true; @@ -518,7 +590,7 @@ public void insertManyPlayerReinforcements(Collection reins if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while inserting a batch of records. Failing over to individual insertion logic."); - for (PlayerReinforcement rein : reins) { + for (Reinforcement rein : reins) { insertReinforcement(rein, true); } } @@ -531,180 +603,20 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ return; } - if (rein instanceof PlayerReinforcement){ - Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - Material mat = rein.getMaterial(); - int dur = rein.getDurability(); - int maturationTime = rein.getMaturationTime(); - int acidTime = rein.getAcidTime(); - boolean insecure = false; - String reinType = "PlayerReinforcement"; - - PlayerReinforcement pRein = (PlayerReinforcement) rein; - insecure = pRein.isInsecure(); - ItemMeta meta = pRein.getStackRepresentation().getItemMeta(); - String lore = ""; - if (meta.hasLore()) { - for (String xx: meta.getLore()) { - lore += xx + "\n"; - } - } else { - lore = null; - } - - Group g = pRein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); - } - - try (Connection connection = db.getConnection(); - CallableStatement insertReinID = connection.prepareCall(CitadelReinforcementData.insertReinFully);) { - insertReinID.setInt(1, x); - insertReinID.setInt(2, y); - insertReinID.setInt(3, z); - String formatChunk = formatChunk(loc); - insertReinID.setString(4, formatChunk); - insertReinID.setString(5, world); - insertReinID.setInt(6, mat.getId()); - insertReinID.setInt(7, dur); - insertReinID.setBoolean(8, insecure); - insertReinID.setInt(9, pRein.getGroupId()); - insertReinID.setInt(10, maturationTime); - insertReinID.setString(11, lore); - insertReinID.setInt(12, acidTime); - insertReinID.setString(13, reinType); - insertReinID.execute(); - } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it and trying again. " - + "Including the stack incase it is useful.", e); - // Let's delete the reinforcement; if a user is able to place one then the db is - // out of synch / messed up some how. - deleteReinforcement(rein); - // Now lets try again. - if (!retry) { - insertReinforcement(rein, true); - } - } - } else if (rein instanceof NaturalReinforcement) { - /* - * TODO: Why removed? We had thoughts of using this.. - * TODO: update - * - * We don't need to worry about saving this right now. - * - Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - Material mat = rein.getMaterial(); - int dur = rein.getDurability(); - String chunk_id = loc.getChunk().toString(); - int maturationTime = rein.getMaturationTime(); - int acidTime = rein.getAcidTime(); - boolean insecure = false; - String group = NameLayerPlugin.getSpecialAdminGroup(); - String reinType = "NaturalReinforcement"; - String lore = ""; - lore = null; - try { - PreparedStatement insertReinID = db.prepareStatement(this.insertReinID); - insertReinID.setInt(1, x); - insertReinID.setInt(2, y); - insertReinID.setInt(3, z); - String formatChunk = formatChunk(loc); - insertReinID.setString(4, formatChunk); - insertReinID.setString(5, world); - insertReinID.execute(); - - int id = getLastReinId(); - - PreparedStatement addRein = db.prepareStatement(this.addRein); - addRein.setInt(1, mat.getId()); - addRein.setInt(2, dur); - addRein.setBoolean(3, insecure); - addRein.setInt(4, maturationTime); - addRein.setString(5, lore); - addRein.setInt(6, id); - addRein.setInt(7, acidTime); - addRein.setString(8, reinType); - addRein.setString(9, group); - addRein.execute(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - */ - } else if (rein instanceof MultiBlockReinforcement){ - MultiBlockReinforcement mbRein = (MultiBlockReinforcement) rein; - - Group g = mbRein.getGroup(); // let's confirm it's good. - if (g == null) { - logger.log(Level.WARNING, "Multiblock Reinforcement insert request lacks a valid group (lookup failed)"); + try (Connection connection = db.getConnection(); + PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { + if (this.prepInsertRein(rein, insertRein).executeUpdate() != 1) { + logger.log(Level.WARNING, "Reinforcement insert at {0} failed!", rein.getLocation()); + throw new SQLException("Reinforcement index collision"); } - - int id = -1; // We add one because we haven't added it yet. - try (Connection connection = db.getConnection(); - PreparedStatement insertCustomReinID = connection.prepareStatement(CitadelReinforcementData.insertCustomReinID);) { - // add all the locations into the db. - boolean first = true; - try { - for (Location lo: mbRein.getLocations()){ - if (first) { - try (PreparedStatement insertReinID = connection.prepareStatement(CitadelReinforcementData.insertReinID);) { - insertReinID.setInt(1, lo.getBlockX()); - insertReinID.setInt(2, lo.getBlockY()); - insertReinID.setInt(3, lo.getBlockZ()); - String formatChunk = formatChunk(lo); - insertReinID.setString(4, formatChunk); - insertReinID.setString(5, lo.getWorld().getName()); - ResultSet set = insertReinID.executeQuery(); - if (!set.next()) { - throw new SQLException("Failed ID insertion"); - } - - id = set.getInt("id"); - mbRein.setReinId(id); - first = false; - } - continue; - } - insertCustomReinID.setInt(1, id); - insertCustomReinID.setInt(2, lo.getBlockX()); - insertCustomReinID.setInt(3, lo.getBlockY()); - insertCustomReinID.setInt(4, lo.getBlockZ()); - String formatChunk = formatChunk(lo); - insertCustomReinID.setString(5, formatChunk); - insertCustomReinID.setString(6, lo.getWorld().getName()); - insertCustomReinID.addBatch(); - } - insertCustomReinID.executeBatch(); - } catch (SQLException se) { - logger.log(Level.SEVERE, "Citadel has failed to insert locations in a multiblock reinforcement insertion. ", se); - insertCustomReinID.clearBatch(); - // TODO: Consider forcing the reinf ID removal. - throw se; // propagate the exception. - } - - try (PreparedStatement addRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { - addRein.setInt(1, -1); - addRein.setInt(2, mbRein.getDurability()); - addRein.setBoolean(3, false); - addRein.setInt(4, mbRein.getGroupId()); - addRein.setInt(5, mbRein.getMaturationTime()); - addRein.setString(6, null); - addRein.setInt(7, id); - addRein.setInt(8, mbRein.getAcidTime()); - addRein.setString(9, "MultiBlockReinforcement"); - addRein.execute(); - } - } catch (SQLException e) { - logger.log(Level.SEVERE, "Citadel has failed to insert a multiblock reinforcement. ", e); - deleteReinforcement(rein); - // Now lets try again. - if (!retry) { - insertReinforcement(rein); - } + } catch (SQLException e) { + Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it" + + (retry ? "and trying again. " : "") + "Including the stack incase it is useful.", e); + // Let's delete the reinforcement; if a user is able to place one then the db is out of synch / messed up some how. + deleteReinforcement(rein); + // Now lets try again. + if (retry) { + insertReinforcement(rein, false); } } } @@ -718,9 +630,12 @@ public void deleteManyReinforcements(Collection reins) { boolean failover = false; try (Connection connection = db.getConnection(); PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { + int count = 0; for (Reinforcement rein : reins) { Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + int x = loc.getBlockX(); + int y = loc.getBlockY(); + int z = loc.getBlockZ(); String world = loc.getWorld().getName(); removeRein.setInt(1, x); @@ -729,17 +644,32 @@ public void deleteManyReinforcements(Collection reins) { removeRein.setString(4, world); removeRein.addBatch(); + count++; + if (count % 100 == 0) { + int[] done = removeRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch removal of Reinforcements -- 100 attempted -- appears to have failed."); + failover = true; + } else if (done.length == 100){ + logger.log(Level.INFO, "Removed a batch of Reinforcements -- 100 attempted"); + } else { + failover = true; + logger.log(Level.INFO, "Removed a batch of Reinforcements -- 100 attempted -- outcome indeterminate"); + } + } } - int[] done = removeRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch removal of Reinforcements -- {0} attempted -- appears to have failed.", reins.size()); - failover = true; - } else if (done.length == reins.size()){ - logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted", reins.size()); - } else { - failover = true; - logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + if (count % 100 != 0) { + int[] done = removeRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch removal of Reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); + failover = true; + } else if (done.length == (count % 100)){ + logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted", (count % 100)); + } else { + failover = true; + logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + } } } catch (SQLException e) { failover = true; @@ -755,8 +685,8 @@ public void deleteManyReinforcements(Collection reins) { } /** - * Deletes a Reinforcement from the database. Should only be called - * within SaveManager + * Deletes a Reinforcement from the database. Should only be called within SaveManager + * * @param The Reinforcement to delete. */ public void deleteReinforcement(Reinforcement rein){ @@ -766,7 +696,9 @@ public void deleteReinforcement(Reinforcement rein){ return; } Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); + int x = loc.getBlockX(); + int y = loc.getBlockY(); + int z = loc.getBlockZ(); String world = loc.getWorld().getName(); try (Connection connection = db.getConnection(); PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { @@ -774,60 +706,93 @@ public void deleteReinforcement(Reinforcement rein){ removeRein.setInt(2, y); removeRein.setInt(3, z); removeRein.setString(4, world); - removeRein.execute(); + if (removeRein.executeUpdate() != 1) { + logger.log(Level.SEVERE, "No reinforcement deleted at {0}", loc); + } } catch (SQLException e) { logger.log(Level.SEVERE, "Citadel has failed to delete a reinforcement at "+ loc, e); } } + private PreparedStatement prepSaveReinforcement(Reinforcement rein, PreparedStatement updateRein) throws SQLException { + // Shared + int dur = rein.getDurability(); + int mature = rein.getMaturationTime(); + int acid = rein.getAcidTime(); + Location loc = rein.getLocation(); + int x = loc.getBlockX(); + int y = loc.getBlockY(); + int z = loc.getBlockZ(); + String world = loc.getWorld().getName(); + + // Uniques Prepped + boolean insecure = false; + int groupId = -1; + + if (rein instanceof PlayerReinforcement){ + PlayerReinforcement pRein = (PlayerReinforcement) rein; + insecure = pRein.isInsecure(); + Group g = pRein.getGroup(); + if (g == null) { + logger.log(Level.WARNING, "Player prepSaveReinforcement at {0} lacks a valid group (lookup failed)", loc); + } else { + groupId = g.getGroupId(); + } + } + + updateRein.setInt(1, dur); + updateRein.setBoolean(2, insecure); + updateRein.setInt(3, groupId); + updateRein.setInt(4, mature); + updateRein.setInt(5, acid); + updateRein.setInt(6, x); + updateRein.setInt(7, y); + updateRein.setInt(8, z); + updateRein.setString(9, world); + + return updateRein; + } + /** * Save many reinforcements all at once! * * @param reins */ - public void saveManyPlayerReinforcements(Collection reins) { + public void saveManyReinforcements(Collection reins) { if (reins == null || reins.size() == 0) return; boolean failover = false; try (Connection connection = db.getConnection(); PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - for (PlayerReinforcement rein : reins) { - int dur = rein.getDurability(); - boolean insecure = false; - int groupId = -1; - int mature = rein.getMaturationTime(); - int acid = rein.getAcidTime(); - Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - insecure = rein.isInsecure(); - Group g = rein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player saveManyReinforcement at {0} lacks a valid group (lookup failed)", loc); - } else { - groupId = g.getGroupId(); - } + int count = 0; + for (Reinforcement rein : reins) { + this.prepSaveReinforcement(rein, updateRein).addBatch(); - updateRein.setInt(1, dur); - updateRein.setBoolean(2, insecure); - updateRein.setInt(3, groupId); - updateRein.setInt(4, mature); - updateRein.setInt(5, acid); - updateRein.setInt(6, x); - updateRein.setInt(7, y); - updateRein.setInt(8, z); - updateRein.setString(9, world); - updateRein.addBatch(); + count++; + if (count % 100 == 0) { + int[] done = updateRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch save of Reinforcements -- 100 attempted -- appears to have failed."); + failover = true; + } else if (done.length == 100){ + logger.log(Level.INFO, "Saved a batch of Reinforcements -- 100 attempted"); + } else { + failover = true; + logger.log(Level.INFO, "Saved a batch of Reinforcements -- 100 attempted -- outcome indeterminate"); + } + } } - int[] done = updateRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch save of Player reinforcements -- {0} attempted -- appears to have failed.", reins.size()); - failover = true; - } else if (done.length == reins.size()){ - logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted", reins.size()); - } else { - failover = true; - logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", reins.size()); + if (count % 100 != 0) { + int[] done = updateRein.executeBatch(); + if (done == null || done.length == 0) { + logger.log(Level.WARNING, "Batch save of Player reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); + failover = true; + } else if (done.length == (count % 100)){ + logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted", (count % 100)); + } else { + failover = true; + logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + } } } catch (SQLException e) { failover = true; @@ -836,15 +801,14 @@ public void saveManyPlayerReinforcements(Collection reins) if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while saving a batch of records. Failing over to individual save logic."); - for (PlayerReinforcement rein : reins) { + for (Reinforcement rein : reins) { saveReinforcement(rein); } } } /** - * Saves the Reinforcement to the Database. Should only be called - * from SaveManager. + * Saves the Reinforcement to the Database. Should only be called from SaveManager. * @param The Reinforcement to save. */ public void saveReinforcement(Reinforcement rein){ @@ -852,65 +816,19 @@ public void saveReinforcement(Reinforcement rein){ logger.log(Level.WARNING, "CitadelReinforcementData saveReinforcement called with null"); return; } + try (Connection connection = db.getConnection(); + PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - int dur = rein.getDurability(); - boolean insecure = false; - int groupId = -1; - int mature = rein.getMaturationTime(); - int acid = rein.getAcidTime(); - Location loc = rein.getLocation(); - int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - if (rein instanceof PlayerReinforcement){ - PlayerReinforcement pRein = (PlayerReinforcement) rein; - insecure = pRein.isInsecure(); - Group g = pRein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player saveReinforcement at {0} lacks a valid group (lookup failed)", loc); - } else { - groupId = g.getGroupId(); + if (this.prepSaveReinforcement(rein, updateRein).executeUpdate() != 1) { + logger.log(Level.WARNING, "Update did not alter any records for save at {0}", rein.getLocation()); } - } else if (rein instanceof MultiBlockReinforcement){ - MultiBlockReinforcement mbRein = (MultiBlockReinforcement) rein; - insecure = false; - Group g = mbRein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player saveinsert at {0} lacks a valid group (lookup failed)", loc); - } else { - groupId = g.getGroupId(); - } - } - try (Connection connection = db.getConnection(); - PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - updateRein.setInt(1, dur); - updateRein.setBoolean(2, insecure); - updateRein.setInt(3, groupId); - updateRein.setInt(4, mature); - updateRein.setInt(5, acid); - updateRein.setInt(6, x); - updateRein.setInt(7, y); - updateRein.setInt(8, z); - updateRein.setString(9, world); - updateRein.execute(); } catch (SQLException e) { logger.log(Level.WARNING, - "The Exception that is being followed has to deal with the group id: {0}," - + " at location: {1}, {2}, {3}, at world: {4}", new Object[]{groupId, x, y, z, world}); + "Failed to save an update to reinforcement at {0}", rein.getLocation()); logger.log(Level.SEVERE, "The Exception on saving a reinforcement:", e); } } - private String formatChunk(Location loc){ - Chunk c = loc.getChunk(); - return formatChunk(c); - } - - private String formatChunk(Chunk c){ - StringBuilder chunk = new StringBuilder(c.getWorld().getName()); - chunk.append(":").append(c.getX()).append(":").append(c.getZ()); - return chunk.toString(); - } - public int getReinCountForGroup(String group){ if (group == null){ logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called with null"); From 49439fb5352a4578869e1f2dbd22824bddad7044 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 12 Oct 2016 05:10:09 -0400 Subject: [PATCH 044/255] Working but some oddness occurs with delete --- .../mc/citadel/ReinforcementManager.java | 1 + .../database/CitadelReinforcementData.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index cbdb5481..9857ea64 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -100,6 +100,7 @@ public void saveReinforcement(Reinforcement rein) { } if (rein.getDurability() <= 0) { deleteReinforcement(rein); + return; } CitadelStatics.updateHitStat(CitadelStatics.UPDATE); db.saveReinforcement(rein); diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 6c686de0..6f29d71f 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -74,8 +74,8 @@ public static ReinforcementNature decode(String label) { "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " + "FROM reinforcement WHERE chunk_x = ? and chunk_z = ? and world = ?;"; private static final String addRein = - "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id) " - + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); "; + "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, chunk_x, chunk_z) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); "; private static final String removeRein = "DELETE from reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; private static final String updateRein = "UPDATE reinforcement SET durability = ?, insecure = ?, group_id = ?, maturation_time = ?, acid_time = ? " @@ -270,13 +270,13 @@ public Boolean call() throws Exception { + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); db.registerMigration(12, false, - "CREATE TABLE reinforcements_temp (" + "CREATE TABLE reinforcement_temp (" + "rein_id int not null auto_increment," + "x int not null," + "y int not null," + "z int not null," - + "chunk_x int not null default floor(x / 16)," - + "chunk_z int not null default floor(z / 16)," + + "chunk_x int not null," + + "chunk_z int not null," + "world varchar(255) not null," + "material_id int not null," + "durability varchar(10) not null," @@ -290,7 +290,7 @@ public Boolean call() throws Exception { + "unique index realcoord (x,y,z,world)," + "index chunkcoord(chunk_x, chunk_z, world)" + ");", - "INSERT IGNORE INTO reinforcements_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " + "INSERT IGNORE INTO reinforcement_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", "RENAME TABLE reinforcement_id TO deprecated_reinforcement_id;", @@ -492,6 +492,8 @@ private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement i int dur = rein.getDurability(); int maturationTime = rein.getMaturationTime(); int acidTime = rein.getAcidTime(); + int cx = loc.getChunk().getX(); + int cz = loc.getChunk().getZ(); // specific fields, "safe" values. boolean insecure = false; @@ -539,6 +541,8 @@ private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement i insertRein.setInt(10, type); insertRein.setString(11, lore); insertRein.setInt(12, groupId); + insertRein.setInt(13, cx); + insertRein.setInt(14, cz); return insertRein; } From b3767214997aafd3c9de0a4e130f8bf52cc4abc5 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 12 Oct 2016 18:36:02 -0400 Subject: [PATCH 045/255] cleanups --- .../mc/citadel/ReinforcementManager.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 9857ea64..71960f19 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -38,6 +38,13 @@ public class ReinforcementManager { // we are clear to batch all operations of like-kind as there will be no overlap. // Meanwhile, a new dirty cache will begin accumulating. + // TODO: For chunk loading, on block break peek() at end of a queue, if diff chunk, offer() the chunk + // of cache MISS. + // Then, a scheduled task runs every second, or several works running continuously, goes through that queue. + // This task keeps a list of chunks that have been loaded, and how long ago + // if last time was longer then the cachetimeout, the chunk is reloaded on request, otherwise + // skipped. and so on. + private CitadelReinforcementData db; private long dayMultiplier; @@ -204,9 +211,10 @@ public void deleteReinforcement(Reinforcement rein) { Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager deleteReinforcement called with null"); return; } + rein.setDirty(false); reinforcements.invalidate(rein.getLocation()); - CitadelStatics.updateHitStat(CitadelStatics.DELETE); db.deleteReinforcement(rein); + CitadelStatics.updateHitStat(CitadelStatics.DELETE); } /** @@ -323,18 +331,28 @@ public List getReinforcementsByChunk(Chunk chunk){ /** * Identical to {@link #getReinforcementsByChunk(Chunk)} + * just doesn't try to return anything */ public void loadReinforcementChunk(Chunk chunk) { if (chunk == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager loadReinforcementChunk called with null"); return; } + long s = System.currentTimeMillis(); List reins = db.getReinforcements(chunk); + int count = 0; for (Reinforcement rein: reins){ Reinforcement r = reinforcements.getIfPresent(rein.getLocation()); if (r == null || r instanceof NullReinforcement) { reinforcements.put(rein.getLocation(), rein); + count++; } } + if (count > 0 && CitadelConfigManager.shouldLogInternal()) { + s = System.currentTimeMillis() - s; + Citadel.getInstance().getLogger().log(Level.INFO, + "Chunk load {0} complete in {1} ms. Added {2} entries to the cache.", + new Object[] {chunk.toString(), s, count}); + } } } From 91b7bf19ed98b8098bc197d0889d19be70635e2b Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 13 Oct 2016 05:54:09 -0400 Subject: [PATCH 046/255] Stripping out what I can, still longer then desired latency, apparently update is just slow> --- .../mc/citadel/ReinforcementManager.java | 3 ++- src/vg/civcraft/mc/citadel/Utility.java | 2 +- .../database/CitadelReinforcementData.java | 24 +++++++++++++++---- .../mc/citadel/listener/BlockListener.java | 5 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 71960f19..c3ad7113 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -123,6 +123,7 @@ public void saveManyReinforcements(List reins) { List updates = new ArrayList(reins.size()); for (Reinforcement rein : reins) { if (rein.getDurability() <= 0) { + rein.setDirty(false); reinforcements.invalidate(rein.getLocation()); CitadelStatics.updateHitStat(CitadelStatics.DELETE); removes.add(rein); @@ -135,7 +136,7 @@ public void saveManyReinforcements(List reins) { Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement removing {0}", removes.size()); db.deleteManyReinforcements(removes); - Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving player reinfs {0}", updates.size()); + Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving reinfs {0}", updates.size()); db.saveManyReinforcements(updates); } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 6571cec5..343aca1a 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -473,7 +473,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc if (reinforcement instanceof PlayerReinforcement) { // leave message } - rm.saveReinforcement(reinforcement); + //rm.saveReinforcement(reinforcement); if(reinforcement instanceof PlayerReinforcement){ playReinforcementEffect((PlayerReinforcement)reinforcement); } diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 6f29d71f..e2298d33 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -765,15 +765,25 @@ private PreparedStatement prepSaveReinforcement(Reinforcement rein, PreparedStat public void saveManyReinforcements(Collection reins) { if (reins == null || reins.size() == 0) return; boolean failover = false; + StringBuilder sb = new StringBuilder(); + long s = System.currentTimeMillis(); + long t = 0; try (Connection connection = db.getConnection(); PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { int count = 0; - for (Reinforcement rein : reins) { + t = System.currentTimeMillis(); + sb.append(t - s).append("ms setup "); + for (Reinforcement rein : reins) { + s = System.currentTimeMillis(); this.prepSaveReinforcement(rein, updateRein).addBatch(); - + t = System.currentTimeMillis(); + sb.append(t - s).append(" "); count++; if (count % 100 == 0) { + s = System.currentTimeMillis(); int[] done = updateRein.executeBatch(); + t = System.currentTimeMillis(); + sb.append(t - s).append(" batch "); if (done == null || done.length == 0) { logger.log(Level.WARNING, "Batch save of Reinforcements -- 100 attempted -- appears to have failed."); failover = true; @@ -787,15 +797,18 @@ public void saveManyReinforcements(Collection reins) { } if (count % 100 != 0) { + s = System.currentTimeMillis(); int[] done = updateRein.executeBatch(); + t = System.currentTimeMillis(); + sb.append(t - s).append(" batch "); if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch save of Player reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); + logger.log(Level.WARNING, "Batch save of reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); failover = true; } else if (done.length == (count % 100)){ - logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted", (count % 100)); + logger.log(Level.INFO, "Saved a batch of reinforcements -- {0} attempted", (count % 100)); } else { failover = true; - logger.log(Level.INFO, "Saved a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + logger.log(Level.INFO, "Saved a batch of reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); } } } catch (SQLException e) { @@ -803,6 +816,7 @@ public void saveManyReinforcements(Collection reins) { logger.log(Level.SEVERE, "Citadel encountered a critical error while saving a batch of reinforcements", e); } + logger.log(Level.INFO, sb.toString()); if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while saving a batch of records. Failing over to individual save logic."); for (Reinforcement rein : reins) { diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 6c6f2061..3086cb74 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -602,8 +602,7 @@ public void interact(PlayerInteractEvent pie) { if (reinforcement.canMakeInsecure(player)) { reinforcement.toggleInsecure(); // Save the change - Citadel.getReinforcementManager().saveReinforcement( - reinforcement); + /*Citadel.getReinforcementManager().saveReinforcement(reinforcement);*/ if (reinforcement.isInsecure()) { sendAndLog(player, ChatColor.YELLOW, "Reinforcement now insecure"); @@ -674,7 +673,7 @@ public void interact(PlayerInteractEvent pie) { reinforcement, block, player); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { - rm.saveReinforcement(reinforcement); + //rm.saveReinforcement(reinforcement); message = "Group has been changed to: " + group.getName() + "."; sendAndLog(player, ChatColor.GREEN, message); From d7a0ec15e7dc5cf39e93b649684a2488b79d1c85 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Fri, 14 Oct 2016 08:57:51 -0400 Subject: [PATCH 047/255] Changing access to GM to use ID when possible, which should be resistent stable against namelayer merges and such --- .../reinforcement/PlayerReinforcement.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index 29aca7c3..ecbb287a 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -43,7 +43,7 @@ public boolean canBypass(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("BYPASS_REINFORCEMENT")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("BYPASS_REINFORCEMENT")); } public boolean canAccessCrops(Player p) { @@ -51,7 +51,7 @@ public boolean canAccessCrops(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("CROPS")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CROPS")); } public boolean canAccessChests(Player p) { @@ -59,7 +59,7 @@ public boolean canAccessChests(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("CHESTS")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CHESTS")); } public boolean canAccessDoors(Player p) { @@ -67,7 +67,7 @@ public boolean canAccessDoors(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("DOORS")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("DOORS")); } public boolean canViewInformation(Player p) { @@ -75,7 +75,7 @@ public boolean canViewInformation(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("REINFORCEMENT_INFO")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("REINFORCEMENT_INFO")); } public boolean canMakeInsecure(Player p) { @@ -83,7 +83,7 @@ public boolean canMakeInsecure(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("INSECURE_REINFORCEMENT")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("INSECURE_REINFORCEMENT")); } public boolean canAcid(Player p) { @@ -91,7 +91,7 @@ public boolean canAcid(Player p) { if (g == null) { return false; } - return gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("ACIDBLOCK")); + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("ACIDBLOCK")); } public boolean isSecurable() { @@ -99,6 +99,7 @@ public boolean isSecurable() { } public int getDamageMultiplier(){ + checkValid(); if (g == null){ return 1; } From a8f5584d9b6536256b1abf1a193c5704136290f1 Mon Sep 17 00:00:00 2001 From: Gordon Date: Sun, 9 Oct 2016 14:58:44 -0500 Subject: [PATCH 048/255] Fix Acid block event --- .../mc/citadel/events/AcidBlockEvent.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java b/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java index 39dd220f..538341ef 100644 --- a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java +++ b/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java @@ -2,38 +2,51 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -public class AcidBlockEvent extends Event implements Cancellable{ +/** + * Event that is called when an acid block action is performed + * + */ +public class AcidBlockEvent extends PlayerEvent implements Cancellable { private static final HandlerList handlers = new HandlerList(); - - private Player p; - private PlayerReinforcement acidBlock; - private PlayerReinforcement destroyedBlock; - public AcidBlockEvent(Player p, PlayerReinforcement acidBlock, - PlayerReinforcement destroyedBlock){ - this.p = p; + + private final PlayerReinforcement acidBlock; + private final PlayerReinforcement destroyedBlock; + + /** + * Creates a new AcidBlockEvent instance + * @param player The player performing the acid action + * @param acidBlock The acid block instance + * @param destroyedBlock The destroyed block instance + */ + public AcidBlockEvent(final Player player, final PlayerReinforcement acidBlock, + PlayerReinforcement destroyedBlock) { + super(player); + this.acidBlock = acidBlock; this.destroyedBlock = destroyedBlock; } + /** * Gets the PlayerReinforcement on the acid block. * @return Returns the PlayerReinforcement. */ - public PlayerReinforcement getAcidBlockReinforcement(){ + public PlayerReinforcement getAcidBlockReinforcement() { return acidBlock; } + /** * Gets the PlayerReinforcement on the block above the Acid Block. * @return Returns the PlayerReinforcement for the block above the Acid Block. */ - public PlayerReinforcement getDestoryedBlockReinforcement(){ + public PlayerReinforcement getDestroyedBlockReinforcement() { return destroyedBlock; } - + private boolean isCancelled = false; @Override public boolean isCancelled() { @@ -49,8 +62,8 @@ public void setCancelled(boolean value) { public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; - } + } } \ No newline at end of file From 4f8a6f5d7fa63f58b33c978780f0492c8b324d7f Mon Sep 17 00:00:00 2001 From: Gordon Date: Sun, 9 Oct 2016 18:00:01 -0500 Subject: [PATCH 049/255] re-add typo method and depreciate it --- src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java b/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java index 538341ef..245663b6 100644 --- a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java +++ b/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java @@ -46,6 +46,16 @@ public PlayerReinforcement getAcidBlockReinforcement() { public PlayerReinforcement getDestroyedBlockReinforcement() { return destroyedBlock; } + + /** + * @Deprecated + * @return Returns the PlayerReinforcement for the block above the Acid Block. + * @deprecated Use getDestroyedBlockReinforcement instead. + */ + @Deprecated + public PlayerReinforcement getDestoryedBlockReinforcement() { + return destroyedBlock; + } private boolean isCancelled = false; @Override From 5035bb51807ab37cc8fb72377be84c2cf83c5872 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sat, 15 Oct 2016 09:48:08 -0400 Subject: [PATCH 050/255] Version update --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d44f432d..7c4432d4 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.7.0 + 3.7.01 Citadel https://github.com/Civcraft/Citadel From 563c5efa52c4f402043a0461de66cd5022c2f960 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sat, 15 Oct 2016 18:05:56 -0400 Subject: [PATCH 051/255] Fixing a persistent exception stack that is annoying. --- pom.xml | 10 +++++----- src/vg/civcraft/mc/citadel/Utility.java | 8 +++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 7c4432d4..3676b1de 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.7.01 + 3.7.02 Citadel https://github.com/Civcraft/Citadel @@ -16,8 +16,8 @@ maven-compiler-plugin 2.3.2 - 1.7 - 1.7 + 1.8 + 1.8 @@ -41,7 +41,7 @@ org.spigotmc spigot-api - 1.10-R0.1-SNAPSHOT + 1.10.2-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore @@ -52,7 +52,7 @@ vg.civcraft.mc.namelayer NameLayer - 2.9.02 + 2.9.06 provided diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 343aca1a..4ff24364 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -781,6 +781,7 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac "Utility isDroppedReinforcementBlock called with null"); return null; } + if (!CitadelConfigManager.shouldDropReinforcedBlock()) return null; ItemMeta meta = stack.getItemMeta(); List lore = meta.getLore(); try{ @@ -791,7 +792,12 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac if (!value.hasNext()) { return null; } - Material mat = Material.valueOf(value.next()); + Material mat = null; + try { + mat = Material.valueOf(value.next()); + } catch (IllegalArgumentException iae) { + return null; + } if (!value.hasNext()) { return null; } From ae926afd8bee015c60a35bace5350f705cbf47cf Mon Sep 17 00:00:00 2001 From: Bot Bottinson Date: Mon, 31 Oct 2016 20:15:31 +0100 Subject: [PATCH 052/255] Use Devoted jenkins and update dependencies --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3676b1de..e33c3393 100644 --- a/pom.xml +++ b/pom.xml @@ -46,13 +46,13 @@ vg.civcraft.mc.civmodcore CivModCore - 1.5.02 + 1.5.09 provided vg.civcraft.mc.namelayer NameLayer - 2.9.06 + 2.9.08 provided @@ -72,7 +72,7 @@ civcraft-repo - http://build.civcraft.co:8080/plugin/repository/everything/ + https://build.devotedmc.com/plugin/repository/everything/ spigot-repo From 2dd247011c983d556d46d9c09a1a0dd193fbbbac Mon Sep 17 00:00:00 2001 From: biggestnerd Date: Sat, 17 Dec 2016 14:31:48 -0600 Subject: [PATCH 053/255] Update config.yml --- config.yml | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/config.yml b/config.yml index 619d44c1..7a6d7cec 100644 --- a/config.yml +++ b/config.yml @@ -42,6 +42,36 @@ reinforcements: type: FLYING_GLYPH speed: 0.5 particleCount: 50 + iron_tier: + material: IRON_INGOT + requirements: 1 + return: 1 + percent_chance: 100 + hit_points: 300 +# mature time is in minutes + mature_time: 60 + acid_time: 90 + scale_amount: 1 + lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 + diamond_tier: + material: DIAMOND + requirements: 1 + return: 1 + percent_chance: 100 + hit_points: 2000 +# mature time is in minutes + mature_time: 1440 + acid_time: 2880 + scale_amount: 1 + lore: + effect: + type: FLYING_GLYPH + speed: 0.5 + particleCount: 50 # Delete the comment char to use lore. Three spaces are required # after lore. You can add multiple lines by adding - # - Some string representation required for this reinforcement. @@ -109,9 +139,9 @@ reinforcement_damageMultiplier: 365 mysql: hostname: "localhost" port: 3306 - dbname: "bukkit" - username: "bukkit" - password: "" + dbname: "civclassic" + username: "root" + password: "thisisnotourpassword" # Shows reinforcement information as percentile value show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login From a9c4189763dafeb4a226fff5dadf3ef99217ad7b Mon Sep 17 00:00:00 2001 From: Aleksey-Terzi Date: Thu, 5 Jan 2017 19:59:52 +0200 Subject: [PATCH 054/255] Avoid warnings and update dependencies to spigot 1.11 (#26) * Avoid warnings and update dependencies to spigot 1.11 * Update version --- config.yml | 2 +- pom.xml | 8 +-- .../mc/citadel/CitadelConfigManager.java | 12 ++-- src/vg/civcraft/mc/citadel/Utility.java | 2 +- .../command/commands/AreaReinforce.java | 7 ++- .../mc/citadel/command/commands/Bypass.java | 10 +--- .../command/commands/Fortification.java | 8 +-- .../command/commands/PlayerCommandMiddle.java | 1 - .../citadel/command/commands/Reinforce.java | 2 +- .../mc/citadel/command/commands/Stats.java | 3 +- .../commands/UpdateReinforcements.java | 7 +-- .../database/CitadelReinforcementData.java | 1 - .../mc/citadel/listener/BlockListener.java | 12 ++-- .../mc/citadel/listener/EntityListener.java | 3 +- .../mc/citadel/listener/GroupsListener.java | 4 -- .../citadel/listener/InventoryListener.java | 4 -- .../mc/citadel/listener/ShardListener.java | 4 +- .../misc/LoadingCacheNullException.java | 2 + ...forcemnetFortificationCancelException.java | 2 + .../MultiBlockReinforcement.java | 4 +- .../ReinforcementEffect.java | 57 ++++++------------- 21 files changed, 57 insertions(+), 98 deletions(-) diff --git a/config.yml b/config.yml index 619d44c1..179b20d4 100644 --- a/config.yml +++ b/config.yml @@ -39,7 +39,7 @@ reinforcements: scale_amount: 1 lore: effect: - type: FLYING_GLYPH + type: ENCHANTMENT_TABLE speed: 0.5 particleCount: 50 # Delete the comment char to use lore. Three spaces are required diff --git a/pom.xml b/pom.xml index e33c3393..0c0ebb1a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.7.02 + 3.8.00 Citadel https://github.com/Civcraft/Citadel @@ -41,18 +41,18 @@ org.spigotmc spigot-api - 1.10.2-R0.1-SNAPSHOT + 1.11-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore CivModCore - 1.5.09 + 1.5.11 provided vg.civcraft.mc.namelayer NameLayer - 2.9.08 + 2.10.0 provided diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 95a50e8f..3df55e9a 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -6,8 +6,8 @@ import java.util.Set; import java.util.logging.Level; -import org.bukkit.Effect; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.configuration.file.FileConfiguration; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementEffect; @@ -97,23 +97,21 @@ public static List getLoreValues(String type){ } public static ReinforcementEffect getReinforcementEffect(String type){ - Effect effect = null; + Particle effect = null; if (config.getString("reinforcements." + type + ".effect.type") != null) { try { - effect = Effect.valueOf(config.getString("reinforcements." + type + ".effect.type")); + String effectName = config.getString("reinforcements." + type + ".effect.type"); + effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE: Particle.valueOf(effectName); } catch (IllegalArgumentException e) { Citadel.getInstance().getLogger().log(Level.WARNING, "Invalid effect at: " + config.getCurrentPath()); return null; } - int id = config.getInt("reinforcements." + type + ".effect.id", 0); - int data = config.getInt("reinforcements." + type + ".effect.data", 0); float offsetX = (float) config.getDouble("reinforcements." + type + ".effect.offsetX", 0); float offsetY = (float) config.getDouble("reinforcements." + type + ".effect.offsetY", 0); float offsetZ = (float) config.getDouble("reinforcements." + type + ".effect.offsetZ", 0); float speed = (float) config.getDouble("reinforcements." + type + ".effect.speed", 1); int amount = config.getInt("reinforcements." + type + ".effect.particleCount", 1); - int viewDistance = config.getInt("reinforcements." + type + ".effect.view_distance", 16); - return new ReinforcementEffect(effect, id, data, offsetX, offsetY, offsetZ, speed, amount, viewDistance); + return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); } return null; } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 4ff24364..b8a1405e 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -159,7 +159,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group // Handle special case with block reinforcements. if (type.getMaterial().isBlock()){ if (slots.size()>1){ - if (inv.getItemInHand().isSimilar(itemType) && PlayerState.get(player).getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && slots.get(0) != inv.getHeldItemSlot()){ + if (inv.getItemInMainHand().isSimilar(itemType) && PlayerState.get(player).getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && slots.get(0) != inv.getHeldItemSlot()){ requirements--; } } diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java index 458aa8a9..c881f245 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java @@ -46,8 +46,9 @@ public boolean execute(CommandSender sender, String[] args) { sendAndLog(p, ChatColor.RED, "Nice try"); return true; } - ReinforcementType rt = ReinforcementType.getReinforcementType(p - .getItemInHand()); + + ReinforcementType rt = ReinforcementType.getReinforcementType(p.getInventory().getItemInMainHand()); + if (rt == null) { sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); return true; @@ -62,7 +63,7 @@ public boolean execute(CommandSender sender, String[] args) { } else { groupName = args[0]; } - Group g = gm.getGroup(groupName); + Group g = GroupManager.getGroup(groupName); if (g == null) { sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java index e5a484d6..5c037711 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java @@ -1,19 +1,15 @@ package vg.civcraft.mc.citadel.command.commands; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementManager; - -import java.util.ArrayList; -import java.util.List; public class Bypass extends PlayerCommandMiddle{ - private ReinforcementManager rm = Citadel.getReinforcementManager(); - public Bypass(String name) { super(name); setIdentifier("ctb"); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index bd206fd1..d05b8932 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -3,15 +3,14 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; + import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; @@ -22,7 +21,6 @@ import vg.civcraft.mc.namelayer.permission.PermissionType; public class Fortification extends PlayerCommandMiddle{ - private ReinforcementManager rm = Citadel.getReinforcementManager(); private GroupManager gm = NameAPI.getGroupManager(); public Fortification(String name) { @@ -52,7 +50,7 @@ public boolean execute(CommandSender sender, String[] args) { else{ groupName = args[0]; } - Group g = gm.getGroup(groupName); + Group g = GroupManager.getGroup(groupName); if (g == null){ sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; @@ -68,7 +66,7 @@ public boolean execute(CommandSender sender, String[] args) { + "place a reinforcement on this group."); return true; } - ItemStack stack = p.getItemInHand(); + ItemStack stack = p.getInventory().getItemInMainHand(); PlayerState state = PlayerState.get(p); ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION){ diff --git a/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java b/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java index e2ec7953..56a1c347 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java +++ b/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java @@ -4,7 +4,6 @@ import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelConfigManager; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index aba1851a..748e29fc 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -46,7 +46,7 @@ public boolean execute(CommandSender sender, String[] args) { else{ groupName = args[0]; } - Group g = gm.getGroup(groupName); + Group g = GroupManager.getGroup(groupName); if (g == null){ sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Stats.java b/src/vg/civcraft/mc/citadel/command/commands/Stats.java index f4b90ccc..02d71ac0 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Stats.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Stats.java @@ -17,7 +17,6 @@ public class Stats extends PlayerCommandMiddle{ private List run = new ArrayList(); - private GroupManager gm = NameAPI.getGroupManager(); public Stats(String name) { super(name); @@ -42,7 +41,7 @@ public boolean execute(CommandSender sender, String[] args) { Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new StatsMessageAllGroups(p)); return true; } - Group g = gm.getGroup(args[0]); + Group g = GroupManager.getGroup(args[0]); if (g == null){ sendAndLog(p, ChatColor.RED, "This group does not exist."); diff --git a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java b/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java index 4063e604..0b0136e3 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java +++ b/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java @@ -16,13 +16,10 @@ import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; public class UpdateReinforcements extends PlayerCommandMiddle{ - private GroupManager gm = NameAPI.getGroupManager(); - public UpdateReinforcements(String name) { super(name); setIdentifier("ctur"); @@ -53,8 +50,8 @@ else if (args.length == 1){ return true; } - Group old = gm.getGroup(args[0]); - Group n = gm.getGroup(args[1]); + Group old = GroupManager.getGroup(args[0]); + Group n = GroupManager.getGroup(args[1]); if (old == null || n == null){ sendAndLog(p, ChatColor.RED, "One of the groups does not exist."); diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index e2298d33..43eaf4ec 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -600,7 +600,6 @@ public void insertManyReinforcements(Collection reins) { } } - @SuppressWarnings("deprecation") public void insertReinforcement(Reinforcement rein, boolean retry){ if (rein == null){ logger.log(Level.WARNING, "CitadelReinforcementData insertReinforcement called with null"); diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 3086cb74..9230a01a 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -313,23 +313,23 @@ public void blockBurn(BlockBurnEvent bbe) { Block block = bbe.getBlock(); // Basic essential fire protection if (block.getRelative(0, 1, 0).getType() == matfire) { - block.getRelative(0, 1, 0).setTypeId(0); + block.getRelative(0, 1, 0).setType(Material.AIR); } // Essential // Extended fire protection (recommend) if (block.getRelative(1, 0, 0).getType() == matfire) { - block.getRelative(1, 0, 0).setTypeId(0); + block.getRelative(1, 0, 0).setType(Material.AIR); } if (block.getRelative(-1, 0, 0).getType() == matfire) { - block.getRelative(-1, 0, 0).setTypeId(0); + block.getRelative(-1, 0, 0).setType(Material.AIR); } if (block.getRelative(0, -1, 0).getType() == matfire) { - block.getRelative(0, -1, 0).setTypeId(0); + block.getRelative(0, -1, 0).setType(Material.AIR); } if (block.getRelative(0, 0, 1).getType() == matfire) { - block.getRelative(0, 0, 1).setTypeId(0); + block.getRelative(0, 0, 1).setType(Material.AIR); } if (block.getRelative(0, 0, -1).getType() == matfire) { - block.getRelative(0, 0, -1).setTypeId(0); + block.getRelative(0, 0, -1).setType(Material.AIR); } // Aggressive fire protection (would seriously reduce effectiveness // of flint down to near the "you'd have to use it 25 times" diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 6211c5e2..ab9dc90c 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -36,9 +36,8 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; +import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; diff --git a/src/vg/civcraft/mc/citadel/listener/GroupsListener.java b/src/vg/civcraft/mc/citadel/listener/GroupsListener.java index 6b53220d..c150f14d 100644 --- a/src/vg/civcraft/mc/citadel/listener/GroupsListener.java +++ b/src/vg/civcraft/mc/citadel/listener/GroupsListener.java @@ -4,14 +4,10 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.namelayer.events.GroupDeleteEvent; import vg.civcraft.mc.namelayer.events.GroupMergeEvent; public class GroupsListener implements Listener { - private ReinforcementManager rm = Citadel.getReinforcementManager(); - @EventHandler(priority = EventPriority.HIGHEST) public void deleteGroupEvent(GroupDeleteEvent event){ } diff --git a/src/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/vg/civcraft/mc/citadel/listener/InventoryListener.java index 5d509e1c..fa6dcd8c 100644 --- a/src/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -1,8 +1,5 @@ package vg.civcraft.mc.citadel.listener; -import java.util.Set; -import java.util.TreeSet; - import org.bukkit.Location; import org.bukkit.block.BlockState; import org.bukkit.block.DoubleChest; @@ -21,7 +18,6 @@ public class InventoryListener implements Listener { private ReinforcementManager rm = Citadel.getReinforcementManager(); - private Set priorMessages_ = new TreeSet(); public PlayerReinforcement getReinforcement(Inventory inv) { // Returns reinforcement of the inventory's holder or null if none diff --git a/src/vg/civcraft/mc/citadel/listener/ShardListener.java b/src/vg/civcraft/mc/citadel/listener/ShardListener.java index 65c19b7d..7d5c7f32 100644 --- a/src/vg/civcraft/mc/citadel/listener/ShardListener.java +++ b/src/vg/civcraft/mc/citadel/listener/ShardListener.java @@ -16,7 +16,7 @@ import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.mercury.MercuryAPI; import vg.civcraft.mc.mercury.events.AsyncPluginBroadcastMessageEvent; -import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.group.Group; public class ShardListener implements Listener { @@ -81,7 +81,7 @@ public void messageReceive(AsyncPluginBroadcastMessageEvent e) { } if (mode == ReinforcementMode.REINFORCEMENT || mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - Group g = NameAPI.getGroupManager().getGroup(data[3]); + Group g = GroupManager.getGroup(data[3]); ps.setGroup(g); if (mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { Material m = Material.valueOf(data[4]); diff --git a/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java b/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java index 8a5dd672..335d6b1a 100644 --- a/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java +++ b/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java @@ -2,6 +2,8 @@ public class LoadingCacheNullException extends RuntimeException{ + private static final long serialVersionUID = -1664671367153338518L; + public LoadingCacheNullException(String message){ super(message); } diff --git a/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java b/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java index 4bd03710..4f7b42da 100644 --- a/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java +++ b/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java @@ -2,6 +2,8 @@ public class ReinforcemnetFortificationCancelException extends RuntimeException{ + private static final long serialVersionUID = 5122048063360583699L; + public ReinforcemnetFortificationCancelException(){ } diff --git a/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java index 3bfc641a..2406a37f 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java @@ -8,7 +8,7 @@ import org.bukkit.Location; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.group.Group; public class MultiBlockReinforcement extends Reinforcement{ @@ -53,7 +53,7 @@ private void checkValid(){ return; } if (!g.isValid()){ // incase it was recently merged/ deleted. - g = NameAPI.getGroupManager().getGroup(g.getGroupId()); + g = GroupManager.getGroup(g.getGroupId()); if (g == null) { Citadel.getInstance().getLogger().log(Level.INFO, "Group " + g.getGroupId() + " was deleted or merged but not marked invalid!"); } diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java index 49dedd92..f960db14 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java @@ -1,54 +1,39 @@ package vg.civcraft.mc.citadel.reinforcementtypes; -import org.bukkit.Effect; import org.bukkit.Location; +import org.bukkit.Particle; public class ReinforcementEffect { - private Effect effect; - private int id; - private int data; + private Particle particle; private float offsetX; private float offsetY; private float offsetZ; private float speed; private int particleCount; - private int viewDistance; - public ReinforcementEffect(Effect effect, int id, int data, float offsetX, float offsetY, float offsetZ, - float speed, int particleCount, int viewDistance) { - this.effect = effect; - this.id = id; - this.data = data; + public ReinforcementEffect( + Particle particle, + float offsetX, + float offsetY, + float offsetZ, + float speed, + int particleCount + ) + { + this.particle = particle; this.offsetX = offsetX; this.offsetY = offsetY; this.offsetZ = offsetZ; this.speed = speed; this.particleCount = particleCount; - this.viewDistance = viewDistance; } /** * * @return the type of particle used in this effect */ - public Effect getEffect() { - return effect; - } - - /** - * - * @return the item/block/data id for the effect - */ - public int getId() { - return id; - } - - /** - * - * @return the data value of the block/item for the effect - */ - public int getData() { - return data; + public Particle getParticle() { + return particle; } /** @@ -91,25 +76,17 @@ public int getParticleCount() { return particleCount; } - /** - * - * @return the distance from which players will be able to see the effect. - */ - public int getViewDistance() { - return viewDistance; - } - /** * Display an effect defined in the config around a reinforcement. * @param location the location of the reinforcement. */ public void playEffect(Location location){ - location.getWorld().spigot().playEffect(location, effect, id, data, offsetX, offsetY, offsetZ, speed, particleCount, viewDistance); + location.getWorld().spawnParticle(particle, location, particleCount, offsetX, offsetY, offsetZ, speed, null); } public String toString() { return String.format( - " type: %s \n id: %d \n data: %d \n offsetX: %f \n offsetY: %f \n offsetZ: %f \n speed: %f \n particleCount: %d \n viewDistance: %d", - effect, id, data, offsetX, offsetY, offsetZ, speed, particleCount, viewDistance); + " type: %s \n offsetX: %f \n offsetY: %f \n offsetZ: %f \n speed: %f \n particleCount: %d", + particle, offsetX, offsetY, offsetZ, speed, particleCount); } } From de62a8a09735ee10253e4e3a3770f30605555b9f Mon Sep 17 00:00:00 2001 From: Aleksey-Terzi Date: Wed, 8 Feb 2017 16:55:57 +0200 Subject: [PATCH 055/255] When block is reinforced by lored reinforcement then on /cti show quoted first line of lore instead of material name --- pom.xml | 2 +- .../citadel/reinforcement/PlayerReinforcement.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0c0ebb1a..bd19ff81 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.8.00 + 3.8.01 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index ecbb287a..4a64b98b 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; @@ -26,6 +27,7 @@ public class PlayerReinforcement extends Reinforcement{ private static GroupManager gm; private boolean isInsecure = false; private ItemStack stack; + private String materialName; public PlayerReinforcement(Location loc, int health, int creation, int acid, Group g, ItemStack stack) { @@ -36,7 +38,12 @@ public PlayerReinforcement(Location loc, int health, gm = NameAPI.getGroupManager(); } this.gid = g.getGroupId(); - } + + ItemMeta meta = this.stack.hasItemMeta() ? this.stack.getItemMeta(): null; + String lore = meta != null && meta.hasLore() && meta.getLore().size() > 0 ? meta.getLore().get(0): null; + + this.materialName = lore != null && lore.length() > 0 ? "\"" + lore + "\"": stack.getType().name(); + } public boolean canBypass(Player p) { checkValid(); @@ -217,7 +224,8 @@ public String getStatus() { } else { verb = "Reinforced"; } - return String.format("%s %s with %s", verb, getHealthText(), getMaterial().name()); + + return String.format("%s %s with %s", verb, getHealthText(), this.materialName); } private void checkValid(){ From 730717bf7a753d2d189c3109b1d97acc9906b065 Mon Sep 17 00:00:00 2001 From: Mr_Little_Kitty Date: Tue, 7 Mar 2017 23:30:58 -0800 Subject: [PATCH 056/255] Only allow comparators to be placed next to insecure inventory blocks --- pom.xml | 6 +-- .../mc/citadel/listener/BlockListener.java | 41 +++++++++++++++---- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index bd19ff81..5def5fa6 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.8.01 + 3.8.02 Citadel https://github.com/Civcraft/Citadel @@ -57,8 +57,8 @@ vg.civcraft.mc.bettershards - BetterShards - 1.4 + BetterShardsBukkit + 1.0.0 provided diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 9230a01a..fe68235e 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -42,7 +42,9 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; +import org.bukkit.material.Comparator; import org.bukkit.material.MaterialData; import org.bukkit.material.Openable; @@ -74,6 +76,29 @@ public class BlockListener implements Listener { private ReinforcementManager rm = Citadel.getReinforcementManager(); + //Stop comparators from being placed unless the reinforcement is insecure + @EventHandler(priority = EventPriority.HIGH,ignoreCancelled = true) + public void comparatorPlaceCheck(BlockPlaceEvent event) + { + //We only care if they are placing a comparator + if(event.getBlockPlaced().getType() == Material.REDSTONE_COMPARATOR_OFF) + { + Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); + Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); + //We only care if the comparator is going placed against something with an inventory + if(block.getState() instanceof InventoryHolder) + { + Reinforcement rein = rm.getReinforcement(block); + if (rein != null && rein instanceof PlayerReinforcement) + { + PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; + if (!playerReinforcement.isInsecure()) //Only let them place against /ctinsecure + event.setCancelled(true); + } + } + } + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFortificationMode(BlockPlaceEvent event){ Player p = event.getPlayer(); @@ -95,7 +120,7 @@ public void onFortificationMode(BlockPlaceEvent event){ } } } - + rm.deleteReinforcement(rein); } ItemStack stack = event.getItemInHand(); @@ -117,7 +142,7 @@ public void onFortificationMode(BlockPlaceEvent event){ return; } groupToReinforceTo = state.getGroup(); - }else if(state.getMode() == ReinforcementMode.NORMAL) { + }else if(state.getMode() == ReinforcementMode.NORMAL) { if (!state.getEasyMode()) { return; } @@ -136,7 +161,7 @@ public void onFortificationMode(BlockPlaceEvent event){ else { return; } - + if (!canPlace(b, p)){ sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); event.setCancelled(true); @@ -164,13 +189,13 @@ public void onFortificationMode(BlockPlaceEvent event){ sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); } else { state.checkResetMode(); - } + } } catch(ReinforcemnetFortificationCancelException ex){ Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); } } else { if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", + sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", state.getReinforcementType().getMaterial().name())); state.reset(); event.setCancelled(true); @@ -488,8 +513,8 @@ public void interact(PlayerInteractEvent pie) { if (!canPlace(block, player)){ sendAndLog(player, ChatColor.RED, "Cancelled interact easymode rein, mismatched reinforcement."); return; - } - + } + String gName = gm.getDefaultGroup(player.getUniqueId()); Group g = null; if (gName != null) { @@ -507,7 +532,7 @@ public void interact(PlayerInteractEvent pie) { e); } } - } + } } return; case REINFORCEMENT_FORTIFICATION: From 0826069e668d020c4627ce2648d34f52ad3bf72c Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sun, 26 Mar 2017 16:18:20 -0400 Subject: [PATCH 057/255] Exception for CHESTS permission on the group, so that owners don't need to insecure their own chests to use comparators with them. --- .../mc/citadel/listener/BlockListener.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index fe68235e..ba6c917c 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -81,22 +81,28 @@ public class BlockListener implements Listener { public void comparatorPlaceCheck(BlockPlaceEvent event) { //We only care if they are placing a comparator - if(event.getBlockPlaced().getType() == Material.REDSTONE_COMPARATOR_OFF) - { - Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); - Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); - //We only care if the comparator is going placed against something with an inventory - if(block.getState() instanceof InventoryHolder) - { - Reinforcement rein = rm.getReinforcement(block); - if (rein != null && rein instanceof PlayerReinforcement) - { - PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; - if (!playerReinforcement.isInsecure()) //Only let them place against /ctinsecure - event.setCancelled(true); + if(event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) return; + + Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); + Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); + //We only care if the comparator is going placed against something with an inventory + if(block.getState() instanceof InventoryHolder) { + Reinforcement rein = rm.getReinforcement(block); + if (rein != null && rein instanceof PlayerReinforcement) { + PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; + if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure + Player player = event.getPlayer(); + if (player != null) { + if (playerReinforcement.canAccessChests(player)) { + return; // We also allow players to place against chests they can access + } + sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); + } + event.setCancelled(true); } } } + } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) From 45916676302981e61ad3d682723b1c62687b1a00 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Mon, 27 Mar 2017 14:05:40 -0400 Subject: [PATCH 058/255] Exploit fix for DC with only one side reinforced --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/listener/BlockListener.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5def5fa6..7cdc611d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.8.02 + 3.8.03 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index ba6c917c..3c11efcd 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -87,7 +87,7 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); //We only care if the comparator is going placed against something with an inventory if(block.getState() instanceof InventoryHolder) { - Reinforcement rein = rm.getReinforcement(block); + Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); if (rein != null && rein instanceof PlayerReinforcement) { PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure From 3af6e36d71ed9e347972578251501863ce81f83d Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Tue, 28 Mar 2017 09:09:51 -0400 Subject: [PATCH 059/255] Address through-block exploit --- pom.xml | 2 +- .../mc/citadel/listener/BlockListener.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7cdc611d..0a81a39e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.8.03 + 3.8.04 Citadel https://github.com/Civcraft/Citadel diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 3c11efcd..70a8715a 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -86,6 +86,26 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); //We only care if the comparator is going placed against something with an inventory + if(block.getState() instanceof InventoryHolder) { + Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); + if (rein != null && rein instanceof PlayerReinforcement) { + PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; + if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure + Player player = event.getPlayer(); + if (player != null) { + if (playerReinforcement.canAccessChests(player)) { + return; // We also allow players to place against chests they can access + } + sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); + } + event.setCancelled(true); + } + } + return; + } + + // So apparently read-through state can pass through an intermediary block, so lets check that too. + block = block.getRelative(comparator.getFacing().getOppositeFace()); if(block.getState() instanceof InventoryHolder) { Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); if (rein != null && rein instanceof PlayerReinforcement) { From 438c51b20f58f1a09c2fee2f4bdb675b254995c6 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 7 Jun 2017 14:51:47 -0400 Subject: [PATCH 060/255] Update to 1.12 spigot --- CONTRIBUTING.md | 1 - README.md | 2 +- pom.xml | 22 +++++++++++----------- 3 files changed, 12 insertions(+), 13 deletions(-) delete mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index f2640e61..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -sign the Contributor License Agreement diff --git a/README.md b/README.md index 45da1b61..cc0333e7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Citadel -Original Citadel Jenkins Build Server can be found here: http://build.civcraft.co/job/Citadel-master/ +Citadel Jenkins Build Server can be found here: https://build.devotedmc.com/job/Citadel-master/ Basic new player tutorial: https://www.reddit.com/r/Devoted/wiki/plugins/citadel diff --git a/pom.xml b/pom.xml index 0a81a39e..3761843b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,9 @@ vg.civcraft.mc.citadel Citadel jar - 3.8.04 + 3.9.0 Citadel - https://github.com/Civcraft/Citadel + https://github.com/Devoted/Citadel @@ -41,20 +41,20 @@ org.spigotmc spigot-api - 1.11-R0.1-SNAPSHOT + 1.12-pre6-SNAPSHOT vg.civcraft.mc.civmodcore CivModCore - 1.5.11 + 1.6.0 provided - vg.civcraft.mc.namelayer - NameLayer - 2.10.0 - provided - + vg.civcraft.mc.namelayer + NameLayer + 2.11.0 + provided + vg.civcraft.mc.bettershards BetterShardsBukkit @@ -64,14 +64,14 @@ vg.civcraft.mc.mercury Mercury - 1.2.0 + 1.2.19 provided - civcraft-repo + devoted-repo https://build.devotedmc.com/plugin/repository/everything/ From dcb219d3689121e3148959971c2aa666f409c723 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 8 Jun 2017 14:20:18 -0400 Subject: [PATCH 061/255] Final update to full mc 1.12 release --- .editorconfig | 17 +++++++++++------ pom.xml | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.editorconfig b/.editorconfig index abc68a4d..9887763d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,20 +1,25 @@ +# Editorconfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file root = true +# Unix-style newlines with a newline ending every file [*] +charset = utf-8 +indent_style = tab +indent_size = 4 end_of_line = lf insert_final_newline = true +continuation_indent_size = 8 [*.java] indent_style = tab -tab_width = 4 -trim_trailing_whitespace = true +indent_size = 4 [*.xml] indent_style = tab -tab_width = 4 -trim_trailing_whitespace = true +indent_size = 2 [*.yml] indent_style = space -tab_width = 2 -trim_trailing_whitespace = true +indent_size = 2 diff --git a/pom.xml b/pom.xml index 3761843b..111037fb 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ org.spigotmc spigot-api - 1.12-pre6-SNAPSHOT + 1.12-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore From 9d9c08b473c2840530b7ea5f4c1a00100c247dc9 Mon Sep 17 00:00:00 2001 From: Aleksey-Terzi Date: Mon, 17 Jul 2017 20:07:56 +0300 Subject: [PATCH 062/255] Return null in createPlayerReinforcement when event cancelled instead of raising exception --- .gitignore | 2 ++ pom.xml | 2 +- src/vg/civcraft/mc/citadel/Utility.java | 3 +- .../mc/citadel/listener/BlockListener.java | 28 ++----------------- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index c8523d52..3ba61ae4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ .project .settings/** .classpath +.idea/* +*.iml diff --git a/pom.xml b/pom.xml index 111037fb..77f5512d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.9.0 + 3.9.1 Citadel https://github.com/Devoted/Citadel diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index b8a1405e..e7b39e7b 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -58,7 +58,6 @@ public class Utility { * @param The ReinforcementType that is being reinforced on the block. * @param The ItemStack type of the block being placed (if CTF, null if CTR) * @return The PlayerReinforcement that comes from these parameters or null if certain checks failed. - * @throws ReinforcemnetFortificationCancelException */ public static PlayerReinforcement createPlayerReinforcement(Player player, Group g, Block block, ReinforcementType type, ItemStack reinfMat) { @@ -141,7 +140,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group ReinforcementCreationEvent event = new ReinforcementCreationEvent(rein, block, player); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - throw new ReinforcemnetFortificationCancelException(); + return null; } if (CitadelConfigManager.shouldLogReinforcement()) { StringBuffer slb = new StringBuffer(); diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 70a8715a..0854e00c 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -547,16 +547,7 @@ public void interact(PlayerInteractEvent pie) { g = GroupManager.getGroup(gName); } if (g != null) { - try { - createPlayerReinforcement(player, g, - block, type, null); - } catch (ReinforcemnetFortificationCancelException e) { - Citadel.getInstance() - .getLogger() - .log(Level.WARNING, - "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", - e); - } + createPlayerReinforcement(player, g, block, type, null); } } } @@ -701,16 +692,7 @@ public void interact(PlayerInteractEvent pie) { sendAndLog(player, ChatColor.RED, "Cancelled reinforcement, crop would already be reinforced."); } else { - try { - createPlayerReinforcement(player, state.getGroup(), - block, state.getReinforcementType(), null); - } catch (ReinforcemnetFortificationCancelException e) { - Citadel.getInstance() - .getLogger() - .log(Level.WARNING, - "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", - e); - } + createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null); } } else if (reinforcement.canBypass(player) || (player.isOp() || player @@ -747,12 +729,8 @@ public void interact(PlayerInteractEvent pie) { ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { - try { - createPlayerReinforcement(player, state.getGroup(), block, type, null); + if(createPlayerReinforcement(player, state.getGroup(), block, type, null) != null) { sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); - } catch (ReinforcemnetFortificationCancelException ex) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "ReinforcementFortificationCancelException occured in BlockListener, PlayerInteractEvent ", ex); } } } From 82dfa5fc791a334bbf147818419f2d2fbbcade0c Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Fri, 21 Jul 2017 12:25:51 -0400 Subject: [PATCH 063/255] To go with prior commit, adds sensible logging as per established config if a plugin cancels a reinforcement event. --- .../mc/citadel/listener/BlockListener.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 0854e00c..f955b6f7 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -547,7 +547,11 @@ public void interact(PlayerInteractEvent pie) { g = GroupManager.getGroup(gName); } if (g != null) { - createPlayerReinforcement(player, g, block, type, null); + if (createPlayerReinforcement(player, g, block, type, null) == null && CitadelConfigManager.shouldLogReinforcement()) { + // someone else's job to tell the player what went wrong, but let's do log it. + Citadel.getInstance().getLogger().log(Level.INFO, "Create Reinforcement by {0} at {1} cancelled by plugin", + new Object[] {player.getName(), block.getLocation()}); + } } } } @@ -692,7 +696,12 @@ public void interact(PlayerInteractEvent pie) { sendAndLog(player, ChatColor.RED, "Cancelled reinforcement, crop would already be reinforced."); } else { - createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null); + if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null) == null && + CitadelConfigManager.shouldLogReinforcement()) { + // someone else's job to tell the player what went wrong, but let's do log it. + Citadel.getInstance().getLogger().log(Level.INFO, "Create Reinforcement by {0} at {1} cancelled by plugin", + new Object[] {player.getName(), block.getLocation()}); + } } } else if (reinforcement.canBypass(player) || (player.isOp() || player @@ -731,6 +740,9 @@ public void interact(PlayerInteractEvent pie) { if (!event.isCancelled()) { if(createPlayerReinforcement(player, state.getGroup(), block, type, null) != null) { sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); + } else if (CitadelConfigManager.shouldLogReinforcement()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Change Reinforcement by {0} at {1} cancelled by plugin", + new Object[] {player.getName(), block.getLocation()}); } } } From 412409b1b577ad696c1116d61b8ca18e45bc3465 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Sat, 29 Jul 2017 21:35:41 -0400 Subject: [PATCH 064/255] Initial commit, adding in 100% return grace period --- config.yml | 2 ++ pom.xml | 2 +- .../mc/citadel/CitadelConfigManager.java | 4 ++++ src/vg/civcraft/mc/citadel/Utility.java | 9 +++++++-- .../reinforcementtypes/ReinforcementType.java | 19 +++++++++++++++---- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/config.yml b/config.yml index 179b20d4..a923dc04 100644 --- a/config.yml +++ b/config.yml @@ -37,6 +37,8 @@ reinforcements: mature_time: 5 acid_time: 30 scale_amount: 1 +# grace period is in minutes, forced 100% return within that time if undamaged. Set to 0 to disable (default) + grace_period: 1 lore: effect: type: ENCHANTMENT_TABLE diff --git a/pom.xml b/pom.xml index 77f5512d..a69f6d67 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.9.1 + 3.9.2 Citadel https://github.com/Devoted/Citadel diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 3df55e9a..d91f84d9 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -96,6 +96,10 @@ public static List getLoreValues(String type){ return config.getStringList("reinforcements." + type + ".lore"); } + public static int getGracePeriod(String type) { + return config.getInt("reinforcements." + type + ".grace_period", 0); // default disabled + } + public static ReinforcementEffect getReinforcementEffect(String type){ Particle effect = null; if (config.getString("reinforcements." + type + ".effect.type") != null) { diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index e7b39e7b..bc02acab 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -562,8 +562,13 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce if (reinforcement instanceof PlayerReinforcement) { PlayerReinforcement pr = (PlayerReinforcement)reinforcement; ReinforcementType material = ReinforcementType.getReinforcementType(pr.getStackRepresentation()); - // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. - if (rng.nextDouble() < pr.getHealth() * material.getPercentReturn()) { + // Adds in grace period returns, where if set, allows in minute increments for players to change their minds with + // no loss. Only applies if the reinforcement is immature and undamaged + if ((material.getGracePeriod() > 0 && pr.getMaturationTime() > 0 && pr.getHealth() >= 1.0 && + material.getMaturationTime() - timeUntilMature(pr) < material.getGracePeriod() ) || + // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. + rng.nextDouble() < pr.getHealth() * material.getPercentReturn()) { + Location location = pr.getLocation(); if (player != null){ Inventory inv = player.getInventory(); diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 4e9c2724..7562cb02 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -24,6 +24,7 @@ public class ReinforcementType { private int maturationTime; private int acidTime; private int scale; + private int gracePeriod; private ItemStack stack; private ReinforcementEffect effect; private Set allowedReinforceables; @@ -35,7 +36,7 @@ public class ReinforcementType { public ReinforcementType(Material mat, int amount, double percentReturn, int returnValue, int hitpoints, int maturationTime, int acidTime, int scale, List lore, ReinforcementEffect effect, Set allowsReinforceables, - Set disallowedReinforceables) { + Set disallowedReinforceables, int gracePeriod) { this.mat = mat; this.amount = amount; this.percentReturn = percentReturn/100; @@ -53,6 +54,7 @@ public ReinforcementType(Material mat, int amount, double percentReturn, types.put(stack, this); this.allowedReinforceables = allowsReinforceables; this.disallowedReinforceables = disallowedReinforceables; + this.gracePeriod = gracePeriod; } public static void initializeReinforcementTypes(){ @@ -72,15 +74,17 @@ public static void initializeReinforcementTypes(){ Set reinforceableMats = CitadelConfigManager.parseMaterialList(reinforceableMatString); List unreinforceableMatString = CitadelConfigManager.getNonReinforceableMaterials(type); Set nonReinforceableMats = CitadelConfigManager.parseMaterialList(unreinforceableMatString); + int gracePeriod = CitadelConfigManager.getGracePeriod(type); new ReinforcementType(mat, amount, percentReturn, returnValue, - hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats, nonReinforceableMats); + hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats, nonReinforceableMats, gracePeriod); if (CitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.INFO, "Adding Reinforcement {0} with:\n material {1} \n amount {2} " + "\n return rate {3} \n return? {4} \n health {5} \n maturation {6} " - + "\n acid {7} \n scaling {8} \n lore: {9} \n effect: \n {10}", + + "\n acid {7} \n scaling {8} \n lore: {9} \n effect: \n {10} \n grace: {11}", new Object[] { type, mat.toString(), amount, percentReturn, returnValue, hitpoints, maturation, - acid, maturation_scale, (lore != null ? String.join(" ", lore) : ""), (effect != null ? effect : "")}); + acid, maturation_scale, (lore != null ? String.join(" ", lore) : ""), (effect != null ? effect : ""), + gracePeriod}); } } } @@ -176,4 +180,11 @@ public static List getReinforcementTypes(){ type.addAll(types.values()); return type; } + + /** + * @return the time in minutes to "forgive" reinforcements and apply 100% return rate. Set to 0 to disable. + */ + public int getGracePeriod() { + return this.gracePeriod; + } } From b2b8ab6695f287337fd0488d2b835d5b456509ee Mon Sep 17 00:00:00 2001 From: Aleksey-Terzi Date: Fri, 25 Aug 2017 16:38:40 +0300 Subject: [PATCH 065/255] Fix for issue #34: /cti double broadcast --- pom.xml | 2 +- src/vg/civcraft/mc/citadel/listener/BlockListener.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a69f6d67..33f2fc77 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.9.2 + 3.9.3 Citadel https://github.com/Devoted/Citadel diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index f955b6f7..33e79e8e 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -41,6 +41,7 @@ import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; @@ -468,7 +469,7 @@ public void redstonePower(BlockRedstoneEvent bre) { @EventHandler(priority = EventPriority.HIGHEST) public void interact(PlayerInteractEvent pie) { try { - if (!pie.hasBlock()) + if (!pie.hasBlock() || pie.getHand() != EquipmentSlot.HAND) return; Player player = pie.getPlayer(); From 495f79dcabbfee06f099fa42fd5fe7cd8a1198c6 Mon Sep 17 00:00:00 2001 From: Lazersmoke Date: Sat, 25 Nov 2017 10:46:15 -0600 Subject: [PATCH 066/255] Rip out BetterShards and Mercury Thanks for your contribution @ProgrammerDan and @Maxopoly! This commit is untested, but it compiles. --- pom.xml | 12 --- src/vg/civcraft/mc/citadel/Citadel.java | 6 -- .../mc/citadel/listener/ShardListener.java | 102 ------------------ 3 files changed, 120 deletions(-) delete mode 100644 src/vg/civcraft/mc/citadel/listener/ShardListener.java diff --git a/pom.xml b/pom.xml index 33f2fc77..388c33bb 100644 --- a/pom.xml +++ b/pom.xml @@ -55,18 +55,6 @@ 2.11.0 provided - - vg.civcraft.mc.bettershards - BetterShardsBukkit - 1.0.0 - provided - - - vg.civcraft.mc.mercury - Mercury - 1.2.19 - provided - diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index a5743c0c..1081a699 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -15,7 +15,6 @@ import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.GroupsListener; import vg.civcraft.mc.citadel.listener.InventoryListener; -import vg.civcraft.mc.citadel.listener.ShardListener; import vg.civcraft.mc.citadel.listener.WorldListener; import vg.civcraft.mc.citadel.misc.CitadelStatics; import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; @@ -23,7 +22,6 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.ACivMod; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.mercury.MercuryAPI; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; @@ -119,10 +117,6 @@ private void registerListeners(){ getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new WorldListener(), this); - if (Bukkit.getPluginManager().isPluginEnabled("Mercury") && Bukkit.getPluginManager().isPluginEnabled("BetterShards")) { - getServer().getPluginManager().registerEvents(new ShardListener(), this); - MercuryAPI.registerPluginMessageChannel("Citadel"); - } } @SuppressWarnings("unchecked") diff --git a/src/vg/civcraft/mc/citadel/listener/ShardListener.java b/src/vg/civcraft/mc/citadel/listener/ShardListener.java deleted file mode 100644 index 7d5c7f32..00000000 --- a/src/vg/civcraft/mc/citadel/listener/ShardListener.java +++ /dev/null @@ -1,102 +0,0 @@ -package vg.civcraft.mc.citadel.listener; - -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; - -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import vg.civcraft.mc.bettershards.events.PlayerChangeServerEvent; -import vg.civcraft.mc.bettershards.events.PlayerChangeServerReason; -import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementMode; -import vg.civcraft.mc.mercury.MercuryAPI; -import vg.civcraft.mc.mercury.events.AsyncPluginBroadcastMessageEvent; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.group.Group; - -public class ShardListener implements Listener { - - @EventHandler(ignoreCancelled = true) - public void serverChange(PlayerChangeServerEvent e) { - StringBuilder sb; - if (e.getReason() == PlayerChangeServerReason.PORTAL) { - sb = new StringBuilder(); - sb.append("modetransfer"); - sb.append("|"); - sb.append(e.getPlayerUUID()); - sb.append("|"); - PlayerState ps = PlayerState.get(e.getPlayerUUID()); - sb.append(ps.getMode().toString()); - sb.append("|"); - sb.append(ps.getEasyMode()); - if (ps.getMode() == ReinforcementMode.REINFORCEMENT - || ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - sb.append("|"); - if (ps.getGroup() == null) { - return; - } - sb.append(ps.getGroup().getName()); - if (ps.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - sb.append("|"); - ItemStack is = ps.getReinforcementType().getItemStack(); - sb.append(is.getType()); - sb.append("|"); - sb.append(is.getDurability()); - if (is.getItemMeta().getLore() != null) { - for (String s : is.getItemMeta().getLore()) { - sb.append("|"); - sb.append(s); - } - } - } - } - } - else { - return; - } - MercuryAPI.sendMessage(e.getServerTravelingTo(), sb.toString(), - "Citadel"); - } - - @EventHandler - public void messageReceive(AsyncPluginBroadcastMessageEvent e) { - if (!e.getChannel().equals("Citadel")) { - return; - } - String[] data = e.getMessage().split("\\|"); - if (data[0].equals("modetransfer")) { - UUID uuid = UUID.fromString(data[1]); - PlayerState ps = PlayerState.get(uuid); - ReinforcementMode mode = ReinforcementMode.valueOf(data[2]); - ps.setMode(mode); - boolean easyMode = Boolean.valueOf(data[3]); - if (!easyMode) { - //default for easy mode is true, so only change if its turned off - ps.toggleEasyMode(); - } - if (mode == ReinforcementMode.REINFORCEMENT - || mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - Group g = GroupManager.getGroup(data[3]); - ps.setGroup(g); - if (mode == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - Material m = Material.valueOf(data[4]); - short dura = Short.parseShort(data[5]); - List lore = new LinkedList(); - for(int i = 6; i < data.length; i++) { - lore.add(data[i]); - } - ItemStack is = new ItemStack(m, 1, dura); - ItemMeta im = is.getItemMeta(); - im.setLore(lore); - is.setItemMeta(im); - ps.setFortificationItemStack(is); - } - } - } - } -} From 197d10331ea881d807cf4b8d6d3e4c9adc5f6426 Mon Sep 17 00:00:00 2001 From: Sam Quinn Date: Wed, 29 Nov 2017 10:17:27 -0600 Subject: [PATCH 067/255] Bump version for shards change Using Github web interface :dice: --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 388c33bb..b674b94e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.9.3 + 3.10.0 Citadel https://github.com/Devoted/Citadel From 76a0759fffe0ade6decc841a4ec3173fa6eb5089 Mon Sep 17 00:00:00 2001 From: Lazersmoke Date: Sat, 17 Feb 2018 14:36:20 -0600 Subject: [PATCH 068/255] Fix spammy debug message --- src/vg/civcraft/mc/citadel/ReinforcementManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index c3ad7113..430b3564 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -283,7 +283,9 @@ public void run() { } } - saveManyReinforcements(reins); + if(reins.size() != 0){ + saveManyReinforcements(reins); + } if (CitadelConfigManager.shouldLogInternal()) { s = System.currentTimeMillis() - s; From 277087d619de5766147fca57e26ef8041d32e2fd Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Fri, 23 Feb 2018 22:18:38 +0000 Subject: [PATCH 069/255] Don't turn /ctf off when attempting to switch reinforcement groups --- .../civcraft/mc/citadel/command/commands/Fortification.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index d05b8932..91d14532 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -50,12 +50,12 @@ public boolean execute(CommandSender sender, String[] args) { else{ groupName = args[0]; } - Group g = GroupManager.getGroup(groupName); + Group g = GroupManager.getGroup(groupName); if (g == null){ sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } - + PlayerType type = g.getPlayerType(uuid); if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ sendAndLog(p, ChatColor.RED, "You are not on this group."); @@ -69,7 +69,7 @@ public boolean execute(CommandSender sender, String[] args) { ItemStack stack = p.getInventory().getItemInMainHand(); PlayerState state = PlayerState.get(p); ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); - if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION){ + if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && state.getGroup().getName() == g.getName()){ sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } From 436f67b65b96853f19d22074e4e3756864b346f1 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Fri, 23 Feb 2018 22:43:59 +0000 Subject: [PATCH 070/255] Don't turn /ctr off when attempting to switch reinforcement groups --- src/vg/civcraft/mc/citadel/command/commands/Reinforce.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 748e29fc..6e46fda3 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -18,7 +18,7 @@ public class Reinforce extends PlayerCommandMiddle { private GroupManager gm = NameAPI.getGroupManager(); - + public Reinforce(String name) { super(name); setIdentifier("ctr"); @@ -62,7 +62,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.REINFORCEMENT){ + if (state.getMode() == ReinforcementMode.REINFORCEMENT && state.getGroup().getName() == g.getName()){ sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } From eb4b29eef7fd13bba455b28d14ef23629817627b Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Fri, 23 Feb 2018 23:52:35 +0000 Subject: [PATCH 071/255] Make /cte idempotent (non-stateful) --- .../command/commands/ToggleEasyMode.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java index 3356f777..698a26c4 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -15,8 +15,8 @@ public ToggleEasyMode(String name) { super(name); setIdentifier("cte"); setDescription("Toggle easy mode"); - setUsage("/cte"); - setArguments(0, 0); + setUsage("/cte [on|off]"); + setArguments(0, 1); } @Override @@ -27,6 +27,22 @@ public boolean execute(CommandSender sender, String[] args) { } Player p = (Player) sender; PlayerState state = PlayerState.get(p); + if (args.length == 1) { + if (args[0].equalsIgnoreCase("on")) { + if (!state.getEasyMode()) { + state.toggleEasyMode(); + } + sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); + } else if (args[0].equalsIgnoreCase("off")) { + if (state.getEasyMode()) { + state.toggleEasyMode(); + } + sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); + } else { + sendAndLog(p, ChatColor.RED, "Usage: /cte [on|off]"); + } + return true; + } if (state.toggleEasyMode()) { sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); } else { From 610e057ce07ce7eb307f880a70e736e22efaf701 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 02:22:21 +0000 Subject: [PATCH 072/255] Add hover messages to /ctf, /ctr, and /cti --- src/vg/civcraft/mc/citadel/Utility.java | 155 +++++++++++------- .../mc/citadel/command/commands/Acid.java | 31 ++-- .../command/commands/AreaReinforce.java | 23 +-- .../mc/citadel/command/commands/Bypass.java | 8 +- .../command/commands/Fortification.java | 34 ++-- .../citadel/command/commands/Information.java | 8 +- .../mc/citadel/command/commands/Insecure.java | 8 +- .../citadel/command/commands/Materials.java | 3 +- .../mc/citadel/command/commands/Off.java | 6 +- .../command/commands/PlayerCommandMiddle.java | 24 --- .../citadel/command/commands/Reinforce.java | 28 +++- .../command/commands/ReinforcementsGUI.java | 7 +- .../citadel/command/commands/SetLogging.java | 28 ++-- .../mc/citadel/command/commands/Stats.java | 32 ++-- .../command/commands/ToggleEasyMode.java | 8 +- .../commands/UpdateReinforcements.java | 44 ++--- .../mc/citadel/listener/BlockListener.java | 79 +++++---- .../mc/citadel/listener/EntityListener.java | 33 ++-- 18 files changed, 298 insertions(+), 261 deletions(-) delete mode 100644 src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index bc02acab..d4d8e418 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -10,12 +10,17 @@ import java.util.Set; import java.util.logging.Level; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -49,6 +54,30 @@ public class Utility { private static ReinforcementManager rm = Citadel.getReinforcementManager(); private static Random rng = new Random(); + + public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { + receiver.sendMessage(color + message); + if (CitadelConfigManager.shouldLogPlayerCommands()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); + } + } + + // Bug: colors don't seem to work with player.spigot().sendMessage() when sending multiline strings. + public static void sendAndLog(Player player, ChatColor color, String message, String hoverMessage) { + if (hoverMessage != null && !hoverMessage.trim().isEmpty()) { + TextComponent playerMessage = new TextComponent(color + message); + playerMessage.setHoverEvent( + new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create())); + player.spigot().sendMessage(playerMessage); + } else { + sendAndLog(player, color, message); + return; + } + if (CitadelConfigManager.shouldLogPlayerCommands()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{player.getName(), message}); + } + } + /** * Creates a PlayerReinforcement or returns null if if player doesn't have * the required requirements. @@ -63,7 +92,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group ReinforcementType type, ItemStack reinfMat) { if (player == null || g == null || block == null || type == null) { Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createPlayerReinforcement called with null: {0},{1},{2},{3}", + "Utility createPlayerReinforcement called with null: {0},{1},{2},{3}", new Object[] {player, g, block, type}); return null; } @@ -89,7 +118,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group player.sendMessage(ChatColor.RED + "You don't have permission to reinforce on this group"); return null; } - + // Find necessary itemstacks final PlayerInventory inv = player.getInventory(); final int invSize = inv.getSize(); @@ -107,7 +136,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group boolean consumeOffhand = false; try { //offhand needs special handling - + ItemStack offSlot = inv.getItemInOffHand(); if (offSlot != null && offSlot.isSimilar(itemType)) { requirementscheck -= offSlot.getAmount(); @@ -133,9 +162,9 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group return null; } // Fire the creation event - PlayerReinforcement rein = new PlayerReinforcement(block.getLocation(), - type.getHitPoints(), getIntFormofMaturation(System.currentTimeMillis(),type.getItemStack()), - getIntFormofAcidMaturation(System.currentTimeMillis(),type.getItemStack()), + 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); @@ -154,7 +183,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group Citadel.getInstance().getLogger().info(slb.toString()); } // Now eat the materials - + // Handle special case with block reinforcements. if (type.getMaterial().isBlock()){ if (slots.size()>1){ @@ -181,7 +210,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group final ItemStack slotItem = inv.getItem(slot); final int stackSize = slotItem.getAmount(); final int deduction = Math.min(stackSize, requirements); - + if (deduction < stackSize) { slotItem.setAmount(stackSize - deduction); } else { @@ -190,16 +219,16 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group requirements -= deduction; } if (requirements != 0) { - Citadel.getInstance().getLogger().info(String.format( "Reinforcement material out of sync %d vs %d", + Citadel.getInstance().getLogger().info(String.format( "Reinforcement material out of sync %d vs %d", requirements, type.getRequiredAmount())); } player.updateInventory(); - + rm.saveInitialReinforcement(rein); playReinforcementEffect(rein); return rein; } - + /** * Creates a player reinforcement without consuming any materials. This should only be used * for admin tools @@ -210,11 +239,11 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group * @return The PlayerReinforcement that comes from these parameters or null if certain checks failed. * @throws ReinforcemnetFortificationCancelException */ - public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsumption(Player player, + public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsumption(Player player, Group g, Block block, ReinforcementType type) { if (g == null || block == null || type == null) { Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createPlayerReinforcementWithoutMaterialConsumption called with null: {0},{1},{2}", + "Utility createPlayerReinforcementWithoutMaterialConsumption called with null: {0},{1},{2}", new Object[] {g, block, type}); return null; } else if (player == null) { @@ -222,16 +251,16 @@ public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsum "Utility createPlayerReinforcementWithoutMaterialConsumption called with player as null"); } - //no error messages towards the player because this might be called a few thousand times + //no error messages towards the player because this might be called a few thousand times if (g.isDisciplined()) { return null; } if (NonReinforceableType.isNonReinforceable(block.getType())){ return null; } - PlayerReinforcement rein = new PlayerReinforcement(block.getLocation(), - type.getHitPoints(), getIntFormofMaturation(System.currentTimeMillis(),type.getItemStack()), - getIntFormofAcidMaturation(System.currentTimeMillis(),type.getItemStack()), + 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); @@ -240,11 +269,11 @@ public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsum } rm.saveInitialReinforcement(rein); playReinforcementEffect(rein); - return rein; + return rein; } - + /** - * Checks if creating a plant reinforcement would result in a + * Checks if creating a plant reinforcement would result in a * double reinforcement. * @param The block of the plant. * @return True if it would create a double reinforcement. @@ -256,7 +285,7 @@ public static boolean wouldPlantDoubleReinforce(final Block block) { "Utility wouldPlantDoubleReinforce called with null"); return false; } - + final Material blockMat = block.getType(); if (isReinforceablePlant(blockMat) && rm.getReinforcement(block.getLocation()) != null) { @@ -274,7 +303,7 @@ public static boolean wouldPlantDoubleReinforce(final Block block) { } return false; } - + private static boolean isReinforceablePlant(Material mat) { // If this list changes, update wouldPlantDoubleReinforce to account // for the new soil types. @@ -305,7 +334,7 @@ public static Set getPlantSoilTypes(Material mat) { } return soilTypes; } - + private static boolean isSoilPlant(Material mat) { return Material.WHEAT.equals(mat) || Material.MELON_STEM.equals(mat) @@ -393,9 +422,9 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc final int maturationTime = timeUntilMature(reinforcement); PlayerReinforcement rein = (PlayerReinforcement) reinforcement; ReinforcementType type = ReinforcementType.getReinforcementType(rein.getStackRepresentation()); - + durabilityLoss = rein.getDamageMultiplier(); - + if (maturationTime > 0 && type.getMaturationScale() != 0) { // the default amount of minutes it takes to mature int normal = type.getMaturationTime(); @@ -404,10 +433,10 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc } else { double percentTo = (double) maturationTime / (double) normal; // the percent of time left of maturation durabilityLoss = (int) (((double) durabilityLoss / (1.0d - percentTo)) * (double) type.getMaturationScale()); - } // this new code scales smoothly between MaturationScale and a very large number, being closer to + } // this new code scales smoothly between MaturationScale and a very large number, being closer to // MaturationScale the closer to "done" a maturation cycle } - + if (durability < durabilityLoss) { durabilityLoss = durability; } @@ -534,9 +563,9 @@ public static int timeUntilAcidMature(Reinforcement reinforcement) { } return 0; } - + /** - * + * * /ctb mode type break * * @param The Player who broke the reinforcement @@ -564,11 +593,11 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce ReinforcementType material = ReinforcementType.getReinforcementType(pr.getStackRepresentation()); // Adds in grace period returns, where if set, allows in minute increments for players to change their minds with // no loss. Only applies if the reinforcement is immature and undamaged - if ((material.getGracePeriod() > 0 && pr.getMaturationTime() > 0 && pr.getHealth() >= 1.0 && + if ((material.getGracePeriod() > 0 && pr.getMaturationTime() > 0 && pr.getHealth() >= 1.0 && material.getMaturationTime() - timeUntilMature(pr) < material.getGracePeriod() ) || // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. rng.nextDouble() < pr.getHealth() * material.getPercentReturn()) { - + Location location = pr.getLocation(); if (player != null){ Inventory inv = player.getInventory(); @@ -612,14 +641,14 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce /** * A better version of dropNaturally that mimics normal drop behavior. - * - * The built-in version of Bukkit's dropItem() method places the item at the block - * vertex which can make the item jump around. - * This method places the item in the middle of the block location with a slight + * + * The built-in version of Bukkit's dropItem() method places the item at the block + * vertex which can make the item jump around. + * This method places the item in the middle of the block location with a slight * vertical velocity to mimic how normal broken blocks appear. * @param l The location to drop the item * @param is The item to drop - * + * * @author GordonFreemanQ */ public static void dropItemAtLocation(final Location l, final ItemStack is) { @@ -636,13 +665,13 @@ public void run() { } }, 1); } - - + + /** * Overload for dropItemAtLocation(Location l, ItemStack is) that accepts a block parameter. * @param b The block to drop it at * @param is The item to drop - * + * * @author GordonFreemanQ */ public static void dropItemAtLocation(Block b, ItemStack is) { @@ -653,7 +682,7 @@ public static void dropItemAtLocation(Block b, ItemStack is) { } dropItemAtLocation(b.getLocation(), is); } - + /** * Checks if a Redstone player is trying to power a block. * @param The Reinforcement in question. @@ -739,7 +768,7 @@ public static NaturalReinforcement createNaturalReinforcement(Block block, Playe Citadel.getReinforcementManager().saveInitialReinforcement(nr); return nr; } - + /** * This method is used to convert Block Reinforcements to itemstacks * @param The block that is being converted into a BlockReinforcement @@ -772,7 +801,7 @@ public static ItemStack createDroppedReinforcementBlock(Block block, PlayerReinf } /** * Returns the Reinforcement of a block if it was previously a reinforcement. - * Importantly though if a group that this block was associated with + * Importantly though if a group that this block was associated with * gets deleted this block when placed will not belong to anyone. * @param The player placing the block * @param The stack the player is placing from @@ -826,11 +855,11 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac return null; } Group g = GroupManager.getSpecialCircumstanceGroup(group); - PlayerReinforcement rein = new PlayerReinforcement(loc, dur, + PlayerReinforcement rein = new PlayerReinforcement(loc, dur, getIntFormofMaturation(System.currentTimeMillis(),reinType.getItemStack()), getIntFormofAcidMaturation(System.currentTimeMillis(),reinType.getItemStack()), g, reinType.getItemStack()); - ReinforcementCreationEvent event = + ReinforcementCreationEvent event = new ReinforcementCreationEvent(rein, loc.getBlock(), p); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -843,7 +872,7 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac return rein; } catch (IllegalArgumentException iae){ Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility isDroppedReinforcementBlock failed", iae); + "Utility isDroppedReinforcementBlock failed", iae); } catch(Exception ex){ Citadel.getInstance().getLogger().log(Level.WARNING, "Utility isDroppedReinforcementBlock failed", ex); @@ -872,10 +901,10 @@ public static boolean explodeReinforcement(Block block) { } return reinforcementDamaged(null, reinforcement); } - + /** - * Creates a MultiBlockReinforcement and saves it to the db. This method is to be used only be other plugins. Citadel - * will not use this anywhere. + * Creates a MultiBlockReinforcement and saves it to the db. This method is to be used only be other plugins. Citadel + * will not use this anywhere. * @param locs The locations that make up the structure. * @param g The group this will belong too. * @param dur The durability this structure will have. @@ -902,11 +931,11 @@ public static MultiBlockReinforcement createMultiBlockReinforcement(List doorTypes = new ArrayList(Arrays.asList( Material.WOODEN_DOOR, Material.IRON_DOOR_BLOCK, Material.ACACIA_DOOR, Material.BIRCH_DOOR, @@ -953,7 +982,7 @@ public static Block getRealBlock(Block block){ Citadel.getInstance().getLogger().log(Level.WARNING, "Utility getRealBlock called with null"); return null; - } + } Block b = block; switch (block.getType()){ case CHEST: @@ -987,39 +1016,39 @@ public static Block getRealBlock(Block block){ } return b; } - + private static int getIntFormofMaturation(long creation, ItemStack stack){ if (stack == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility getIntFormofMaturation called with null"); return 0; } - int maturation = (int)(creation / 60000) + + int maturation = (int)(creation / 60000) + ReinforcementType. getReinforcementType(stack) .getMaturationTime(); return maturation; } - + private static int getIntFormofAcidMaturation(long creation, ItemStack stack) { if (stack == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility getIntFormofAcidMaturation called with null"); return 0; } - int maturation = (int)(creation / 60000) + + int maturation = (int)(creation / 60000) + ReinforcementType. getReinforcementType(stack) .getAcidTime(); return maturation; } - + public static Block findPlantSoil(Block block){ if (block == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility findPlantSoil called with null"); return null; - } + } final Set soilTypes = getPlantSoilTypes(block.getType()); if(soilTypes.size() <= 0){ return null; @@ -1035,10 +1064,10 @@ public static Block findPlantSoil(Block block){ } return null; } - + public static boolean canPlace(Block block, Player player) { Material block_mat = block.getType(); - + if (block_mat == Material.HOPPER || block_mat == Material.DROPPER){ for (BlockFace direction : BlockListener.all_sides) { Block adjacent = block.getRelative(direction); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Acid.java b/src/vg/civcraft/mc/citadel/command/commands/Acid.java index 6f9b9a62..c09db58c 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Acid.java @@ -21,10 +21,11 @@ import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Acid extends PlayerCommandMiddle { +public class Acid extends PlayerCommand { private ReinforcementManager rm = Citadel.getReinforcementManager(); - + public Acid(String name) { super(name); setIdentifier("ctacid"); @@ -49,42 +50,42 @@ public boolean execute(CommandSender sender, String[] args) { } Reinforcement rein = rm.getReinforcement(block); if (rein == null) { - sendAndLog(p, ChatColor.RED, "That block is not reinforced."); + Utility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } if (!(rein instanceof PlayerReinforcement)) { // Just in case. // Most chance it is a PlayerReinforcement but otherwise. - sendAndLog(p, ChatColor.RED, + Utility.sendAndLog(p, ChatColor.RED, "An acid block cannot be a natural reinforcement."); return true; } PlayerReinforcement pRein = (PlayerReinforcement) rein; UUID uuid = NameAPI.getUUID(p.getName()); if (pRein.getGroup() == null) { - sendAndLog(p, ChatColor.RED, "No-one is on that group."); + Utility.sendAndLog(p, ChatColor.RED, "No-one is on that group."); return true; } if (!pRein.getGroup().isMember(uuid)) { - sendAndLog(p, ChatColor.RED, "You do not belong on that group."); + Utility.sendAndLog(p, ChatColor.RED, "You do not belong on that group."); return true; } if (!pRein.canAcid(p)) { - sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); + Utility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); return true; } int time = Utility.timeUntilAcidMature(pRein); if (time != 0) { - sendAndLog(p, ChatColor.RED, "That acid block is not mature yet."); + Utility.sendAndLog(p, ChatColor.RED, "That acid block is not mature yet."); return true; } Block topFace = block.getRelative(BlockFace.UP); if (Material.AIR.equals(topFace.getType())) { - sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); + Utility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); return true; } Reinforcement topRein = rm.getReinforcement(topFace); if (topRein == null) { - sendAndLog(p, ChatColor.RED, "That block doesn't have a reinforcement."); + Utility.sendAndLog(p, ChatColor.RED, "That block doesn't have a reinforcement."); return true; } if (!(topRein instanceof PlayerReinforcement)) { @@ -96,7 +97,7 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementType topReinType = ReinforcementType .getReinforcementType(pTopRein.getStackRepresentation()); if (acidBlockType.getAcidTime() < topReinType.getAcidTime()) { - sendAndLog(p, ChatColor.RED, "This acid block is too weak for that reinforcement."); + Utility.sendAndLog(p, ChatColor.RED, "This acid block is too weak for that reinforcement."); return true; } AcidBlockEvent event = new AcidBlockEvent(p, pRein, pTopRein); @@ -108,20 +109,20 @@ public boolean execute(CommandSender sender, String[] args) { } return true; } - + if (CitadelConfigManager.shouldLogHostileBreaks()) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}", new Object[] {block.getLocation(), topFace.getType(), topFace.getLocation()}); } - + topFace.setType(Material.AIR); block.breakNaturally(); - + // Consider if should simply be an AcidBlockEvent listener. This will do for now. Utility.reinforcementBroken(p, pRein); rm.deleteReinforcement(pTopRein); - + } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java index c881f245..c6414540 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java @@ -19,8 +19,9 @@ import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class AreaReinforce extends PlayerCommandMiddle { +public class AreaReinforce extends PlayerCommand { private ReinforcementManager rm = Citadel.getReinforcementManager(); private GroupManager gm = NameAPI.getGroupManager(); @@ -43,21 +44,21 @@ public boolean execute(CommandSender sender, String[] args) { if (!p.isOp() && !p.hasPermission("citadel.admin")) { // This should never actually happen thanks to the plugin.yml, but // we just want to be sure - sendAndLog(p, ChatColor.RED, "Nice try"); + Utility.sendAndLog(p, ChatColor.RED, "Nice try"); return true; } ReinforcementType rt = ReinforcementType.getReinforcementType(p.getInventory().getItemInMainHand()); if (rt == null) { - sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); + Utility.sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); return true; } String groupName = null; if (args.length == 6) { groupName = gm.getDefaultGroup(uuid); if (groupName == null) { - sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); + Utility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); return true; } } else { @@ -65,7 +66,7 @@ public boolean execute(CommandSender sender, String[] args) { } Group g = GroupManager.getGroup(groupName); if (g == null) { - sendAndLog(p, ChatColor.RED, "That group does not exist."); + Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } // no additional group permission check here because the player is @@ -86,7 +87,7 @@ public boolean execute(CommandSender sender, String[] args) { yMax = Math.max(y1, y2); zMax = Math.max(z1, z2); } catch (NumberFormatException e) { - sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); + Utility.sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); return false; } for (int x = xMin; x <= xMax; x++) { @@ -94,10 +95,10 @@ public boolean execute(CommandSender sender, String[] args) { for (int z = zMin; z <= zMax; z++) { Block current = Utility.getRealBlock(p.getWorld() .getBlockAt(x, y, z)); - if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) - && !Utility.wouldPlantDoubleReinforce(current)) { + if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) + && !Utility.wouldPlantDoubleReinforce(current)) { if (!rt.canBeReinforced(current.getType())) { - sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + + Utility.sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + " was not reinforced because the material type you are using cannot reinforce that type of block."); continue; } @@ -107,10 +108,10 @@ public boolean execute(CommandSender sender, String[] args) { } } - sendAndLog(p, ChatColor.GREEN, "Successfully created reinforcements"); + Utility.sendAndLog(p, ChatColor.GREEN, "Successfully created reinforcements"); return true; } - + @Override public List tabComplete(CommandSender sender, String[] args) { return new ArrayList(); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java index 5c037711..cca5a7e4 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Bypass.java @@ -8,8 +8,10 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Bypass extends PlayerCommandMiddle{ +public class Bypass extends PlayerCommand{ public Bypass(String name) { super(name); setIdentifier("ctb"); @@ -27,10 +29,10 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; PlayerState state = PlayerState.get(p); if (state.toggleBypassMode()){ - sendAndLog(p, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); + Utility.sendAndLog(p, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } else { - sendAndLog(p, ChatColor.GREEN, "Bypass mode has been disabled."); + Utility.sendAndLog(p, ChatColor.GREEN, "Bypass mode has been disabled."); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index d05b8932..21fc499e 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -19,8 +19,10 @@ import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Fortification extends PlayerCommandMiddle{ +public class Fortification extends PlayerCommand{ private GroupManager gm = NameAPI.getGroupManager(); public Fortification(String name) { @@ -43,26 +45,26 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); + Utility.sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); return true; } } else{ groupName = args[0]; } - Group g = GroupManager.getGroup(groupName); + Group g = GroupManager.getGroup(groupName); if (g == null){ - sendAndLog(p, ChatColor.RED, "That group does not exist."); + Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } - + PlayerType type = g.getPlayerType(uuid); if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ - sendAndLog(p, ChatColor.RED, "You are not on this group."); + Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); return true; } if (!p.hasPermission("citadel.admin") && !p.isOp() && !gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("REINFORCE"))){ - sendAndLog(p, ChatColor.RED, "You do not have permission to " + Utility.sendAndLog(p, ChatColor.RED, "You do not have permission to " + "place a reinforcement on this group."); return true; } @@ -70,19 +72,29 @@ public boolean execute(CommandSender sender, String[] args) { PlayerState state = PlayerState.get(p); ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION){ - sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); + Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } else{ if (stack.getType() == Material.AIR){ - sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); + Utility.sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); return true; } else if (reinType == null){ - sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); + Utility.sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); return true; } - sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /fortify or /cto to turn this off when you are done."); + String hoverMessage = String.format("Material: %s\nGroup: %s", reinType.getMaterial().toString(), groupName); + Utility.sendAndLog( + p, + ChatColor.GREEN, + "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand.", + hoverMessage); + Utility.sendAndLog( + p, + ChatColor.GREEN, + " Type /fortify or /cto to turn this off when you are done.", + hoverMessage); state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); state.setFortificationItemStack(reinType.getItemStack()); state.setGroup(g); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Information.java b/src/vg/civcraft/mc/citadel/command/commands/Information.java index 04168fc6..48b415ff 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Information.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Information.java @@ -6,11 +6,13 @@ import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementMode; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import java.util.ArrayList; import java.util.List; -public class Information extends PlayerCommandMiddle{ +public class Information extends PlayerCommand{ public Information(String name) { super(name); @@ -29,11 +31,11 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; PlayerState state = PlayerState.get(p); if (state.getMode() == ReinforcementMode.REINFORCEMENT_INFORMATION){ - sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); + Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "You are now in Information mode, click on blocks to see their reinforcement information! \n Type /cti or /cto to turn this off."); + Utility.sendAndLog(p, ChatColor.GREEN, "You are now in Information mode, click on blocks to see their reinforcement information! \n Type /cti or /cto to turn this off."); state.setMode(ReinforcementMode.REINFORCEMENT_INFORMATION); } return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Insecure.java b/src/vg/civcraft/mc/citadel/command/commands/Insecure.java index 03c3a207..56daafa7 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Insecure.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Insecure.java @@ -6,11 +6,13 @@ import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementMode; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import java.util.ArrayList; import java.util.List; -public class Insecure extends PlayerCommandMiddle{ +public class Insecure extends PlayerCommand{ public Insecure(String name) { super(name); @@ -29,11 +31,11 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; PlayerState state = PlayerState.get(p); if (state.getMode() == ReinforcementMode.INSECURE){ - sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); + Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "Reinforcement mode changed to " + Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode changed to " + ReinforcementMode.INSECURE.name() + "."); state.setMode(ReinforcementMode.INSECURE); } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Materials.java b/src/vg/civcraft/mc/citadel/command/commands/Materials.java index 756c430a..be18d82f 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Materials.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Materials.java @@ -8,8 +8,9 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Materials extends PlayerCommandMiddle{ +public class Materials extends PlayerCommand{ public Materials(String name) { super(name); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Off.java b/src/vg/civcraft/mc/citadel/command/commands/Off.java index f31eb4ac..ea626bd6 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Off.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Off.java @@ -5,11 +5,13 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import java.util.ArrayList; import java.util.List; -public class Off extends PlayerCommandMiddle{ +public class Off extends PlayerCommand{ public Off(String name) { super(name); @@ -31,7 +33,7 @@ public boolean execute(CommandSender sender, String[] args) { if (state.isBypassMode()) { state.toggleBypassMode(); } - sendAndLog(p, ChatColor.GREEN, "Reinforcement mode has been set to Normal."); + Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode has been set to Normal."); return true; } diff --git a/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java b/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java deleted file mode 100644 index 56a1c347..00000000 --- a/src/vg/civcraft/mc/citadel/command/commands/PlayerCommandMiddle.java +++ /dev/null @@ -1,24 +0,0 @@ -package vg.civcraft.mc.citadel.command.commands; - -import java.util.logging.Level; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; - -public abstract class PlayerCommandMiddle extends PlayerCommand { - - public PlayerCommandMiddle(String name) { - super(name); - } - - protected void sendAndLog(CommandSender receiver, ChatColor color, String message) { - receiver.sendMessage(color + message); - if (CitadelConfigManager.shouldLogPlayerCommands()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); - } - } -} \ No newline at end of file diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 748e29fc..276ffe23 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -14,11 +14,13 @@ import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Reinforce extends PlayerCommandMiddle { +public class Reinforce extends PlayerCommand { private GroupManager gm = NameAPI.getGroupManager(); - + public Reinforce(String name) { super(name); setIdentifier("ctr"); @@ -39,7 +41,7 @@ public boolean execute(CommandSender sender, String[] args) { if(args.length == 0){ groupName = gm.getDefaultGroup(uuid); if(groupName == null){ - sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or /create groupname if you don't have a group yet."); + Utility.sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or /create groupname if you don't have a group yet."); return true; } } @@ -48,26 +50,36 @@ public boolean execute(CommandSender sender, String[] args) { } Group g = GroupManager.getGroup(groupName); if (g == null){ - sendAndLog(p, ChatColor.RED, "That group does not exist."); + Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } PlayerType type = g.getPlayerType(uuid); if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ - sendAndLog(p, ChatColor.RED, "You are not on this group."); + Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); return true; } if (!p.hasPermission("citadel.admin") && !p.isOp() && !gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("REINFORCE"))){ - sendAndLog(p, ChatColor.RED, "You do not have permission to " + Utility.sendAndLog(p, ChatColor.RED, "You do not have permission to " + "place a reinforcement on this group."); return true; } PlayerState state = PlayerState.get(p); if (state.getMode() == ReinforcementMode.REINFORCEMENT){ - sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); + Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); } else{ - sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /reinforce or /cto to turn this off when you are done."); + String hoverMessage = String.format("Group: %s", groupName); + Utility.sendAndLog( + p, + ChatColor.GREEN, + "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them.", + hoverMessage); + Utility.sendAndLog( + p, + ChatColor.GREEN, + " Type /reinforce or /cto to turn this off when you are done.", + hoverMessage); state.setMode(ReinforcementMode.REINFORCEMENT); state.setGroup(g); } diff --git a/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java b/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java index 665368a0..d23d8165 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java +++ b/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java @@ -16,9 +16,10 @@ import vg.civcraft.mc.civmodcore.inventorygui.ClickableInventory; import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; + +public class ReinforcementsGUI extends PlayerCommand { -public class ReinforcementsGUI extends PlayerCommandMiddle { - private DecimalFormat format; public ReinforcementsGUI(String name) { @@ -68,7 +69,7 @@ public int compare(ReinforcementType o1, ReinforcementType o2) { String acidString = ChatColor.GOLD + "Acidblock maturation time: " + createOutputTime(daysAcid, "day") + createOutputTime(hoursAcid, "hour") + createOutputTime(minutesAcid, "minute"); ISUtils.addLore(is, acidString.substring(0, acidString.length() - 2)); - ISUtils.addLore(is, ChatColor.WHITE + "Return chance: " + format.format(type.getPercentReturn() * 100.0) + " %"); + ISUtils.addLore(is, ChatColor.WHITE + "Return chance: " + format.format(type.getPercentReturn() * 100.0) + " %"); items.add(is); ci.setSlot(new DecorationStack(is), slot); slot++; diff --git a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java b/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java index fe7010a0..bc83a4d3 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java +++ b/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java @@ -10,8 +10,10 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelConfigManager; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class SetLogging extends PlayerCommandMiddle { +public class SetLogging extends PlayerCommand { public SetLogging(String name) { super(name); @@ -26,18 +28,18 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length > 0 && !cmds.contains(args[0])) { return false; } - + if (args.length >= 1 && !flgs.contains(args[1])) { return false; } - + if (!(sender instanceof ConsoleCommandSender) && !sender.isOp() && !sender.hasPermission("citadel.admin")) { // This should never actually happen thanks to the plugin.yml, but // we just want to be sure - sendAndLog(sender, ChatColor.RED, "Nice try"); + Utility.sendAndLog(sender, ChatColor.RED, "Nice try"); return true; } - + // validated, so lets just do it. if (args.length == 0) { StringBuilder sb = new StringBuilder("Current deep logging set to: \n"); @@ -47,10 +49,10 @@ public boolean execute(CommandSender sender, String[] args) { sb.append(" Hostile Breaks: ").append(CitadelConfigManager.shouldLogHostileBreaks()).append("\n"); sb.append(" Damage: ").append(CitadelConfigManager.shouldLogDamage()).append("\n"); sb.append(" Reinforcements: ").append(CitadelConfigManager.shouldLogReinforcement()).append("\n"); - - sendAndLog(sender, ChatColor.GREEN, sb.toString()); + + Utility.sendAndLog(sender, ChatColor.GREEN, sb.toString()); } - + String flag = null; boolean newval = false; if (args.length >= 1) { @@ -71,23 +73,23 @@ public boolean execute(CommandSender sender, String[] args) { newval = CitadelConfigManager.shouldLogDamage(); } else if ("reinforcements".equalsIgnoreCase(args[0])) { flag = "reinf_logging"; - newval = CitadelConfigManager.shouldLogReinforcement(); + newval = CitadelConfigManager.shouldLogReinforcement(); } } - + if (args.length < 2) { newval = !newval; // invert current. } else { // If can't figure it out, leave current. newval = "on".equalsIgnoreCase(args[1])? true : "off".equalsIgnoreCase(args[1]) ? false : newval; } - + if (flag != null) { Citadel.getInstance().getConfig().set(flag, newval); - sendAndLog(sender, ChatColor.GREEN, "Flag " + flag + " is " + (newval ? "on" : "off")); + Utility.sendAndLog(sender, ChatColor.GREEN, "Flag " + flag + " is " + (newval ? "on" : "off")); return true; } else { - sendAndLog(sender, ChatColor.RED, "Unknown setting!"); + Utility.sendAndLog(sender, ChatColor.RED, "Unknown setting!"); return false; } } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Stats.java b/src/vg/civcraft/mc/citadel/command/commands/Stats.java index 02d71ac0..a35e2b9d 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Stats.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Stats.java @@ -13,11 +13,13 @@ import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class Stats extends PlayerCommandMiddle{ +public class Stats extends PlayerCommand{ private List run = new ArrayList(); - + public Stats(String name) { super(name); setIdentifier("cts"); @@ -34,7 +36,7 @@ public boolean execute(CommandSender sender, String[] args) { } Player p = (Player) sender; if (!(p.isOp() || p.hasPermission("citadel.admin"))){ - sendAndLog(p, ChatColor.RED, "You do not have permission for this command."); + Utility.sendAndLog(p, ChatColor.RED, "You do not have permission for this command."); return true; } if (args.length == 0){ @@ -42,19 +44,19 @@ public boolean execute(CommandSender sender, String[] args) { return true; } Group g = GroupManager.getGroup(args[0]); - + if (g == null){ - sendAndLog(p, ChatColor.RED, "This group does not exist."); + Utility.sendAndLog(p, ChatColor.RED, "This group does not exist."); return true; } UUID uuid = NameAPI.getUUID(p.getName()); if (!g.isMember(uuid) && !(p.isOp() || p.hasPermission("citadel.admin"))){ - sendAndLog(p, ChatColor.RED, "You are not on this group."); + Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); return true; } synchronized(run){ if (run.contains(g)){ - sendAndLog(p, ChatColor.RED, "That group is already being searched for."); + Utility.sendAndLog(p, ChatColor.RED, "That group is already being searched for."); return true; } run.add(g); @@ -82,12 +84,12 @@ public class StatsMessage implements Runnable{ private final Player p; private final Group g; - + public StatsMessage(Player p, Group g){ this.p = p; this.g = g; } - + @Override public void run() { if (g == null || p == null) { @@ -102,18 +104,18 @@ public void run() { if (p != null && !p.isOnline()) {// meh be safe return; } - sendAndLog(p, ChatColor.GREEN, message); + Utility.sendAndLog(p, ChatColor.GREEN, message); } - + } - + public class StatsMessageAllGroups implements Runnable{ - + private final Player p; public StatsMessageAllGroups(Player p){ this.p = p; } - + @Override public void run() { String message = "The amount of reinforcements on the server are: "; @@ -121,7 +123,7 @@ public void run() { message += count; if (p != null && !p.isOnline()) // meh be safe return; - sendAndLog(p, ChatColor.GREEN, message); + Utility.sendAndLog(p, ChatColor.GREEN, message); } } } diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java index 3356f777..4e8384b3 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -8,8 +8,10 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class ToggleEasyMode extends PlayerCommandMiddle { +public class ToggleEasyMode extends PlayerCommand { public ToggleEasyMode(String name) { super(name); @@ -28,9 +30,9 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; PlayerState state = PlayerState.get(p); if (state.toggleEasyMode()) { - sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); + Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); } else { - sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); + Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java b/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java index 0b0136e3..c52e0e66 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java +++ b/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java @@ -17,8 +17,10 @@ import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; -public class UpdateReinforcements extends PlayerCommandMiddle{ +public class UpdateReinforcements extends PlayerCommand{ public UpdateReinforcements(String name) { super(name); @@ -36,29 +38,29 @@ public boolean execute(CommandSender sender, String[] args) { } Player p = (Player) sender; if (!p.hasPermission("citadel.admin") || !p.isOp()){ - sendAndLog(p, ChatColor.RED, "Nice try"); + Utility.sendAndLog(p, ChatColor.RED, "Nice try"); return true; } - + if (args.length == 0){ - sendAndLog(p, ChatColor.GREEN, "Searching for groups in current chunk."); + Utility.sendAndLog(p, ChatColor.GREEN, "Searching for groups in current chunk."); Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new FindGroups(p, p.getLocation())); return true; } else if (args.length == 1){ - sendAndLog(p, ChatColor.RED, "Please enter two groups."); + Utility.sendAndLog(p, ChatColor.RED, "Please enter two groups."); return true; } - + Group old = GroupManager.getGroup(args[0]); Group n = GroupManager.getGroup(args[1]); - + if (old == null || n == null){ - sendAndLog(p, ChatColor.RED, "One of the groups does not exist."); + Utility.sendAndLog(p, ChatColor.RED, "One of the groups does not exist."); return true; } - - sendAndLog(p, ChatColor.GREEN, "Beginning to change groups."); + + Utility.sendAndLog(p, ChatColor.GREEN, "Beginning to change groups."); Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new UpdateGroups(p, p.getLocation().getChunk(), old, n)); return true; } @@ -68,7 +70,7 @@ public List tabComplete(CommandSender sender, String[] args) { // TODO Auto-generated method stub return null; } - + class UpdateGroups implements Runnable{ private final Group old, n; @@ -80,7 +82,7 @@ public UpdateGroups(Player p, Chunk c, Group old, Group n){ this.p = p; this.c = c; } - + @Override public void run() { ReinforcementManager rm = Citadel.getReinforcementManager(); @@ -101,22 +103,22 @@ else if (r instanceof MultiBlockReinforcement){ } if (!p.isOnline()) return; - - sendAndLog(p, ChatColor.GREEN, "The groups have been updated."); + + Utility.sendAndLog(p, ChatColor.GREEN, "The groups have been updated."); } - + } - + class FindGroups implements Runnable{ private final Player p; private final Location loc; - + public FindGroups(Player p, Location loc){ this.p = p; this.loc = loc; } - + @Override public void run() { ReinforcementManager rm = Citadel.getReinforcementManager(); @@ -147,10 +149,10 @@ else if (r instanceof MultiBlockReinforcement){ for (String g: groups) { names.append(g).append(" "); } - - sendAndLog(p, ChatColor.GREEN, "The groups in this chunk are: " + names); + + Utility.sendAndLog(p, ChatColor.GREEN, "The groups in this chunk are: " + names); } - + } } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 33e79e8e..9d155190 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -83,7 +83,7 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { //We only care if they are placing a comparator if(event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) return; - + Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); //We only care if the comparator is going placed against something with an inventory @@ -94,10 +94,10 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure Player player = event.getPlayer(); if (player != null) { - if (playerReinforcement.canAccessChests(player)) { + if (playerReinforcement.canAccessChests(player)) { return; // We also allow players to place against chests they can access } - sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); + Utility.sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); } event.setCancelled(true); } @@ -114,16 +114,16 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure Player player = event.getPlayer(); if (player != null) { - if (playerReinforcement.canAccessChests(player)) { + if (playerReinforcement.canAccessChests(player)) { return; // We also allow players to place against chests they can access } - sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); + Utility.sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); } event.setCancelled(true); } } } - + } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @@ -163,7 +163,7 @@ public void onFortificationMode(BlockPlaceEvent event){ if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { type = state.getReinforcementType(); if (type == null) { - sendAndLog(p, ChatColor.RED, "Something went wrong, you dont seem to have a reinforcement material selected?"); + Utility.sendAndLog(p, ChatColor.RED, "Something went wrong, you dont seem to have a reinforcement material selected?"); state.reset(); event.setCancelled(true); return; @@ -190,19 +190,19 @@ public void onFortificationMode(BlockPlaceEvent event){ } if (!canPlace(b, p)){ - sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); + Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); event.setCancelled(true); return; } // Don't allow double reinforcing reinforceable plants if (wouldPlantDoubleReinforce(b)) { - sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); + Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); event.setCancelled(true); return; } // Don't allow incorrect reinforcement with exclusive reinforcement types if (!type.canBeReinforced(b.getType())) { - sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + Utility.sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); event.setCancelled(true); return; } @@ -213,7 +213,7 @@ public void onFortificationMode(BlockPlaceEvent event){ if (inv.containsAtLeast(type.getItemStack(), required)) { try { if (createPlayerReinforcement(p, groupToReinforceTo, b, type, event.getItemInHand()) == null) { - sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); + Utility.sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); } else { state.checkResetMode(); } @@ -222,7 +222,7 @@ public void onFortificationMode(BlockPlaceEvent event){ } } else { if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", + Utility.sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", state.getReinforcementType().getMaterial().name())); state.reset(); event.setCancelled(true); @@ -529,16 +529,16 @@ public void interact(PlayerInteractEvent pie) { if (type != null) { // Don't allow double reinforcing reinforceable plants if (wouldPlantDoubleReinforce(block)) { - sendAndLog(player, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); + Utility.sendAndLog(player, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); return; } // Don't allow incorrect reinforcement with exclusive reinforcement types if (!type.canBeReinforced(block.getType())) { - sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); return; } if (!canPlace(block, player)){ - sendAndLog(player, ChatColor.RED, "Cancelled interact easymode rein, mismatched reinforcement."); + Utility.sendAndLog(player, ChatColor.RED, "Cancelled interact easymode rein, mismatched reinforcement."); return; } @@ -567,7 +567,7 @@ public void interact(PlayerInteractEvent pie) { Group group = reinforcement.getGroup(); StringBuilder sb; if (player.hasPermission("citadel.admin.ctinfodetails")) { - sendAndLog(player, ChatColor.GREEN, String.format( + Utility.sendAndLog(player, ChatColor.GREEN, String.format( "Loc[%s]", reinforcement.getLocation() .toString())); String groupName = "!NULL!"; @@ -608,7 +608,7 @@ public void interact(PlayerInteractEvent pie) { } sb.append("\nGroup id: " + reinforcement.getGroupId()); - sendAndLog(player, ChatColor.GREEN, sb.toString()); + Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); } else if (reinforcement.canViewInformation(player)) { sb = new StringBuilder(); boolean immature = timeUntilMature(reinforcement) != 0 @@ -631,9 +631,14 @@ public void interact(PlayerInteractEvent pie) { if (reinforcement.isInsecure()) { sb.append(" (Insecure)"); } - sendAndLog(player, ChatColor.GREEN, sb.toString()); + Location blockLoc = reinforcement.getLocation(); + String blockName = reinforcement.getLocation().getBlock().getType().toString(); + String hoverMessage = String.format( + "Block: %s\nLocation: [%s %d %d %d]", + blockName, blockLoc.getWorld().getName(), (int)blockLoc.getX(), (int)blockLoc.getY(), (int)blockLoc.getZ()); + Utility.sendAndLog(player, ChatColor.GREEN, sb.toString(), hoverMessage); } else { - sendAndLog(player, ChatColor.RED, reinforcementStatus + Utility.sendAndLog(player, ChatColor.RED, reinforcementStatus + ", " + ageStatus); } if (player.getGameMode() == GameMode.CREATIVE) { @@ -651,14 +656,14 @@ public void interact(PlayerInteractEvent pie) { // Save the change /*Citadel.getReinforcementManager().saveReinforcement(reinforcement);*/ if (reinforcement.isInsecure()) { - sendAndLog(player, ChatColor.YELLOW, + Utility.sendAndLog(player, ChatColor.YELLOW, "Reinforcement now insecure"); } else { - sendAndLog(player, ChatColor.GREEN, + Utility.sendAndLog(player, ChatColor.GREEN, "Reinforcement secured"); } } else { - sendAndLog(player, ChatColor.RED, "Access denied"); + Utility.sendAndLog(player, ChatColor.RED, "Access denied"); } } break; @@ -672,17 +677,17 @@ public void interact(PlayerInteractEvent pie) { ReinforcementType type = ReinforcementType .getReinforcementType(stack); if (type == null) { - sendAndLog(player, ChatColor.RED, stack.getType() + Utility.sendAndLog(player, ChatColor.RED, stack.getType() .name() + " is not a reinforcable material."); - sendAndLog(player, ChatColor.RED, + Utility.sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); state.reset(); return; } // Don't allow incorrect reinforcement with exclusive reinforcement types if (!type.canBeReinforced(block.getType())) { - sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); - sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); + Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + Utility.sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); state.reset(); return; } @@ -694,10 +699,10 @@ public void interact(PlayerInteractEvent pie) { } // Don't allow double reinforcing reinforceable plants if (wouldPlantDoubleReinforce(block)) { - sendAndLog(player, ChatColor.RED, + Utility.sendAndLog(player, ChatColor.RED, "Cancelled reinforcement, crop would already be reinforced."); } else { - if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null) == null && + if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null) == null && CitadelConfigManager.shouldLogReinforcement()) { // someone else's job to tell the player what went wrong, but let's do log it. Citadel.getInstance().getLogger().log(Level.INFO, "Create Reinforcement by {0} at {1} cancelled by plugin", @@ -719,7 +724,7 @@ public void interact(PlayerInteractEvent pie) { //rm.saveReinforcement(reinforcement); message = "Group has been changed to: " + group.getName() + "."; - sendAndLog(player, ChatColor.GREEN, message); + Utility.sendAndLog(player, ChatColor.GREEN, message); } else { reinforcement.setGroup(old_group); } @@ -729,7 +734,7 @@ public void interact(PlayerInteractEvent pie) { if (type != null && !reinforcement.getStackRepresentation().isSimilar(type.getItemStack())) { //hit with different rein material, so switch material if (!type.canBeReinforced(block.getType())) { - sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); + Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); } else { ReinforcementChangeTypeEvent e = new ReinforcementChangeTypeEvent(reinforcement, type, player); @@ -740,7 +745,7 @@ public void interact(PlayerInteractEvent pie) { Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { if(createPlayerReinforcement(player, state.getGroup(), block, type, null) != null) { - sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); + Utility.sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); } else if (CitadelConfigManager.shouldLogReinforcement()) { Citadel.getInstance().getLogger().log(Level.INFO, "Change Reinforcement by {0} at {1} cancelled by plugin", new Object[] {player.getName(), block.getLocation()}); @@ -750,7 +755,7 @@ public void interact(PlayerInteractEvent pie) { } } } else { - sendAndLog(player, ChatColor.RED, + Utility.sendAndLog(player, ChatColor.RED, "You are not permitted to modify this reinforcement"); } pie.setCancelled(true); @@ -799,14 +804,4 @@ public void liquidDumpEvent(PlayerBucketEmptyEvent event) { event.setCancelled(true); } } - - protected void sendAndLog(Player receiver, ChatColor color, String message) { - receiver.sendMessage(color + message); - if (CitadelConfigManager.shouldLogPlayerCommands()) { - Citadel.getInstance() - .getLogger() - .log(Level.INFO, "Sent {0} reply {1}", - new Object[] { receiver.getName(), message }); - } - } } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index ab9dc90c..08938b03 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -167,14 +167,14 @@ public void hangingPlaceEvent(HangingPlaceEvent event){ return; } if (!canPlace(b, p)){ - sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); + Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); event.setCancelled(true); return; } ReinforcementType type = state.getReinforcementType(); // Don't allow double reinforcing reinforceable plants if (wouldPlantDoubleReinforce(b)) { - sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); + Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); event.setCancelled(true); return; } @@ -185,15 +185,15 @@ public void hangingPlaceEvent(HangingPlaceEvent event){ if (inv.containsAtLeast(type.getItemStack(), required)) { try { if (createPlayerReinforcement(p, state.getGroup(), b, type, p.getInventory().getItemInMainHand()) == null) { - sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); + Utility.sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); } else { state.checkResetMode(); - } + } } catch(ReinforcemnetFortificationCancelException ex){ Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); } } else { - sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", + Utility.sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", state.getReinforcementType().getMaterial().name())); state.reset(); event.setCancelled(true); @@ -227,7 +227,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ Group group = pr.getGroup(); StringBuilder sb; if (player.hasPermission("citadel.admin.ctinfodetails")) { - sendAndLog(player, ChatColor.GREEN, String.format( + Utility.sendAndLog(player, ChatColor.GREEN, String.format( "Loc[%s]", pr.getLocation().toString())); String groupName = "!NULL!"; if (group != null) { @@ -264,12 +264,12 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ } sb.append("\nGroup id: " + pr.getGroupId()); - sendAndLog(player, ChatColor.GREEN, sb.toString()); + Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); event.setCancelled(is_cancelled); return; } } - boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); + boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) && !pr.getGroup().isDisciplined()) { reinforcementBroken(player, rein); is_cancelled = false; @@ -317,7 +317,7 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event){ Reinforcement rein = rm.getReinforcement(entity.getLocation()); if (rein == null || !(rein instanceof PlayerReinforcement)) return; - PlayerReinforcement pr = (PlayerReinforcement)rein; + PlayerReinforcement pr = (PlayerReinforcement)rein; Group group = pr.getGroup(); if (group == null){return;} if (group.isMember(event.getPlayer().getUniqueId()) == false){ @@ -336,7 +336,7 @@ public void entityDamageEvent(EntityDamageByEntityEvent event){ return; Entity damager = event.getDamager(); if (!(damager instanceof Player)){event.setCancelled(true);return;} Player player = (Player)damager; - PlayerReinforcement pr = (PlayerReinforcement)rein; + PlayerReinforcement pr = (PlayerReinforcement)rein; Group group = pr.getGroup(); if (group == null){return;} if (group.isMember(player.getUniqueId()) == false){ @@ -345,17 +345,17 @@ public void entityDamageEvent(EntityDamageByEntityEvent event){ } } } - + @EventHandler(priority=EventPriority.LOWEST) public void playerJoinEvent(PlayerJoinEvent event){ Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); - + new BukkitRunnable() { @Override public void run() { GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); - for (String groupName : db.getGroupNames(uuid)){ + for (String groupName : db.getGroupNames(uuid)){ if(NameAPI.getGroupManager().hasAccess(groupName, uuid, PermissionType.getPermission("REINFORCE"))) { db.updateTimestamp(groupName); } @@ -370,11 +370,4 @@ public void run() { } } } - - protected void sendAndLog(Player receiver, ChatColor color, String message) { - receiver.sendMessage(color + message); - if (CitadelConfigManager.shouldLogPlayerCommands()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); - } - } } From 5513bb63e625f21df306169295576e620cc598da Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 02:43:17 +0000 Subject: [PATCH 073/255] Improve showing usage of /cte --- src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java index 698a26c4..698e2ad2 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -39,7 +39,7 @@ public boolean execute(CommandSender sender, String[] args) { } sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); } else { - sendAndLog(p, ChatColor.RED, "Usage: /cte [on|off]"); + sendAndLog(p, ChatColor.RED, String.format("Usage: %s", this.getUsage())); } return true; } From 9a295ba25870a8cab38db4a79a722c19f52340dc Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 11:31:32 +0000 Subject: [PATCH 074/255] Trim trailing whitespace --- .../reinforcement/PlayerReinforcement.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index 4a64b98b..3a6ac5bb 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -28,7 +28,7 @@ public class PlayerReinforcement extends Reinforcement{ private boolean isInsecure = false; private ItemStack stack; private String materialName; - + public PlayerReinforcement(Location loc, int health, int creation, int acid, Group g, ItemStack stack) { super(loc, stack.getType(), health, creation, acid); @@ -38,13 +38,13 @@ public PlayerReinforcement(Location loc, int health, gm = NameAPI.getGroupManager(); } this.gid = g.getGroupId(); - + ItemMeta meta = this.stack.hasItemMeta() ? this.stack.getItemMeta(): null; String lore = meta != null && meta.hasLore() && meta.getLore().size() > 0 ? meta.getLore().get(0): null; - + this.materialName = lore != null && lore.length() > 0 ? "\"" + lore + "\"": stack.getType().name(); } - + public boolean canBypass(Player p) { checkValid(); if (g == null) { @@ -52,7 +52,7 @@ public boolean canBypass(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("BYPASS_REINFORCEMENT")); } - + public boolean canAccessCrops(Player p) { checkValid(); if (g == null) { @@ -60,7 +60,7 @@ public boolean canAccessCrops(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CROPS")); } - + public boolean canAccessChests(Player p) { checkValid(); if (g == null) { @@ -68,7 +68,7 @@ public boolean canAccessChests(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CHESTS")); } - + public boolean canAccessDoors(Player p) { checkValid(); if (g == null) { @@ -76,7 +76,7 @@ public boolean canAccessDoors(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("DOORS")); } - + public boolean canViewInformation(Player p) { checkValid(); if (g == null) { @@ -84,7 +84,7 @@ public boolean canViewInformation(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("REINFORCEMENT_INFO")); } - + public boolean canMakeInsecure(Player p) { checkValid(); if (g == null) { @@ -92,7 +92,7 @@ public boolean canMakeInsecure(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("INSECURE_REINFORCEMENT")); } - + public boolean canAcid(Player p) { checkValid(); if (g == null) { @@ -100,25 +100,25 @@ public boolean canAcid(Player p) { } return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("ACIDBLOCK")); } - + public boolean isSecurable() { return (isContainer() || isDoor()); } - + public int getDamageMultiplier(){ checkValid(); if (g == null){ return 1; } Timestamp ts = NameAPI.getGroupManager().getTimestamp(g.getName()); - + long shiftMultiplier = ((System.currentTimeMillis() - ts.getTime()) / (long)86400000) / (long)Citadel.getReinforcementManager().getDayMultiplier(); if (shiftMultiplier > 0) { return 1 << shiftMultiplier; } return 1; } - + /** * @return return false if it is secure, return true if it is insecure. */ @@ -177,7 +177,7 @@ public boolean rable() { return block.getState() instanceof InventoryHolder || block.getState().getData() instanceof Openable || Utility.doorTypes.contains(block.getType()); } - + /** * @return True if the reinforced block is a door/trapdoor etc. or part of one */ @@ -185,12 +185,12 @@ public boolean isDoor() { Block block = getLocation().getBlock(); return Utility.doorTypes.contains(block.getType()) || block.getState().getData() instanceof Openable; } - + public boolean isContainer() { return getLocation().getBlock().getState() instanceof InventoryHolder; } - - + + /** * Returns the group this PlayerReinforcement is associated with. * @return group @@ -224,10 +224,10 @@ public String getStatus() { } else { verb = "Reinforced"; } - + return String.format("%s %s with %s", verb, getHealthText(), this.materialName); } - + private void checkValid(){ if (g == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "CheckValid was called but the underlying group " + gid + " is gone for " + this.getLocation() + "!"); From f22ed74e55e28e864f32f7fd51942067383b0e0b Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 11:32:28 +0000 Subject: [PATCH 075/255] Fix an NPE when destroying blocks of non-existent groups --- .../mc/citadel/reinforcement/PlayerReinforcement.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index 3a6ac5bb..20b0eeb0 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -234,9 +234,10 @@ private void checkValid(){ return; } if (!g.isValid()){ // incase it was recently merged/ deleted. - g = GroupManager.getGroup(g.getGroupId()); + int groupId = g.getGroupId(); + g = GroupManager.getGroup(groupId); if (g == null) { - Citadel.getInstance().getLogger().log(Level.INFO, "Group " + g.getGroupId() + " was deleted or merged but not marked invalid!"); + Citadel.getInstance().getLogger().log(Level.INFO, "Group " + groupId + " was deleted or merged but not marked invalid!"); } isDirty = true; } From 0c8171cb3c0c61d4043d76583783fe3c4850f28a Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 11:42:18 +0000 Subject: [PATCH 076/255] Trim trailing whitespace --- .../database/CitadelReinforcementData.java | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 43eaf4ec..e4db6285 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -67,28 +67,28 @@ public static ReinforcementNature decode(String label) { } } - private static final String getRein = + private static final String getRein = "SELECT material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " + "FROM reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; - private static final String getReins = + private static final String getReins = "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " + "FROM reinforcement WHERE chunk_x = ? and chunk_z = ? and world = ?;"; - private static final String addRein = + private static final String addRein = "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, chunk_x, chunk_z) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); "; private static final String removeRein = "DELETE from reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; - private static final String updateRein = + private static final String updateRein = "UPDATE reinforcement SET durability = ?, insecure = ?, group_id = ?, maturation_time = ?, acid_time = ? " + "WHERE x = ? and y = ? and z = ? and world = ?"; private static final String getNatures = "SELECT rein_type_id, rein_type FROM reinforcement_type"; - - private static final String selectReinCountForGroup = + + private static final String selectReinCountForGroup = "SELECT count(*) AS count FROM reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; private static final String selectReinCount = "SELECT count(*) AS count FROM reinforcement"; public CitadelReinforcementData(ManagedDatasource db){ this.db = db; - + if (!db.isManaged()) { // First "migration" is conversion from old system to new boolean isNew = true; @@ -104,7 +104,7 @@ public CitadelReinforcementData(ManagedDatasource db){ if (!isNew) { try (Connection connection = db.getConnection(); - PreparedStatement migrateInstall = connection.prepareStatement( + PreparedStatement migrateInstall = connection.prepareStatement( "INSERT INTO managed_plugin_data (plugin_name, current_migration_number, last_migration)" + " SELECT plugin_name, max(db_version), max(str_to_date(update_time, '%Y-%m-%d %H:%i:%s' )) FROM db_version WHERE plugin_name = ? LIMIT 1;");) { migrateInstall.setString(1, Citadel.getInstance().getPluginName()); @@ -126,10 +126,10 @@ public CitadelReinforcementData(ManagedDatasource db){ } else { logger.log(Level.INFO, "Still at it, eh?"); } - + doPrepareNatures(); } - + private void doPrepareNatures() { try (Connection connection = db.getConnection(); PreparedStatement statement = connection.prepareStatement(CitadelReinforcementData.getNatures); @@ -145,7 +145,7 @@ private void doPrepareNatures() { logger.log(Level.WARNING, "Note that although configured, {0} is not a recognized Reinforcement Nature", type); } } - + if (natures.size() == 0) { logger.log(Level.SEVERE, "Failed to find any reinforcement types, shutting down."); Bukkit.shutdown(); @@ -155,7 +155,7 @@ private void doPrepareNatures() { Bukkit.shutdown(); } } - + public void registerMigrations() { db.registerMigration(6, false, new Callable () { @@ -205,7 +205,7 @@ public Boolean call() throws Exception { + "chunk_id varchar(255)," + "world varchar (255) not null," + "primary key rein_id_key (rein_id)," - + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", + + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", // I like turtles mother fucker. Never program because then you get turtles. "insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;", // populate that bitch. "alter table reinforcement add rein_id int not null, drop chunk_id;", @@ -221,7 +221,7 @@ public Boolean call() throws Exception { "alter table reinforcement_id add index `chunk_id_index` (chunk_id);"); db.registerMigration(8, false, "alter table reinforcement_id drop primary key," + " add primary key (rein_id, x, y, z, world);"); - db.registerMigration(9, false, "alter table reinforcement add acid_time int not null;", + db.registerMigration(9, false, "alter table reinforcement add acid_time int not null;", "update reinforcement set acid_time = maturation_time;"); // Might take a minute. db.registerMigration(10, false, "drop procedure if exists insertReinID;", "create definer=current_user procedure insertReinID(" @@ -269,7 +269,7 @@ public Boolean call() throws Exception { + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); - db.registerMigration(12, false, + db.registerMigration(12, false, "CREATE TABLE reinforcement_temp (" + "rein_id int not null auto_increment," + "x int not null," @@ -301,8 +301,8 @@ public Boolean call() throws Exception { "DROP PROCEDURE IF EXISTS insertRein;" ); } - - + + /** * Is used to grab the reinforcement from the mysql db. * If there isn't a reinforcement at the location it @@ -356,7 +356,7 @@ public Reinforcement getReinforcement(Location loc){ if (g == null) { if (CitadelConfigManager.shouldLogReinforcement()) { logger.log(Level.WARNING, - "Player Reinforcement at {0} lacks a valid group (group {1} failed lookup)", + "Player Reinforcement at {0} lacks a valid group (group {1} failed lookup)", new Object[] {loc, group_id}); } return null; // group not found! @@ -381,7 +381,7 @@ public Reinforcement getReinforcement(Location loc){ } return null; } - + /** * Returns a list of reinforcements in a given chunk. * @param The chunk you want the reinforcements about. @@ -407,7 +407,7 @@ public List getReinforcements(Chunk chunk){ getReins.setInt(1, cx); getReins.setInt(2, cz); getReins.setString(3, world); - + try (ResultSet set = getReins.executeQuery();) { while (set.next()) { int x = set.getInt(1); @@ -426,14 +426,14 @@ public List getReinforcements(Chunk chunk){ // Sketch: when doing multiblock, have an FK that self-references the same table, so multiple locations link to a single rein. //int linked_rein_id = set.getInt(12); Location loc = new Location(chunk.getWorld(), x, y, z); - + switch(rein_type) { case PLAYER_REINFORCEMENT: Group g = GroupManager.getGroup(group_id); if (g == null) { if (CitadelConfigManager.shouldLogReinforcement()) { logger.log(Level.WARNING, - "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", + "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", new Object[] {chunk, loc, group_id}); } continue; // group not found! @@ -466,7 +466,7 @@ public List getReinforcements(Chunk chunk){ } return reins; } - + /** * Inserts a reinforcement into the Database. Should only be called from SaveManager. * @param The Reinforcement to save. @@ -474,7 +474,7 @@ public List getReinforcements(Chunk chunk){ public void insertReinforcement(Reinforcement rein){ insertReinforcement(rein, true); } - + /** * Internal, just sets the params correctly depending on nature. Assumes a single compatible query across all natures. * @param rein @@ -494,17 +494,17 @@ private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement i int acidTime = rein.getAcidTime(); int cx = loc.getChunk().getX(); int cz = loc.getChunk().getZ(); - + // specific fields, "safe" values. boolean insecure = false; String lore = null; int groupId = -1; int type = 0; - + if (rein instanceof PlayerReinforcement) { type = invNatures.get(ReinforcementNature.PLAYER_REINFORCEMENT); - - PlayerReinforcement prein = (PlayerReinforcement) rein; + + PlayerReinforcement prein = (PlayerReinforcement) rein; insecure = prein.isInsecure(); ItemMeta meta = prein.getStackRepresentation().getItemMeta(); if (meta.hasLore()) { @@ -516,8 +516,8 @@ private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement i } else { lore = null; } - - Group g = prein.getGroup(); + + Group g = prein.getGroup(); if (g == null) { logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); } @@ -538,17 +538,17 @@ private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement i insertRein.setBoolean(7, insecure); insertRein.setInt(8, maturationTime); insertRein.setInt(9, acidTime); - insertRein.setInt(10, type); + insertRein.setInt(10, type); insertRein.setString(11, lore); insertRein.setInt(12, groupId); insertRein.setInt(13, cx); insertRein.setInt(14, cz); return insertRein; } - + /** * Use this to insert a set of Player reinforcements all at once. Note that this automatically fails over to single-insertions if the batch fails in any way. - * + * * @param reins */ public void insertManyReinforcements(Collection reins) { @@ -557,7 +557,7 @@ public void insertManyReinforcements(Collection reins) { try (Connection connection = db.getConnection(); PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { int count = 0; - for (Reinforcement rein : reins) { + for (Reinforcement rein : reins) { this.prepInsertRein(rein, insertRein).addBatch(); count++; if (count % 100 == 0) { @@ -572,7 +572,7 @@ public void insertManyReinforcements(Collection reins) { failover = true; logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- 100 attempted -- outcome indeterminate"); break; - } + } } } if (count % 100 != 0) { @@ -591,7 +591,7 @@ public void insertManyReinforcements(Collection reins) { failover = true; logger.log(Level.SEVERE, "Citadel encountered a critical error while inserting a batch of reinforcements", e); } - + if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while inserting a batch of records. Failing over to individual insertion logic."); for (Reinforcement rein : reins) { @@ -599,13 +599,13 @@ public void insertManyReinforcements(Collection reins) { } } } - + public void insertReinforcement(Reinforcement rein, boolean retry){ if (rein == null){ logger.log(Level.WARNING, "CitadelReinforcementData insertReinforcement called with null"); return; } - + try (Connection connection = db.getConnection(); PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { if (this.prepInsertRein(rein, insertRein).executeUpdate() != 1) { @@ -634,7 +634,7 @@ public void deleteManyReinforcements(Collection reins) { try (Connection connection = db.getConnection(); PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { int count = 0; - for (Reinforcement rein : reins) { + for (Reinforcement rein : reins) { Location loc = rein.getLocation(); int x = loc.getBlockX(); int y = loc.getBlockY(); @@ -661,7 +661,7 @@ public void deleteManyReinforcements(Collection reins) { } } } - + if (count % 100 != 0) { int[] done = removeRein.executeBatch(); if (done == null || done.length == 0) { @@ -678,7 +678,7 @@ public void deleteManyReinforcements(Collection reins) { failover = true; logger.log(Level.SEVERE, "Citadel encountered a critical error while removing a batch of reinforcements", e); } - + if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while deleting a batch of records. Failing over to individual deleting logic."); for (Reinforcement rein : reins) { @@ -686,10 +686,10 @@ public void deleteManyReinforcements(Collection reins) { } } } - + /** * Deletes a Reinforcement from the database. Should only be called within SaveManager - * + * * @param The Reinforcement to delete. */ public void deleteReinforcement(Reinforcement rein){ @@ -755,10 +755,10 @@ private PreparedStatement prepSaveReinforcement(Reinforcement rein, PreparedStat return updateRein; } - + /** * Save many reinforcements all at once! - * + * * @param reins */ public void saveManyReinforcements(Collection reins) { @@ -772,7 +772,7 @@ public void saveManyReinforcements(Collection reins) { int count = 0; t = System.currentTimeMillis(); sb.append(t - s).append("ms setup "); - for (Reinforcement rein : reins) { + for (Reinforcement rein : reins) { s = System.currentTimeMillis(); this.prepSaveReinforcement(rein, updateRein).addBatch(); t = System.currentTimeMillis(); @@ -794,7 +794,7 @@ public void saveManyReinforcements(Collection reins) { } } } - + if (count % 100 != 0) { s = System.currentTimeMillis(); int[] done = updateRein.executeBatch(); @@ -814,16 +814,16 @@ public void saveManyReinforcements(Collection reins) { failover = true; logger.log(Level.SEVERE, "Citadel encountered a critical error while saving a batch of reinforcements", e); } - + logger.log(Level.INFO, sb.toString()); if (failover) { logger.log(Level.WARNING, "Citadel encountered uncertainty while saving a batch of records. Failing over to individual save logic."); for (Reinforcement rein : reins) { saveReinforcement(rein); } - } + } } - + /** * Saves the Reinforcement to the Database. Should only be called from SaveManager. * @param The Reinforcement to save. @@ -835,17 +835,17 @@ public void saveReinforcement(Reinforcement rein){ } try (Connection connection = db.getConnection(); PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - + if (this.prepSaveReinforcement(rein, updateRein).executeUpdate() != 1) { logger.log(Level.WARNING, "Update did not alter any records for save at {0}", rein.getLocation()); } } catch (SQLException e) { - logger.log(Level.WARNING, + logger.log(Level.WARNING, "Failed to save an update to reinforcement at {0}", rein.getLocation()); logger.log(Level.SEVERE, "The Exception on saving a reinforcement:", e); } } - + public int getReinCountForGroup(String group){ if (group == null){ logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called with null"); @@ -862,9 +862,9 @@ public int getReinCountForGroup(String group){ allIDs.append(id).append(","); } allIDs.append(gg.getGroupId()); - + String finalIDs = allIDs.toString(); - + try (Connection connection = db.getConnection(); PreparedStatement selectReinCountForGroup = connection.prepareStatement(CitadelReinforcementData.selectReinCountForGroup);) { selectReinCountForGroup.setString(1, finalIDs); @@ -879,7 +879,7 @@ public int getReinCountForGroup(String group){ } return 0; } - + public int getReinCountForAllGroups(){ try (Connection connection = db.getConnection(); PreparedStatement selectReinCount = connection.prepareStatement(CitadelReinforcementData.selectReinCount); From 72910e4064a8aaab8631dc6a7281fb6c469e76d5 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sat, 24 Feb 2018 11:45:07 +0000 Subject: [PATCH 077/255] Fix an error message --- .../mc/citadel/database/CitadelReinforcementData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index e4db6285..a854eaeb 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -613,8 +613,8 @@ public void insertReinforcement(Reinforcement rein, boolean retry){ throw new SQLException("Reinforcement index collision"); } } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it" - + (retry ? "and trying again. " : "") + "Including the stack incase it is useful.", e); + Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it " + + (retry ? "and trying again. " : "") + "Including the stack in case it is useful.", e); // Let's delete the reinforcement; if a user is able to place one then the db is out of synch / messed up some how. deleteReinforcement(rein); // Now lets try again. From 7782c64c226160bf39cc1072eba6c73c362bef09 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Tue, 27 Feb 2018 00:56:05 +0000 Subject: [PATCH 078/255] Refactor command handlers for /ctr and /ctf --- .../command/commands/Fortification.java | 34 +++++++++---------- .../citadel/command/commands/Reinforce.java | 13 +++---- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index 91d14532..9502666e 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -55,7 +55,6 @@ public boolean execute(CommandSender sender, String[] args) { sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } - PlayerType type = g.getPlayerType(uuid); if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ sendAndLog(p, ChatColor.RED, "You are not on this group."); @@ -66,27 +65,28 @@ public boolean execute(CommandSender sender, String[] args) { + "place a reinforcement on this group."); return true; } - ItemStack stack = p.getInventory().getItemInMainHand(); + PlayerState state = PlayerState.get(p); - ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); - if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && state.getGroup().getName() == g.getName()){ + if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && state.getGroup().getName() == g.getName()) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); + return true; } - else{ - if (stack.getType() == Material.AIR){ - sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); - return true; - } - else if (reinType == null){ - sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); - return true; - } - sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /fortify or /cto to turn this off when you are done."); - state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); - state.setFortificationItemStack(reinType.getItemStack()); - state.setGroup(g); + + ItemStack stack = p.getInventory().getItemInMainHand(); + if (stack.getType() == Material.AIR) { + sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); + return true; + } + ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); + if (reinType == null) { + sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); + return true; } + sendAndLog(p, ChatColor.GREEN, "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand. \n Type /fortify or /cto to turn this off when you are done."); + state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); + state.setFortificationItemStack(reinType.getItemStack()); + state.setGroup(g); return true; } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 6e46fda3..4b79aa0c 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -61,16 +61,17 @@ public boolean execute(CommandSender sender, String[] args) { + "place a reinforcement on this group."); return true; } + PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.REINFORCEMENT && state.getGroup().getName() == g.getName()){ + if (state.getMode() == ReinforcementMode.REINFORCEMENT && state.getGroup().getName() == g.getName()) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); + return true; } - else{ - sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /reinforce or /cto to turn this off when you are done."); - state.setMode(ReinforcementMode.REINFORCEMENT); - state.setGroup(g); - } + + sendAndLog(p, ChatColor.GREEN, "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them. \n Type /reinforce or /cto to turn this off when you are done."); + state.setMode(ReinforcementMode.REINFORCEMENT); + state.setGroup(g); return true; } From 5d59856d8e1a5f798961ec53a340d1c9cc7b8b2d Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Tue, 27 Feb 2018 01:00:59 +0000 Subject: [PATCH 079/255] Add null checks to command handlers for /ctr and /ctf --- .../civcraft/mc/citadel/command/commands/Fortification.java | 5 ++++- src/vg/civcraft/mc/citadel/command/commands/Reinforce.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index 9502666e..a2fb1e1f 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -67,7 +67,10 @@ public boolean execute(CommandSender sender, String[] args) { } PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && state.getGroup().getName() == g.getName()) { + if (ReinforcementMode.REINFORCEMENT_FORTIFICATION.equals(state.getMode()) + && state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 4b79aa0c..a241fed3 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -63,7 +63,10 @@ public boolean execute(CommandSender sender, String[] args) { } PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.REINFORCEMENT && state.getGroup().getName() == g.getName()) { + if (ReinforcementMode.REINFORCEMENT.equals(state.getMode()) + && state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; From b3b8b8e34c77ea0477230bfa236da39fc8c0da47 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Tue, 27 Feb 2018 02:07:10 +0000 Subject: [PATCH 080/255] Fix typing /ctf or /ctr without arguments not exiting their modes --- .../mc/citadel/command/commands/Fortification.java | 7 ++++--- src/vg/civcraft/mc/citadel/command/commands/Reinforce.java | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index a2fb1e1f..4ab4d6d5 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -68,9 +68,10 @@ public boolean execute(CommandSender sender, String[] args) { PlayerState state = PlayerState.get(p); if (ReinforcementMode.REINFORCEMENT_FORTIFICATION.equals(state.getMode()) - && state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())) { + && (args.length == 0 + || (state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())))) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index a241fed3..64d63a13 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -64,9 +64,10 @@ public boolean execute(CommandSender sender, String[] args) { PlayerState state = PlayerState.get(p); if (ReinforcementMode.REINFORCEMENT.equals(state.getMode()) - && state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())) { + && (args.length == 0 + || (state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())))) { sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; From e533a8ab1602f368b214e37243893f5d5377bb3d Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Thu, 8 Mar 2018 12:16:00 +0000 Subject: [PATCH 081/255] Fix compilation error --- .../mc/citadel/command/commands/ToggleEasyMode.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java index 7bdae504..6404a6a6 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java +++ b/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java @@ -34,14 +34,14 @@ public boolean execute(CommandSender sender, String[] args) { if (!state.getEasyMode()) { state.toggleEasyMode(); } - sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); + Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); } else if (args[0].equalsIgnoreCase("off")) { if (state.getEasyMode()) { state.toggleEasyMode(); } - sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); + Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); } else { - sendAndLog(p, ChatColor.RED, String.format("Usage: %s", this.getUsage())); + Utility.sendAndLog(p, ChatColor.RED, String.format("Usage: %s", this.getUsage())); } return true; } From 1410176aebfd44f434589825fb62ec317ce0d95d Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Thu, 8 Mar 2018 12:31:31 +0000 Subject: [PATCH 082/255] Increment the version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b674b94e..c1951a09 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.10.0 + 3.11.0 Citadel https://github.com/Devoted/Citadel From 9daf20743a815093b7b0b0e5e87249b3f4ef5dcc Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sun, 15 Apr 2018 11:14:19 +0000 Subject: [PATCH 083/255] Fix not showing a /cti hover message for unknown groups --- .../mc/citadel/listener/BlockListener.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 9d155190..cb3805a0 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -566,6 +566,11 @@ public void interact(PlayerInteractEvent pie) { String ageStatus = reinforcement.getAgeStatus(); Group group = reinforcement.getGroup(); StringBuilder sb; + Location blockLoc = reinforcement.getLocation(); + String blockName = reinforcement.getLocation().getBlock().getType().toString(); + String hoverMessage = String.format( + "Block: %s\nLocation: [%s %d %d %d]", + blockName, blockLoc.getWorld().getName(), (int)blockLoc.getX(), (int)blockLoc.getY(), (int)blockLoc.getZ()); if (player.hasPermission("citadel.admin.ctinfodetails")) { Utility.sendAndLog(player, ChatColor.GREEN, String.format( "Loc[%s]", reinforcement.getLocation() @@ -631,15 +636,10 @@ public void interact(PlayerInteractEvent pie) { if (reinforcement.isInsecure()) { sb.append(" (Insecure)"); } - Location blockLoc = reinforcement.getLocation(); - String blockName = reinforcement.getLocation().getBlock().getType().toString(); - String hoverMessage = String.format( - "Block: %s\nLocation: [%s %d %d %d]", - blockName, blockLoc.getWorld().getName(), (int)blockLoc.getX(), (int)blockLoc.getY(), (int)blockLoc.getZ()); Utility.sendAndLog(player, ChatColor.GREEN, sb.toString(), hoverMessage); } else { - Utility.sendAndLog(player, ChatColor.RED, reinforcementStatus - + ", " + ageStatus); + Utility.sendAndLog(player, ChatColor.RED, + reinforcementStatus + ", " + ageStatus, hoverMessage); } if (player.getGameMode() == GameMode.CREATIVE) { pie.setCancelled(true); From 06c585a5ba68319b7c02a099e4e34d0b83f16af3 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sun, 15 Apr 2018 11:30:13 +0000 Subject: [PATCH 084/255] Refactor Utility.sendAndLog() --- src/vg/civcraft/mc/citadel/Utility.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index d4d8e418..acf0facd 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -64,15 +64,14 @@ public static void sendAndLog(CommandSender receiver, ChatColor color, String me // Bug: colors don't seem to work with player.spigot().sendMessage() when sending multiline strings. public static void sendAndLog(Player player, ChatColor color, String message, String hoverMessage) { - if (hoverMessage != null && !hoverMessage.trim().isEmpty()) { - TextComponent playerMessage = new TextComponent(color + message); - playerMessage.setHoverEvent( - new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create())); - player.spigot().sendMessage(playerMessage); - } else { + if (hoverMessage == null || hoverMessage.trim().isEmpty()) { sendAndLog(player, color, message); return; } + TextComponent playerMessage = new TextComponent(color + message); + playerMessage.setHoverEvent( + new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create())); + player.spigot().sendMessage(playerMessage); if (CitadelConfigManager.shouldLogPlayerCommands()) { Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{player.getName(), message}); } From 48030ba57d9ba82503ce62f8217c24d8872ec526 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sun, 15 Apr 2018 11:41:42 +0000 Subject: [PATCH 085/255] Fix a Utility.sendAndLog() bug --- src/vg/civcraft/mc/citadel/Utility.java | 11 ++++++----- .../citadel/command/commands/Fortification.java | 16 ++++++---------- .../mc/citadel/command/commands/Reinforce.java | 16 ++++++---------- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index acf0facd..c2b13d0a 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -62,16 +62,17 @@ public static void sendAndLog(CommandSender receiver, ChatColor color, String me } } - // Bug: colors don't seem to work with player.spigot().sendMessage() when sending multiline strings. public static void sendAndLog(Player player, ChatColor color, String message, String hoverMessage) { if (hoverMessage == null || hoverMessage.trim().isEmpty()) { sendAndLog(player, color, message); return; } - TextComponent playerMessage = new TextComponent(color + message); - playerMessage.setHoverEvent( - new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create())); - player.spigot().sendMessage(playerMessage); + HoverEvent hover = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create()); + for (String line : message.split("\n")) { + TextComponent playerMessage = new TextComponent(color + line); + playerMessage.setHoverEvent(hover); + player.spigot().sendMessage(playerMessage); + } if (CitadelConfigManager.shouldLogPlayerCommands()) { Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{player.getName(), message}); } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index bdd91d10..8d8f287d 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -91,16 +91,12 @@ public boolean execute(CommandSender sender, String[] args) { return true; } String hoverMessage = String.format("Material: %s\nGroup: %s", reinType.getMaterial().toString(), groupName); - Utility.sendAndLog( - p, - ChatColor.GREEN, - "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand.", - hoverMessage); - Utility.sendAndLog( - p, - ChatColor.GREEN, - " Type /fortify or /cto to turn this off when you are done.", - hoverMessage); + Utility.sendAndLog( + p, + ChatColor.GREEN, + "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand.\n" + + " Type /fortify or /cto to turn this off when you are done.", + hoverMessage); state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); state.setFortificationItemStack(reinType.getItemStack()); state.setGroup(g); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 6194c955..e5bdc32c 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -76,16 +76,12 @@ public boolean execute(CommandSender sender, String[] args) { } String hoverMessage = String.format("Group: %s", groupName); - Utility.sendAndLog( - p, - ChatColor.GREEN, - "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them.", - hoverMessage); - Utility.sendAndLog( - p, - ChatColor.GREEN, - " Type /reinforce or /cto to turn this off when you are done.", - hoverMessage); + Utility.sendAndLog( + p, + ChatColor.GREEN, + "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them." + + " Type /reinforce or /cto to turn this off when you are done.", + hoverMessage); state.setMode(ReinforcementMode.REINFORCEMENT); state.setGroup(g); return true; From b7c9f45a48d4a1d471edff0ae1622565ec279ea6 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sun, 15 Apr 2018 12:55:23 +0000 Subject: [PATCH 086/255] Refactor boolean logic for /ctf and /ctr --- .../mc/citadel/command/commands/Fortification.java | 12 +++++++----- .../mc/citadel/command/commands/Reinforce.java | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index bdd91d10..61604e53 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -70,11 +70,13 @@ public boolean execute(CommandSender sender, String[] args) { } PlayerState state = PlayerState.get(p); - if (ReinforcementMode.REINFORCEMENT_FORTIFICATION.equals(state.getMode()) - && (args.length == 0 - || (state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())))) { + boolean inFortificationMode = ReinforcementMode.REINFORCEMENT_FORTIFICATION.equals(state.getMode()); + boolean noGroupSpecified = args.length == 0; + boolean noGroupChange = ( + state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())); + if (inFortificationMode && (noGroupSpecified || noGroupChange)) { Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index 6194c955..6705c27c 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -65,11 +65,13 @@ public boolean execute(CommandSender sender, String[] args) { } PlayerState state = PlayerState.get(p); - if (ReinforcementMode.REINFORCEMENT.equals(state.getMode()) - && (args.length == 0 - || (state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())))) { + boolean inReinforcementMode = ReinforcementMode.REINFORCEMENT.equals(state.getMode()); + boolean noGroupSpecified = args.length == 0; + boolean noGroupChange = ( + state.getGroup() != null + && state.getGroup().getName() != null + && state.getGroup().getName().equals(g.getName())); + if (inReinforcementMode && (noGroupSpecified || noGroupChange)) { Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; From e57044a39788c0da4f2c7a419adf00aa1afb80f3 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Sun, 15 Apr 2018 13:24:08 +0000 Subject: [PATCH 087/255] Don't turn /ctf off when attempting to switch reinforcement materials --- .../mc/citadel/command/commands/Fortification.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java index 61604e53..5843df83 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Fortification.java @@ -76,18 +76,19 @@ public boolean execute(CommandSender sender, String[] args) { state.getGroup() != null && state.getGroup().getName() != null && state.getGroup().getName().equals(g.getName())); - if (inFortificationMode && (noGroupSpecified || noGroupChange)) { + ItemStack stack = p.getInventory().getItemInMainHand(); + ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); + boolean noMaterialChange = reinType != null && reinType.equals(state.getReinforcementType()); + if (inFortificationMode && (noGroupSpecified || (noGroupChange && noMaterialChange))) { Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); state.reset(); return true; } - ItemStack stack = p.getInventory().getItemInMainHand(); if (stack.getType() == Material.AIR) { Utility.sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); return true; } - ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); if (reinType == null) { Utility.sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); return true; From f8f449189e6b6e564e237b0a9ef52b95d8b48708 Mon Sep 17 00:00:00 2001 From: iykHvfIvfR Date: Mon, 16 Apr 2018 17:39:22 +0000 Subject: [PATCH 088/255] Add a missing '\n' --- src/vg/civcraft/mc/citadel/command/commands/Reinforce.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java index e5bdc32c..740e5d70 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java @@ -79,7 +79,7 @@ public boolean execute(CommandSender sender, String[] args) { Utility.sendAndLog( p, ChatColor.GREEN, - "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them." + "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them.\n" + " Type /reinforce or /cto to turn this off when you are done.", hoverMessage); state.setMode(ReinforcementMode.REINFORCEMENT); From 77a9f7bcbb0b1713519aacf12ee90dc1abec5d52 Mon Sep 17 00:00:00 2001 From: Daniel Boston Date: Mon, 16 Apr 2018 23:19:19 -0400 Subject: [PATCH 089/255] Update pom.xml Version increment for latest changepack. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c1951a09..6c617d18 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.0 + 3.11.1 Citadel https://github.com/Devoted/Citadel From f29673602774518a8205f46829bcb909d2bc4c71 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 8 Jun 2018 17:06:17 +0200 Subject: [PATCH 090/255] Fix offhand interactions bypassing reinforced inventories --- .../mc/citadel/listener/BlockListener.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index cb3805a0..dacfd18d 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -469,7 +469,7 @@ public void redstonePower(BlockRedstoneEvent bre) { @EventHandler(priority = EventPriority.HIGHEST) public void interact(PlayerInteractEvent pie) { try { - if (!pie.hasBlock() || pie.getHand() != EquipmentSlot.HAND) + if (!pie.hasBlock() || (pie.getHand() != EquipmentSlot.HAND && pie.getHand() != EquipmentSlot.OFF_HAND)) return; Player player = pie.getPlayer(); @@ -495,10 +495,13 @@ public void interact(PlayerInteractEvent pie) { * Citadel.verbose( VerboseMsg.ReinLocked, * player.getDisplayName(), block.getLocation().toString()); */ - pie.getPlayer().sendMessage( - ChatColor.RED - + String.format("%s is locked", block.getType() - .name())); + //Prevents double broadcasts + if(pie.getHand() == EquipmentSlot.HAND) { + pie.getPlayer().sendMessage( + ChatColor.RED + + String.format("%s is locked", block.getType() + .name())); + } pie.setCancelled(true); } // Not really sure what this is for. Should come up in testing. @@ -511,7 +514,7 @@ public void interact(PlayerInteractEvent pie) { * VerboseMsg.CropTrample, block.getLocation().toString()); * pie.setCancelled(true); } } */ - if (pie.isCancelled()) + if (pie.isCancelled() || pie.getHand() != EquipmentSlot.HAND) return; PlayerState state = PlayerState.get(player); From 3b0e1beac3e277807dfb01ad974b06bd1fe7acec Mon Sep 17 00:00:00 2001 From: Daniel Boston Date: Tue, 12 Jun 2018 22:44:18 -0400 Subject: [PATCH 091/255] Update pom.xml for version Quick version update to go with latest PR --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6c617d18..0209c9d2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.1 + 3.11.2 Citadel https://github.com/Devoted/Citadel From ab872e85e3c2b9d7db341871f6b66f93e7f71f46 Mon Sep 17 00:00:00 2001 From: Feathercrown Date: Wed, 13 Jun 2018 10:46:02 -0400 Subject: [PATCH 092/255] Clear easy mode on /cto Why are we clearing bypass mode but not easy mode? --- src/vg/civcraft/mc/citadel/command/commands/Off.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Off.java b/src/vg/civcraft/mc/citadel/command/commands/Off.java index ea626bd6..8b32a27e 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Off.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Off.java @@ -33,6 +33,9 @@ public boolean execute(CommandSender sender, String[] args) { if (state.isBypassMode()) { state.toggleBypassMode(); } + if (state.getEasyMode()) { + state.toggleEasyMode(); + } Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode has been set to Normal."); return true; } From bc4cf47794c7be6c55eb38d0a8cc200b457a6b4c Mon Sep 17 00:00:00 2001 From: Feathercrown Date: Wed, 13 Jun 2018 10:55:36 -0400 Subject: [PATCH 093/255] Don't send "NORMAL mode off" chat message --- src/vg/civcraft/mc/citadel/PlayerState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/PlayerState.java b/src/vg/civcraft/mc/citadel/PlayerState.java index f127426d..9185ae41 100644 --- a/src/vg/civcraft/mc/citadel/PlayerState.java +++ b/src/vg/civcraft/mc/citadel/PlayerState.java @@ -172,7 +172,7 @@ public void checkResetMode() { public void run() { try { Player player = Bukkit.getPlayer(accountId); - if (player != null) { + if (player != null && mode.name() != "NORMAL") { player.sendMessage(ChatColor.YELLOW + mode.name() + " mode off"); } reset(); @@ -189,4 +189,4 @@ public void run() { public ReinforcementType getReinforcementType(){ return ReinforcementType.getReinforcementType(fortificationStack); } -} \ No newline at end of file +} From d48b352a8dc3bcd63ae1f29f7f470dbbef0822d8 Mon Sep 17 00:00:00 2001 From: Lazersmoke Date: Sat, 17 Feb 2018 14:36:20 -0600 Subject: [PATCH 094/255] Fix spammy debug message --- src/vg/civcraft/mc/citadel/ReinforcementManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index c3ad7113..430b3564 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -283,7 +283,9 @@ public void run() { } } - saveManyReinforcements(reins); + if(reins.size() != 0){ + saveManyReinforcements(reins); + } if (CitadelConfigManager.shouldLogInternal()) { s = System.currentTimeMillis() - s; From ed4931cc058dac775cd17cfff3565084243cfe32 Mon Sep 17 00:00:00 2001 From: Feathercrown Date: Wed, 13 Jun 2018 10:46:02 -0400 Subject: [PATCH 095/255] Clear easy mode on /cto Why are we clearing bypass mode but not easy mode? --- src/vg/civcraft/mc/citadel/command/commands/Off.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Off.java b/src/vg/civcraft/mc/citadel/command/commands/Off.java index ea626bd6..8b32a27e 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Off.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Off.java @@ -33,6 +33,9 @@ public boolean execute(CommandSender sender, String[] args) { if (state.isBypassMode()) { state.toggleBypassMode(); } + if (state.getEasyMode()) { + state.toggleEasyMode(); + } Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode has been set to Normal."); return true; } From 3247613062732a6a90e2d5ea7c8ec9f8ad1f668d Mon Sep 17 00:00:00 2001 From: Feathercrown Date: Wed, 13 Jun 2018 10:55:36 -0400 Subject: [PATCH 096/255] Don't send "NORMAL mode off" chat message --- src/vg/civcraft/mc/citadel/PlayerState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/PlayerState.java b/src/vg/civcraft/mc/citadel/PlayerState.java index f127426d..9185ae41 100644 --- a/src/vg/civcraft/mc/citadel/PlayerState.java +++ b/src/vg/civcraft/mc/citadel/PlayerState.java @@ -172,7 +172,7 @@ public void checkResetMode() { public void run() { try { Player player = Bukkit.getPlayer(accountId); - if (player != null) { + if (player != null && mode.name() != "NORMAL") { player.sendMessage(ChatColor.YELLOW + mode.name() + " mode off"); } reset(); @@ -189,4 +189,4 @@ public void run() { public ReinforcementType getReinforcementType(){ return ReinforcementType.getReinforcementType(fortificationStack); } -} \ No newline at end of file +} From 47ccbab28ff31060d593d5e3d620687748a97fb2 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Fri, 3 Aug 2018 21:52:13 -0400 Subject: [PATCH 097/255] Version update after adding some downstream improvements from Feathercrown and Lazersmoke. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0209c9d2..7c2e9714 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.2 + 3.11.3 Citadel https://github.com/Devoted/Citadel From 8983df4968c2244a7b8023865baec7b668263ffe Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Fri, 3 Aug 2018 21:54:38 -0400 Subject: [PATCH 098/255] Soft update to 1.12.2 . Should be no changes. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 7c2e9714..1f8ea6cf 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.3 + 3.11.4 Citadel https://github.com/Devoted/Citadel @@ -41,7 +41,7 @@ org.spigotmc spigot-api - 1.12-R0.1-SNAPSHOT + 1.12.2-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore From d56fb57a1411c6dbb1749ca8ea37b5ddb1c0d9f2 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 19 Dec 2018 04:39:32 +0100 Subject: [PATCH 099/255] Prevent piston/door bug --- pom.xml | 6 +++--- src/vg/civcraft/mc/citadel/listener/BlockListener.java | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 1f8ea6cf..eef4f47b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,9 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.4 + 3.11.5 Citadel - https://github.com/Devoted/Citadel + https://github.com/Devotedmc/Citadel @@ -46,7 +46,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.6.0 + 1.6.1 provided diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index dacfd18d..5caa040b 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -334,7 +334,8 @@ public void blockBreakEvent(BlockBreakEvent event) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void pistonExtend(BlockPistonExtendEvent bpee) { for (Block block : bpee.getBlocks()) { - Reinforcement reinforcement = rm.getReinforcement(block + Block realBlock = Utility.getRealBlock(block); + Reinforcement reinforcement = rm.getReinforcement(realBlock .getLocation()); if (reinforcement != null) { bpee.setCancelled(true); @@ -346,7 +347,8 @@ public void pistonExtend(BlockPistonExtendEvent bpee) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void pistonRetract(BlockPistonRetractEvent bpre) { for (Block block : bpre.getBlocks()) { - Reinforcement reinforcement = rm.getReinforcement(block + Block realBlock = Utility.getRealBlock(block); + Reinforcement reinforcement = rm.getReinforcement(realBlock .getLocation()); if (reinforcement != null) { bpre.setCancelled(true); From 905ec91d7fa323ee34c5274b7979c34c5c9bcf04 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 20 Jan 2019 08:54:22 +0000 Subject: [PATCH 100/255] Update /ctacid 1) Removing the reinforcements first should prevent any weirdness (such as a yet-to-be-removed reinforcement blocking the breaking of 'topFace' - counting it as just reinforcement damage) 2) Changing the 'topFace' break from a set to air to a natural break ensures consistent and expected behaviour of a block break --- src/vg/civcraft/mc/citadel/command/commands/Acid.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/command/commands/Acid.java b/src/vg/civcraft/mc/citadel/command/commands/Acid.java index c09db58c..79b681c0 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Acid.java @@ -115,13 +115,12 @@ public boolean execute(CommandSender sender, String[] args) { new Object[] {block.getLocation(), topFace.getType(), topFace.getLocation()}); } - topFace.setType(Material.AIR); - - block.breakNaturally(); - // Consider if should simply be an AcidBlockEvent listener. This will do for now. Utility.reinforcementBroken(p, pRein); rm.deleteReinforcement(pTopRein); + + topFace.breakNaturally(); + block.breakNaturally(); } return true; From 3b32635a184b7cea56d4f96e83d47e4ab05ae0c0 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jan 2019 16:30:31 +0000 Subject: [PATCH 101/255] Updated gitignore --- .gitignore | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 196 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 3ba61ae4..85326f70 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,197 @@ -/target -.project -.settings/** -.classpath -.idea/* + +# Created by https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,intellij+all +# Edit at https://www.gitignore.io/?templates=java,batch,linux,macos,maven,windows,intellij+all + +### Batch ### +# BatchFiles +*.bat +*.cmd +*.btm + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + *.iml +modules.xml +.idea/misc.xml +*.ipr + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,intellij+all From 200d91d0d658d483d4bd43777c2323d95859bc5e Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jan 2019 16:31:06 +0000 Subject: [PATCH 102/255] Updated CivModCore version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0209c9d2..9ac44fcb 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.6.0 + 1.6.2 provided From 213a3a91c256850140bed96464bcc085539f5618 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jan 2019 16:31:52 +0000 Subject: [PATCH 103/255] Updated NameLayer version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9ac44fcb..29d35ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ vg.civcraft.mc.namelayer NameLayer - 2.11.0 + 2.11.1 provided From 69b5b10bb5f91ba0a20a7c8433d745f502b8f2ee Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jan 2019 16:32:26 +0000 Subject: [PATCH 104/255] Replaced devoted repository with that of civclassics --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 29d35ec9..04a35b75 100644 --- a/pom.xml +++ b/pom.xml @@ -59,8 +59,8 @@ - devoted-repo - https://build.devotedmc.com/plugin/repository/everything/ + civ-jenkins + http://test.civclassic.com:8080/plugin/repository/everything/ spigot-repo From 73698d1985f10e99245e070220ba62dce1730a9c Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jan 2019 17:40:44 +0000 Subject: [PATCH 105/255] Added the config option to gate breaking acided blocks naturally. * The default option is false, it will break as it does currently, you must manually change/add the option to the config set as true. --- config.yml | 1 + src/vg/civcraft/mc/citadel/CitadelConfigManager.java | 5 +++++ .../civcraft/mc/citadel/command/commands/Acid.java | 12 ++++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/config.yml b/config.yml index e575c972..5077882f 100644 --- a/config.yml +++ b/config.yml @@ -148,3 +148,4 @@ mysql: show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login default_bypass_mode: true +break_acided_block_naturally: false diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index d91f84d9..7b3c35db 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -252,4 +252,9 @@ public static Set parseMaterialList(List stringList) { } return reinforceableMats; } + + public static boolean breakAcidedBlockNaturally() { + return config.getBoolean("break_acided_block_naturally", false); + } + } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Acid.java b/src/vg/civcraft/mc/citadel/command/commands/Acid.java index 79b681c0..83c40a1f 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/commands/Acid.java @@ -118,10 +118,18 @@ public boolean execute(CommandSender sender, String[] args) { // Consider if should simply be an AcidBlockEvent listener. This will do for now. Utility.reinforcementBroken(p, pRein); rm.deleteReinforcement(pTopRein); - - topFace.breakNaturally(); + + // Break the acid block block.breakNaturally(); + // Break the acided block + if (CitadelConfigManager.breakAcidedBlockNaturally()) { + topFace.breakNaturally(); + } + else { + topFace.setType(Material.AIR); + } + } return true; } From 7f046bd1ce1533d8acb339805b2b35767cafe601 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 30 Jan 2019 12:25:41 +0000 Subject: [PATCH 106/255] Eclipse re-added --- .gitignore | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 85326f70..3f1f7b63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -# Created by https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,intellij+all -# Edit at https://www.gitignore.io/?templates=java,batch,linux,macos,maven,windows,intellij+all +# Created by https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,eclipse,intellij+all +# Edit at https://www.gitignore.io/?templates=java,batch,linux,macos,maven,windows,eclipse,intellij+all ### Batch ### # BatchFiles @@ -8,6 +8,76 @@ *.cmd *.btm +### Eclipse ### + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +### Eclipse Patch ### +# Eclipse Core +.project + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Annotation Processing +.apt_generated + +.sts4-cache/ + ### Intellij+all ### # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 @@ -194,4 +264,4 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk -# End of https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,intellij+all +# End of https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,eclipse,intellij+all From 5629513be37f50ee8c036ec884cbdf59074b19dd Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 13 Mar 2019 01:07:38 +0100 Subject: [PATCH 107/255] For Aidan --- .classpath | 20 + .project | 23 + .settings/org.eclipse.jdt.core.prefs | 6 + .settings/org.eclipse.m2e.core.prefs | 4 + plugin.yml | 6 + pom.xml | 10 +- src/vg/civcraft/mc/citadel/AcidManager.java | 59 + src/vg/civcraft/mc/citadel/ChunkCache.java | 118 ++ src/vg/civcraft/mc/citadel/ChunkPair.java | 52 + src/vg/civcraft/mc/citadel/Citadel.java | 179 ++- .../mc/citadel/CitadelConfigManager.java | 332 ++--- .../mc/citadel/CitadelWorldManager.java | 135 ++ src/vg/civcraft/mc/citadel/PlayerState.java | 192 --- .../mc/citadel/ReinforcementLogic.java | 133 ++ .../mc/citadel/ReinforcementManager.java | 356 +----- .../mc/citadel/ReinforcementTypeManager.java | 36 + src/vg/civcraft/mc/citadel/Utility.java | 96 +- .../citadel/command/{commands => }/Acid.java | 67 +- .../command/{commands => }/AreaReinforce.java | 6 +- .../command/{commands => }/Bypass.java | 2 +- .../mc/citadel/command/CommandHandler.java | 98 -- .../command/{commands => }/Fortification.java | 6 +- .../command/{commands => }/Information.java | 8 +- .../command/{commands => }/Insecure.java | 8 +- .../command/{commands => }/Materials.java | 2 +- .../citadel/command/{commands => }/Off.java | 8 +- .../command/{commands => }/Reinforce.java | 8 +- .../{commands => }/ReinforcementsGUI.java | 7 +- .../command/{commands => }/SetLogging.java | 28 +- .../citadel/command/{commands => }/Stats.java | 7 +- .../{commands => }/ToggleEasyMode.java | 2 +- .../{commands => }/UpdateReinforcements.java | 6 +- .../database/CitadelReinforcementData.java | 1082 +++++------------ .../mc/citadel/listener/BlockListener.java | 520 +++----- .../mc/citadel/listener/EntityListener.java | 6 +- .../mc/citadel/listener/GroupsListener.java | 18 - .../mc/citadel/misc/CitadelStatics.java | 73 -- .../misc/LoadingCacheNullException.java | 14 - ...forcemnetFortificationCancelException.java | 10 - .../playerstate/FortificationState.java | 65 + .../mc/citadel/playerstate/IPlayerState.java | 27 + .../citadel/playerstate/InformationState.java | 96 ++ .../MultiBlockReinforcement.java | 86 -- .../reinforcement/NaturalReinforcement.java | 12 - .../reinforcement/NullReinforcement.java | 13 - .../reinforcement/PlayerReinforcement.java | 276 ----- .../citadel/reinforcement/Reinforcement.java | 177 ++- .../NaturalReinforcementType.java | 59 - .../NonReinforceableType.java | 29 - .../reinforcementtypes/ReinforcementType.java | 200 ++- 50 files changed, 1717 insertions(+), 3066 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 src/vg/civcraft/mc/citadel/AcidManager.java create mode 100644 src/vg/civcraft/mc/citadel/ChunkCache.java create mode 100644 src/vg/civcraft/mc/citadel/ChunkPair.java create mode 100644 src/vg/civcraft/mc/citadel/CitadelWorldManager.java delete mode 100644 src/vg/civcraft/mc/citadel/PlayerState.java create mode 100644 src/vg/civcraft/mc/citadel/ReinforcementLogic.java create mode 100644 src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java rename src/vg/civcraft/mc/citadel/command/{commands => }/Acid.java (68%) rename src/vg/civcraft/mc/citadel/command/{commands => }/AreaReinforce.java (97%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Bypass.java (96%) delete mode 100644 src/vg/civcraft/mc/citadel/command/CommandHandler.java rename src/vg/civcraft/mc/citadel/command/{commands => }/Fortification.java (98%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Information.java (96%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Insecure.java (96%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Materials.java (97%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Off.java (95%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Reinforce.java (98%) rename src/vg/civcraft/mc/citadel/command/{commands => }/ReinforcementsGUI.java (98%) rename src/vg/civcraft/mc/citadel/command/{commands => }/SetLogging.java (75%) rename src/vg/civcraft/mc/citadel/command/{commands => }/Stats.java (98%) rename src/vg/civcraft/mc/citadel/command/{commands => }/ToggleEasyMode.java (97%) rename src/vg/civcraft/mc/citadel/command/{commands => }/UpdateReinforcements.java (98%) delete mode 100644 src/vg/civcraft/mc/citadel/listener/GroupsListener.java delete mode 100644 src/vg/civcraft/mc/citadel/misc/CitadelStatics.java delete mode 100644 src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java delete mode 100644 src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/FortificationState.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/InformationState.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcement/NaturalReinforcement.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcement/NullReinforcement.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/NaturalReinforcementType.java delete mode 100644 src/vg/civcraft/mc/citadel/reinforcementtypes/NonReinforceableType.java diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..149cb3c9 --- /dev/null +++ b/.classpath @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..c2b2a986 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + Citadel + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..b8947ec6 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/plugin.yml b/plugin.yml index 2ea9aa43..e327cb09 100644 --- a/plugin.yml +++ b/plugin.yml @@ -9,6 +9,11 @@ commands: ctr: aliases: [ctreinforce, reinforce, protect, cprivate, lwc, private] ctacid: + usage: /ctacid + description: 'Removes the block above it if used on an acid block' + min-args: 0 + max-args: 0 + player-only: true ctf: aliases: [ctfortify, fortify] ctb: @@ -41,3 +46,4 @@ permissions: default: op citadel.admin.accesssecurable: default: op +api-version: 1.13 diff --git a/pom.xml b/pom.xml index a4fdaeba..a94a1f30 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.5 + 4.0.0 Citadel https://github.com/Devotedmc/Citadel @@ -46,21 +46,21 @@ vg.civcraft.mc.civmodcore CivModCore - 1.6.2 + 1.7.3 provided vg.civcraft.mc.namelayer NameLayer - 2.11.1 + 2.12.0 provided - civ-jenkins - http://test.civclassic.com:8080/plugin/repository/everything/ + devoted-repo + https://build.devotedmc.com/plugin/repository/everything/ spigot-repo diff --git a/src/vg/civcraft/mc/citadel/AcidManager.java b/src/vg/civcraft/mc/citadel/AcidManager.java new file mode 100644 index 00000000..5ac6f977 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/AcidManager.java @@ -0,0 +1,59 @@ +package vg.civcraft.mc.citadel; + +import java.util.Collection; +import java.util.Set; +import java.util.TreeSet; + +import org.bukkit.Material; +import org.bukkit.block.Block; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public class AcidManager { + + private Set material; + + public AcidManager(Collection acidMats) { + this.material = new TreeSet<>(acidMats); + } + + /** + * Checks if the given valid is of a material registered as valid acid material + * + * @param b Block to check for + * @return True if the block material is suited for being an acid block + */ + public boolean isPossibleAcidBlock(Block b) { + if (b == null) { + return false; + } + Material mat = b.getType(); + if (mat == null) { + return false; + } + return material.contains(mat); + } + + /** + * Checks if acid blocking is enabled for this reinforcement + * + * @param rein Reinforcement to check for + * @return True if the reinforcement can acid block other reinforcements and has + * an acid timer configured + */ + public boolean canBeAcidBlock(Reinforcement rein) { + return rein.getType().getAcidTime() >= 0; + } + + /** + * Gets remaining time needed to mature acid block in milli seconds. If the acid + * is ready 0 will be returned + * + * @param rein Reinforcement to check for + * @return Remaining time in milli seconds or 0 if the acid is ready + */ + public long getRemainingAcidMaturationTime(Reinforcement rein) { + long totalTime = rein.getType().getAcidTime(); + return Math.max(0, totalTime - rein.getAge()); + } +} diff --git a/src/vg/civcraft/mc/citadel/ChunkCache.java b/src/vg/civcraft/mc/citadel/ChunkCache.java new file mode 100644 index 00000000..7dc0e98d --- /dev/null +++ b/src/vg/civcraft/mc/citadel/ChunkCache.java @@ -0,0 +1,118 @@ +package vg.civcraft.mc.citadel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.bukkit.Location; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public class ChunkCache { + + private final ChunkPair chunkPair; + private Map reinforcements; + private List deletedReinforcements; + private boolean isDirty; + private final int worldID; + + public ChunkCache(ChunkPair chunkPair, Collection reins, int worldID) { + this.reinforcements = new TreeMap<>(); + for (Reinforcement rein : reins) { + reinforcements.put(new Coords(rein.getLocation()), rein); + } + this.chunkPair = chunkPair; + this.worldID = worldID; + this.isDirty = false; + } + + public int getWorldID() { + return worldID; + } + + public void insertReinforcement(Reinforcement rein) { + Coords key = new Coords(rein.getLocation()); + if (reinforcements.containsKey(key)) { + throw new IllegalStateException( + "Trying to insert reinforcement at " + rein.getLocation().toString() + ", but one already existed"); + } + reinforcements.put(key, rein); + } + + public void removeReinforcement(Reinforcement rein) { + Coords key = new Coords(rein.getLocation()); + Reinforcement removed = reinforcements.remove(key); + if (removed != rein) { + throw new IllegalStateException("Removed wrong reinforcement at " + rein.getLocation().toString()); + } + if (deletedReinforcements == null) { + deletedReinforcements = new LinkedList<>(); + } + deletedReinforcements.add(rein); + } + + public ChunkPair getChunkPair() { + return chunkPair; + } + + public Reinforcement getReinforcement(int x, int y, int z) { + return reinforcements.get(new Coords(x, y, z)); + } + + public Collection getAll() { + List reins = new ArrayList<>(); + reins.addAll(deletedReinforcements); + reins.addAll(reinforcements.values()); + return reins; + } + + public boolean isDirty() { + return isDirty; + } + + public void setDirty(boolean dirty) { + this.isDirty = dirty; + } + + private class Coords implements Comparable { + + private int x; + private int y; + private int z; + + Coords(Location loc) { + this.x = loc.getBlockX(); + this.y = loc.getBlockY(); + this.z = loc.getBlockZ(); + } + + Coords(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int compareTo(Coords coords) { + // y first because we have the most variety here + if (coords.y != y) { + return Integer.compare(y, coords.y); + } + if (coords.x != x) { + return Integer.compare(x, coords.x); + } + if (coords.z != z) { + return Integer.compare(z, coords.z); + } + return 0; + } + + public boolean equals(Object o) { + Coords coords = (Coords) o; + return coords.y == y && coords.x == x && coords.z == z; + } + } +} diff --git a/src/vg/civcraft/mc/citadel/ChunkPair.java b/src/vg/civcraft/mc/citadel/ChunkPair.java new file mode 100644 index 00000000..e509c2e8 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/ChunkPair.java @@ -0,0 +1,52 @@ +package vg.civcraft.mc.citadel; + +import org.bukkit.Location; + +public class ChunkPair { + + private int x; + private int z; + + public ChunkPair(int x, int z) { + this.x = x; + this.z = z; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } + + public long getCombinedKey() { + long key = x; + long zPart = z; + key &= zPart << 32; + return key; + } + + public static ChunkPair fromKey(long key) { + int x = (int) key; + int z = (int) ((key >> 32) & 0x00000000); + return new ChunkPair(x, z); + } + + public static ChunkPair forLocation(Location loc) { + return new ChunkPair(loc.getChunk().getX(), loc.getChunk().getZ()); + } + + public int hashCode() { + //might collide + return x & (z << 16); + } + + public boolean equals(Object o) { + if (o instanceof ChunkPair) { + ChunkPair pair = (ChunkPair) o; + return pair.x == x && pair.z == z; + } + return false; + } +} diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 1081a699..1ea12fb5 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -1,179 +1,144 @@ package vg.civcraft.mc.citadel; import java.util.LinkedList; -import java.util.List; -import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import vg.civcraft.mc.citadel.command.CommandHandler; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; -import vg.civcraft.mc.citadel.listener.GroupsListener; import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.WorldListener; -import vg.civcraft.mc.citadel.misc.CitadelStatics; -import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; -import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.ACivMod; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Citadel extends ACivMod{ +public class Citadel extends ACivMod { + private static Logger logger; - private static CitadelReinforcementData db; - private static ReinforcementManager rm; - private CommandHandler cHandle; + public static final String chestPerm = "CHESTS"; + + private CitadelReinforcementData db; + private CitadelWorldManager worldManager; + private CitadelConfigManager config; + private AcidManager acidManager; + private ReinforcementTypeManager typeManager; private static Citadel instance; - - // Calling this for ACivMod - @Override - public void onLoad(){ - //super.onLoad(); - } - - public void onEnable(){ - //super.onEnable(); + + public void onEnable() { + super.onEnable(); instance = this; logger = getLogger(); - if (!Bukkit.getPluginManager().isPluginEnabled("NameLayer")){ + if (!Bukkit.getPluginManager().isPluginEnabled("NameLayer")) { logger.info("Citadel is shutting down because it could not find NameLayer"); - this.getPluginLoader().disablePlugin(this); // shut down + this.getPluginLoader().disablePlugin(this); + return; } - saveDefaultConfig(); - new CitadelConfigManager(getConfig()); - - // Grab the values from config - ReinforcementType.initializeReinforcementTypes(); - NaturalReinforcementType.initializeNaturalReinforcementsTypes(); - NonReinforceableType.initializeNonReinforceableTypes(); - initializeDatabase(); - - rm = new ReinforcementManager(db); - - registerListeners(); - registerCommands(); + config = new CitadelConfigManager(this); + if (!config.parse()) { + logger.severe("Errors in config file, shutting down"); + this.getPluginLoader().disablePlugin(this); + return; + } + typeManager = new ReinforcementTypeManager(); + config.getReinforcementTypes().forEach(t -> typeManager.register(t)); + if (!initializeDatabase()) { + logger.severe("Errors setting up database, shutting down"); + this.getPluginLoader().disablePlugin(this); + return; + } + worldManager = new CitadelWorldManager(db); + if (!worldManager.setup()) { + logger.severe("Errors setting up world config, shutting down"); + this.getPluginLoader().disablePlugin(this); + return; + } + acidManager = new AcidManager(config.getAcidMaterials()); registerNameLayerPermissions(); + registerListeners(); } - - public void onDisable(){ + + public void onDisable() { // Pushes all reinforcements loaded to be saved to db. - rm.invalidateAllReinforcements(); - CitadelStatics.displayStatisticsToConsole(); + worldManager.flushAll(); } + /** * Initializes the database. */ - public void initializeDatabase(){ - String host = CitadelConfigManager.getHostName(); - String user = CitadelConfigManager.getUserName(); - String password = CitadelConfigManager.getPassword(); - int port = CitadelConfigManager.getPort(); - String dbName = CitadelConfigManager.getDBName(); - int poolsize = CitadelConfigManager.getPoolSize(); - long connectionTimeout = CitadelConfigManager.getConnectionTimeout(); - long idleTimeout = CitadelConfigManager.getIdleTimeout(); - long maxLifetime = CitadelConfigManager.getMaxLifetime(); - try { - ManagedDatasource idb = new ManagedDatasource(this, user, password, host, port, - dbName, poolsize, connectionTimeout, idleTimeout, maxLifetime); - idb.getConnection().close(); - - db = new CitadelReinforcementData(idb); - - try { - getLogger().log(Level.INFO, "Update prepared, starting database update."); - db.registerMigrations(); - - if (!idb.updateDatabase()) { - getLogger().log(Level.SEVERE, "Update failed, terminating Bukkit."); - Bukkit.shutdown(); - } - } catch (Exception e) { - getLogger().log(Level.SEVERE, "Update failed, terminating Bukkit. Cause:", e); - Bukkit.shutdown(); - } - - } catch (Exception se) { - getLogger().log(Level.WARNING, "Could not connect to database, shutting down!"); - Bukkit.shutdown(); - return; + public boolean initializeDatabase() { + ManagedDatasource mds = config.getDatabase(); + if (mds == null) { + return false; } - + db = new CitadelReinforcementData(mds, this, typeManager); + return db.startUp(); } + /** * Registers the listeners for Citadel. */ - private void registerListeners(){ + private void registerListeners() { getServer().getPluginManager().registerEvents(new BlockListener(), this); - getServer().getPluginManager().registerEvents(new GroupsListener(), this); getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new WorldListener(), this); } - + @SuppressWarnings("unchecked") - public void registerNameLayerPermissions() { - LinkedList membersAndAbove = new LinkedList(); + private void registerNameLayerPermissions() { + LinkedList membersAndAbove = new LinkedList(); membersAndAbove.add(PlayerType.MEMBERS); membersAndAbove.add(PlayerType.MODS); membersAndAbove.add(PlayerType.ADMINS); membersAndAbove.add(PlayerType.OWNER); - LinkedList modsAndAbove = new LinkedList(); + LinkedList modsAndAbove = new LinkedList(); modsAndAbove.add(PlayerType.MODS); modsAndAbove.add(PlayerType.ADMINS); modsAndAbove.add(PlayerType.OWNER); - PermissionType.registerPermission("REINFORCE",(LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("ACIDBLOCK",(LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("REINFORCEMENT_INFO",(LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission("REINFORCE", (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission("ACIDBLOCK", (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission("REINFORCEMENT_INFO", (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission("BYPASS_REINFORCEMENT", (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("DOORS",(LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("CHESTS",(LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("CROPS",(LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("INSECURE_REINFORCEMENT",(LinkedList) membersAndAbove.clone()); - } - - - /** - * Registers the commands for Citadel. - */ - public void registerCommands(){ - cHandle = new CommandHandler(); - cHandle.registerCommands(); + PermissionType.registerPermission("DOORS", (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission("CROPS", (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission("INSECURE_REINFORCEMENT", (LinkedList) membersAndAbove.clone()); } /** * @return The ReinforcementManager of Citadel. */ - public static ReinforcementManager getReinforcementManager(){ - return rm; + public CitadelWorldManager getReinforcementManager() { + return worldManager; } + /** * @return The instance of Citadel. */ - public static Citadel getInstance(){ + public static Citadel getInstance() { return instance; } + /** * @return The Database Manager for Citadel. */ - public static CitadelReinforcementData getCitadelDatabase(){ + public CitadelReinforcementData getCitadelDatabase() { return db; } - public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { - return cHandle.execute(sender, cmd, args); + public ReinforcementTypeManager getReinforcementTypeManager() { + return typeManager; } - public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args){ - return cHandle.complete(sender, cmd, args); + /** + * @return Acid block manager + */ + public AcidManager getAcidManager() { + return acidManager; } @Override diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 7b3c35db..cf8e43ea 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -1,260 +1,140 @@ package vg.civcraft.mc.citadel; -import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedList; import java.util.List; -import java.util.Set; -import java.util.logging.Level; +import java.util.concurrent.TimeUnit; import org.bukkit.Material; import org.bukkit.Particle; -import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementEffect; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.ACivMod; +import vg.civcraft.mc.civmodcore.CoreConfigManager; +import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; +import vg.civcraft.mc.civmodcore.util.ConfigParsing; -public class CitadelConfigManager { +public class CitadelConfigManager extends CoreConfigManager { - private static FileConfiguration config; - public CitadelConfigManager(FileConfiguration con){ - config = con; + private ManagedDatasource database; + private List reinforcementTypes; + private List acidMaterials; + + public CitadelConfigManager(ACivMod plugin) { + super(plugin); } - public static List getReinforcementTypes(){ - List reinforcementTypes = new ArrayList(); - for (String sect: config.getConfigurationSection("reinforcements").getKeys(false)) - reinforcementTypes.add(sect); - return reinforcementTypes; + public List getAcidMaterials() { + return acidMaterials; } - - public static List getReinforceableMaterials(String mat){ - if(config.getConfigurationSection("reinforcements." + mat).contains("reinforceables")) { - return config.getConfigurationSection("reinforcements." + mat).getStringList("reinforceables"); - } - return null; + + @Override + protected boolean parseInternal(ConfigurationSection config) { + database = (ManagedDatasource) config.get("database"); + parseReinforcementTypes(config.getConfigurationSection("reinforcements")); + parseAcidMaterials(config); + return true; } - public static List getNonReinforceableMaterials(String mat){ - if(config.getConfigurationSection("reinforcements." + mat).contains("non_reinforceables")) { - return config.getConfigurationSection("reinforcements." + mat).getStringList("non_reinforceables"); + private void parseAcidMaterials(ConfigurationSection config) { + acidMaterials = parseMaterialList(config, "acidblock_material"); + if (acidMaterials == null) { + logger.info("No valid acid materials found in config"); + acidMaterials = new LinkedList<>(); } - return null; - } - - public static List getNaturalReinforcementTypes(){ - List naturalReinforcementTypes = new ArrayList(); - if (config.getConfigurationSection("natural_reinforcements") == null) - return naturalReinforcementTypes; - for (String sect: config.getConfigurationSection - ("natural_reinforcements").getKeys(false)) - naturalReinforcementTypes.add(sect); - return naturalReinforcementTypes; - } - - public static List getNonReinforceableTypes(){ - List nonReinforcementTypes = new ArrayList(); - if (config.getStringList("non_reinforceables") == null){ - return nonReinforcementTypes; + for(Material mat : acidMaterials) { + logger.info("Adding " + mat.toString() + " as valid acid material"); } - for (String sect: config.getStringList("non_reinforceables")) - nonReinforcementTypes.add(sect); - return nonReinforcementTypes; - } - - public static int getRequireMents(String type){ - return config.getInt("reinforcements." + type + ".requirements"); - } - - public static int getReturns(String type){ - return config.getInt("reinforcements." + type + ".return"); - } - - public static Material getMaterial(String type){ - return Material.getMaterial(config.getString("reinforcements." + type + ".material")); - } - - public static int getPercentReturn(String type){ - return config.getInt("reinforcements." + type + ".percent_chance"); - } - - public static int getHitPoints(String type){ - return config.getInt("reinforcements." + type + ".hit_points"); - } - - public static int getMaturationTime(String type){ - return config.getInt("reinforcements." + type + ".mature_time"); } - public static int getAcidTime(String type) { - return config.getInt("reinforcements." + type + ".acid_time", getMaturationTime(type)); - } - - public static int getMaturationScale(String type){ - return config.getInt("reinforcements." + type + ".scale_amount"); - } - - public static List getLoreValues(String type){ - return config.getStringList("reinforcements." + type + ".lore"); - } - - public static int getGracePeriod(String type) { - return config.getInt("reinforcements." + type + ".grace_period", 0); // default disabled - } - - public static ReinforcementEffect getReinforcementEffect(String type){ - Particle effect = null; - if (config.getString("reinforcements." + type + ".effect.type") != null) { - try { - String effectName = config.getString("reinforcements." + type + ".effect.type"); - effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE: Particle.valueOf(effectName); - } catch (IllegalArgumentException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Invalid effect at: " + config.getCurrentPath()); - return null; + private void parseReinforcementTypes(ConfigurationSection config) { + reinforcementTypes = new LinkedList<>(); + if (config == null) { + logger.info("No reinforcement types found in config"); + return; + } + for (String key : config.getKeys(false)) { + if (!config.isConfigurationSection(key)) { + logger.warning("Ignoring invalid entry " + key + " at " + config.getCurrentPath()); + continue; + } + ReinforcementType type = parseReinforcementType(config.getConfigurationSection(key)); + if (type != null) { + reinforcementTypes.add(type); } - float offsetX = (float) config.getDouble("reinforcements." + type + ".effect.offsetX", 0); - float offsetY = (float) config.getDouble("reinforcements." + type + ".effect.offsetY", 0); - float offsetZ = (float) config.getDouble("reinforcements." + type + ".effect.offsetZ", 0); - float speed = (float) config.getDouble("reinforcements." + type + ".effect.speed", 1); - int amount = config.getInt("reinforcements." + type + ".effect.particleCount", 1); - return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); } - return null; } - public static Material getNaturalReinforcementMaterial(String type){ - return Material.valueOf(config.getString("natural_reinforcements." + - type + ".material")); - } - - public static int getNaturalReinforcementHitPoints(String type){ - return config.getInt("natural_reinforcements." + type + ".hit_points"); - } - - public static int getPlayerStateReset(){ - return config.getInt("reset_player_state"); - } - - public static boolean isMaturationEnabled(){ - return config.getBoolean("enable_maturation"); - } - - public static int getMaxCacheSize(){ - return config.getInt("max_cache_size"); - } - - public static long getMaxCacheMinutes(){ - return config.getLong("max_cache_load_time"); - } - - public static int getMaxRedstoneDistance(){ - return config.getInt("redstone_distance"); - } - - public static Material getAcidBlock(){ - return Material.valueOf(config.getString("acidblock_material")); - } - - public static boolean shouldDropReinforcedBlock(){ - return config.getBoolean("drop_reinforced_block"); - } - - public static int getTickRepeatingSave(){ - return config.getInt("save_interval_ticks", 500); - } - - public static int getDayMultiplier(){ - return config.getInt("reinforcement_damageMultiplier", 7); - } - - public static String getHostName(){ - return config.getString("mysql.hostname", "localhost"); - } - - public static int getPort(){ - return config.getInt("mysql.port", 3306); - } - - public static String getDBName(){ - return config.getString("mysql.dbname", "bukkit"); - } - - public static String getUserName(){ - return config.getString("mysql.username", "bukkit"); - } - - public static String getPassword(){ - return config.getString("mysql.password", ""); - } - - public static int getPoolSize() { - return config.getInt("mysql.poolsize", 20); - } - - public static long getConnectionTimeout() { - return config.getLong("mysql.connection_timeout", 10000l); - } - - public static long getIdleTimeout() { - return config.getLong("mysql.idle_timeout", 600000l); - } - - public static long getMaxLifetime() { - return config.getLong("mysql.max_lifetime", 7200000l); - } - - public static boolean shouldLogInternal() { - return config.getBoolean("internal_logging", false); - } - - public static boolean shouldLogPlayerCommands() { - return config.getBoolean("command_logging", false); - } - - public static boolean shouldLogFriendlyBreaks() { - return config.getBoolean("break_logging", false); - } - - public static boolean shouldLogHostileBreaks() { - return config.getBoolean("hostile_logging", false); - } - - public static boolean shouldLogDamage() { - return config.getBoolean("damage_logging", false); + private ReinforcementType parseReinforcementType(ConfigurationSection config) { + if (!config.isItemStack("item")) { + logger.warning( + "Reinforcement config at " + config.getCurrentPath() + " had no valid item entry, it was ignored"); + return null; + } + ItemStack item = config.getItemStack("item"); + ReinforcementEffect effect = getReinforcementEffect(config.getConfigurationSection("effect")); + long gracePeriod = ConfigParsing.parseTime(config.getString("grace_period", "0"), TimeUnit.MILLISECONDS); + long maturationTime = ConfigParsing.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); + long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), + TimeUnit.MILLISECONDS); + double maturationScale = config.getInt("scale_amount", 1); + double health = config.getDouble("hit_points", 100); + double returnChance = config.getDouble("return_chance", 1.0); + List reinforceables = parseMaterialList(config, "reinforceables"); + List nonReinforceables = parseMaterialList(config, "non_reinforceables"); + int id = config.getInt("id", -1); + if (id == -1) { + logger.warning("Reinforcement type at " + config.getCurrentPath() + " had no id, it was ignored"); + return null; + } + if (reinforceables != null && nonReinforceables != null) { + logger.warning("Both blacklist and whitelist specified for reinforcement type at " + config.getCurrentPath() + + ". This does not make sense and the type will be ignored"); + return null; + } + return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, effect, + reinforceables, nonReinforceables, id); } - public static boolean shouldLogReinforcement() { - return config.getBoolean("reinf_logging", false); + private List parseMaterialList(ConfigurationSection config, String key) { + return parseList(config, key, s -> { + try { + return Material.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + logger.warning("Failed to parse " + s + " as material at " + config.getCurrentPath()); + return null; + } + }); } - public static boolean showHealthAsPercent(){ - return config.getBoolean("show_health_as_percent", false); - } - - public static boolean defaultBypassOn() { - return config.getBoolean("default_bypass_mode"); - } - - public static Set parseMaterialList(List stringList) { - Set reinforceableMats; - if (stringList == null || stringList.size() == 0) { - reinforceableMats = null; + private ReinforcementEffect getReinforcementEffect(ConfigurationSection config) { + if (config == null) { + return null; } - else { - reinforceableMats = new HashSet(); - for(String s : stringList) { - try { - Material reinmat = Material.valueOf(s); - reinforceableMats.add(reinmat); - } - catch (IllegalArgumentException e) { - Citadel.getInstance().getLogger().warning("The specified reinforceable material " + s + " could not be parsed"); - } - } + Particle effect; + try { + String effectName = config.getString("type"); + effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE : Particle.valueOf(effectName); + } catch (IllegalArgumentException e) { + logger.warning("Invalid effect at: " + config.getCurrentPath()); + return null; } - return reinforceableMats; + float offsetX = (float) config.getDouble("offsetX", 0); + float offsetY = (float) config.getDouble("offsetY", 0); + float offsetZ = (float) config.getDouble("offsetZ", 0); + float speed = (float) config.getDouble("speed", 1); + int amount = config.getInt("particleCount", 1); + return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); } - public static boolean breakAcidedBlockNaturally() { - return config.getBoolean("break_acided_block_naturally", false); + public ManagedDatasource getDatabase() { + return database; + } + + public List getReinforcementTypes() { + return reinforcementTypes; } } diff --git a/src/vg/civcraft/mc/citadel/CitadelWorldManager.java b/src/vg/civcraft/mc/citadel/CitadelWorldManager.java new file mode 100644 index 00000000..b77d2659 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/CitadelWorldManager.java @@ -0,0 +1,135 @@ +package vg.civcraft.mc.citadel; + +import java.util.Map; +import java.util.TreeMap; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; + +import vg.civcraft.mc.citadel.database.CitadelReinforcementData; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public class CitadelWorldManager { + + private Map uuidToInternalID; + private Map worldToManager; + private CitadelReinforcementData dao; + + public CitadelWorldManager(CitadelReinforcementData dao) { + this.uuidToInternalID = new TreeMap<>(); + this.worldToManager = new TreeMap<>(); + this.dao = dao; + } + + public boolean setup() { + for (World world : Bukkit.getWorlds()) { + boolean worked = registerWorld(world); + if (!worked) { + return false; + } + } + return true; + } + + public boolean registerWorld(World world) { + int id = dao.getOrCreateWorldID(world); + if (id == -1) { + // very bad + return false; + } + uuidToInternalID.put(world.getUID(), id); + ReinforcementManager manager = new ReinforcementManager(dao, id); + worldToManager.put(world.getUID(), manager); + return true; + } + + /** + * Returns the Reinforcement for the specified block. + * + * @param block Block to get reinforcement for + * @return Reinforcement of the block if one exists, otherwise null + */ + public Reinforcement getReinforcement(Block block) { + return getReinforcement(block.getLocation()); + } + + /** + * Inserts a new reinforcement into the cache. Should only be used for + * reinforcements created just now + * + * @param loc Location of the reinforcement + * @param rein Reinforcement created + */ + public void insertReinforcement(Reinforcement rein) { + ReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); + if (worldManager == null) { + if (!registerWorld(rein.getLocation().getWorld())) { + throw new IllegalStateException("Failed to register world"); + } + worldToManager.get(rein.getLocation().getWorld().getUID()); + } + worldManager.insertReinforcement(rein); + } + + /** + * Returns the Reinforcement for the specified block. World is not checked at + * this stage + * + * @param block Location to get reinforcement for + * @return Reinforcement at the location if one exists, otherwise null + */ + public Reinforcement getReinforcement(Location location) { + ReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); + if (worldManager == null) { + return null; + } + return worldManager.getReinforcement(location); + } + + /** + * Checks if the block a tthe given location is reinforced or not. Priorize + * using getReinforcement() and doing a null check yourself if you intend to do + * something with the reinforcement to avoid a double lookup + * + * @param loc The location of the potential reinforcement. + * @return True if a reinforcement exists at the given location, false otherwise + */ + public boolean isReinforced(Location loc) { + return getReinforcement(loc) != null; + } + + /** + * Checks if the given block is reinforced or not. + * + * @param b The block of the potential reinforcement. + * @return True if a reinforcement exists for the given block, false otherwise + */ + public boolean isReinforced(Block b) { + return isReinforced(b.getLocation()); + } + + /** + * Saves all reinforcements out to the database + */ + public void flushAll() { + for (ReinforcementManager man : worldToManager.values()) { + man.invalidateAllReinforcements(); + } + } + + /** + * Removes a reinforcement from the immediate cache after it was destroyed + * + * @param rein The reinforcement destroyed + */ + public void removeReinforcement(Reinforcement rein) { + ReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); + if (worldManager == null) { + throw new IllegalStateException("No world manager for reinforcement at " + rein.getLocation().toString()); + } + worldManager.remo + } +} diff --git a/src/vg/civcraft/mc/citadel/PlayerState.java b/src/vg/civcraft/mc/citadel/PlayerState.java deleted file mode 100644 index 9185ae41..00000000 --- a/src/vg/civcraft/mc/citadel/PlayerState.java +++ /dev/null @@ -1,192 +0,0 @@ -package vg.civcraft.mc.citadel; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.logging.Level; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitScheduler; - -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; - -public class PlayerState { - - private static final Map PLAYER_STATES = new HashMap(); - - /** - * Method used to get the PlayerState of the specified player. - * Creates a new instance of a PlayerState if none is found. - * @param The Player you want to get the PlayerState for. - * @return The PlayerState of that player. - */ - public static PlayerState get(Player player) { - if (player == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "PlayerState get called with null player"); - } - UUID id = NameAPI.getUUID(player.getName()); - PlayerState state = PLAYER_STATES.get(id); - if (state == null) { - state = new PlayerState(player); - PLAYER_STATES.put(id, state); - } - return state; - } - - public static PlayerState get(UUID id) { - if (id == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "PlayerState get called with null id"); - } - PlayerState state = PLAYER_STATES.get(id); - if (state == null) { - state = new PlayerState(id); - PLAYER_STATES.put(id, state); - } - return state; - } - - /** - * Removes a PlayerState from the list. - * @param The Player to remove from the list. - */ - public static void remove(Player player) { - PLAYER_STATES.remove(player.getUniqueId()); - } - - private UUID accountId; - private ReinforcementMode mode; - private Group faction; - private boolean bypassMode; - private Integer cancelModePid; - private ItemStack fortificationStack; - private boolean easyMode; - - public PlayerState(Player player) { - this(player.getUniqueId()); - } - - public PlayerState(UUID uuid) { - reset(); - this.accountId = uuid; - bypassMode = false; - this.easyMode = true; - } - - /** - * Sets the placement mode to NORMAL and resets other properties. - */ - public void reset() { - mode = ReinforcementMode.NORMAL; - fortificationStack = null; - faction = null; - } - /** - * @return Returns the ReinforceMent Mode associated with the given - * Player. - */ - public ReinforcementMode getMode() { - return mode; - } - /** - * Sets the ReinforcementMode of a given Player. - * @param ReinforcementMode. - */ - public void setMode(ReinforcementMode mode) { - this.mode = mode; - } - /** - * Sets the fortificationStack. Make sure this is a ReinforcementType - * or its pretty useless. - * @param ItemStack. - */ - public void setFortificationItemStack(ItemStack fortificationStack) { - if (fortificationStack == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "PlayerState setFortificationItemStack called with null stack"); - } - this.fortificationStack = fortificationStack; - } - /** - * Gets the Group for a given PlayerState. - * @return The group belonging to the PlayerState. - */ - public Group getGroup() { - return faction; - } - /** - * Sets the Group for a PlayerState. - * @param The group. - */ - public void setGroup(Group faction) { - if (faction == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "PlayerState setGroup called with null faction"); - } - this.faction = faction; - } - /** - * Returns if a player is in BypassMode. - * @return True if in Bypass Mode. - */ - public boolean isBypassMode() { - return bypassMode; - } - /** - * Toggles Bypass Mode. - * @return Returns the new value. - */ - public boolean toggleBypassMode() { - bypassMode = !bypassMode; - return bypassMode; - } - - public boolean getEasyMode() { - return easyMode; - } - - /** - * Toggles Easy Mode. - * @return Returns the new value. - */ - public boolean toggleEasyMode() { - easyMode = !easyMode; - return easyMode; - } - - /** - * Prepares a scheduled task to reset the mode after a configured amount - * of time. - * - * If a task is already scheduled it is canceled first. - */ - public void checkResetMode() { - Citadel plugin = Citadel.getInstance(); - BukkitScheduler scheduler = Bukkit.getServer().getScheduler(); - if (cancelModePid != null && scheduler.isQueued(cancelModePid)) - scheduler.cancelTask(cancelModePid); - - cancelModePid = scheduler.scheduleSyncDelayedTask(plugin, new Runnable() { - public void run() { - try { - Player player = Bukkit.getPlayer(accountId); - if (player != null && mode.name() != "NORMAL") { - player.sendMessage(ChatColor.YELLOW + mode.name() + " mode off"); - } - reset(); - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "PlayerState checkResetMode Failed", e); - } - } - }, 20L * CitadelConfigManager.getPlayerStateReset()); - } - /** - * Returns the ReinforcementType for a PlayerState. - * @return ReinforcementType. - */ - public ReinforcementType getReinforcementType(){ - return ReinforcementType.getReinforcementType(fortificationStack); - } -} diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java new file mode 100644 index 00000000..1931edd3 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -0,0 +1,133 @@ +package vg.civcraft.mc.citadel; + +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.material.Bed; + +import vg.civcraft.mc.citadel.listener.BlockListener; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; + +public class ReinforcementLogic { + + public static void damageReinforcement(Player player, Reinforcement reinforcement) { + double damageAmount = 1.0; + if (!reinforcement.isMature()) { + double timeExisted = (double) (System.currentTimeMillis() - reinforcement.getCreationTime()); + double progress = timeExisted / (double) reinforcement.getType().getMaturationTime(); + damageAmount /= (1.0 - progress); + damageAmount *= reinforcement.getType().getMaturationScale(); + } + reinforcement.setHealth(reinforcement.getHealth() - damageAmount); + } + + public static void createReinforcement(Block block, ReinforcementType type) { + CitadelWorldManager worldManager = Citadel.getInstance().getReinforcementManager(); + } + + public static Reinforcement getReinforcementProtecting(Block b) { + Block actual = getResponsibleBlock(b); + return getChestReinforcement(actual); + } + + /** + * Some blocks, crops in particular, can not be reinforced but instead have + * their reinforcement behavior tied to a source block. This method will get + * that source block, which may be the given block itself. It does not look at + * reinforcement data at all, it merely applies logic based on block type and + * physics checks + * + * @param block Block to get responsible block for + * @return Block whichs reinforcement would protect the given block + */ + public static Block getResponsibleBlock(Block block) { + switch (block.getType()) { + case NETHER_WARTS: + case YELLOW_FLOWER: + case SAPLING: + case WHEAT: + case CARROT: + case POTATO: + case CROPS: + case BEETROOT_BLOCK: + case MELON_STEM: + case PUMPKIN_STEM: + return block.getRelative(BlockFace.DOWN); + case RED_ROSE: + case SUGAR_CANE_BLOCK: + case CACTUS: + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType()) { + below = below.getRelative(BlockFace.DOWN); + } + return below; + case ACACIA_DOOR: + case BIRCH_DOOR: + case DARK_OAK_DOOR: + case IRON_DOOR_BLOCK: + case SPRUCE_DOOR: + case JUNGLE_DOOR: + case WOODEN_DOOR: + case WOOD_DOOR: + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + //block is upper half of a door + return block.getRelative(BlockFace.DOWN); + } + case BED_BLOCK: + if (((Bed) block.getState().getData()).isHeadOfBed()) { + return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); + } + } + return block; + } + + public static Reinforcement getChestReinforcement(Block b) { + Material mat = b.getType(); + CitadelWorldManager reinMan = Citadel.getInstance().getReinforcementManager(); + Reinforcement rein = reinMan.getReinforcement(b); + if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { + return rein; + } + for(BlockFace face : BlockListener.planar_sides) { + Block rel = b.getRelative(face); + if (rel.getType() != mat) { + continue; + } + rein = reinMan.getReinforcement(rel); + if (rein != null) { + return rein; + } + } + return null; + } + + + /** + * Checks if at the given block is a container, which is not insecure and which + * the player can not access due to missing perms + * + * @param block Block to check for + * @return True if the player can not do something like placing an adjacent + * chest or comparator, false otherwise + */ + public static boolean isPreventingBlockAccess(Player player, Block block) { + if (block == null) { + return false; + } + if (block.getState() instanceof InventoryHolder) { + Reinforcement rein = ReinforcementLogic.getChestReinforcement(block); + if (rein == null) { + return false; + } + if (rein.isInsecure()) { + return false; + } + return !rein.hasPermission(player, Citadel.chestPerm); + } + return false; + } +} diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 430b3564..85f194ff 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -1,10 +1,6 @@ package vg.civcraft.mc.citadel; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; +import org.bukkit.Location; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -12,210 +8,79 @@ import com.google.common.cache.RemovalListener; import com.google.common.cache.RemovalNotification; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; - import vg.civcraft.mc.citadel.database.CitadelReinforcementData; -import vg.civcraft.mc.citadel.misc.CitadelStatics; -import vg.civcraft.mc.citadel.misc.LoadingCacheNullException; -import vg.civcraft.mc.citadel.reinforcement.NullReinforcement; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; public class ReinforcementManager { - // TODO : Batching of inserts, saves, and deletes. - // Thinking: - // Second layer cache. Situation exists where a reinf is scheduled for - // real save (in queue) but batch isn't executed. - // So a cache load miss should read from this queue first; if no match, - // then DB load. - // Given architecture at present, this cache needs to be more persistent then top cache, and - // clear atomically into batched inserts, updates, and deletes. - // Idea would be that since we've disambiguated final outcome "state" in the dirty-cache, - // we are clear to batch all operations of like-kind as there will be no overlap. - // Meanwhile, a new dirty cache will begin accumulating. - - // TODO: For chunk loading, on block break peek() at end of a queue, if diff chunk, offer() the chunk - // of cache MISS. - // Then, a scheduled task runs every second, or several works running continuously, goes through that queue. - // This task keeps a list of chunks that have been loaded, and how long ago - // if last time was longer then the cachetimeout, the chunk is reloaded on request, otherwise - // skipped. and so on. + private final int worldID; + private final LoadingCache reinforcements; - - private CitadelReinforcementData db; - private long dayMultiplier; - - // This shit is cool - private RemovalListener removalListener = new RemovalListener() { - public void onRemoval(RemovalNotification removal) { - Reinforcement rein = removal.getValue(); - if (rein == null || rein instanceof NullReinforcement){ - return; - } - if (rein.isDirty()) { - saveReinforcement(rein); + public ReinforcementManager(CitadelReinforcementData db, int worldID) { + this.worldID = worldID; + this.reinforcements = CacheBuilder.newBuilder().removalListener(new RemovalListener() { + public void onRemoval(RemovalNotification removal) { + ChunkCache chunk = removal.getValue(); + if (chunk.isDirty()) { + db.saveReinforcements(chunk); + } } - } - }; - - private LoadingCache reinforcements = CacheBuilder - .newBuilder().maximumSize(CitadelConfigManager.getMaxCacheSize()) - .expireAfterAccess(CitadelConfigManager.getMaxCacheMinutes(), TimeUnit.MINUTES) - .removalListener(removalListener) - .build(new CacheLoader() { - public Reinforcement load(Location loc) throws Exception { - if (loc == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager cache load called with null"); - } - - Reinforcement rein = db.getReinforcement(loc); - if (rein == null) { - return new NullReinforcement(loc); - } - CitadelStatics.updateHitStat(CitadelStatics.LOAD); - // TODO: count misses in a chunk, and fucking load the whole chunk if we cross a threshold. - // decrement cache because it gets increased from getReinforcement() - CitadelStatics.decrementHitStat(CitadelStatics.CACHE); - return rein; + }).build(new CacheLoader() { + public ChunkCache load(ChunkPair loc) throws Exception { + if (loc == null) { + throw new IllegalArgumentException("Can not load reinforcements for null location"); } - }); - - public ReinforcementManager(CitadelReinforcementData db) { - this.db = db; - this.dayMultiplier = (long)CitadelConfigManager.getDayMultiplier(); - - scheduleSave(); + return db.loadReinforcements(loc, worldID); + } + }); } - public long getDayMultiplier(){ - return dayMultiplier; - } - - /** - * Saves the reinforcement to the database. If the reinforcement durability - * is less than or equal to zero it will delete it from the database. - * @param The Reinforcement to save - */ - public void saveReinforcement(Reinforcement rein) { - if (rein == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager saveReinforcement called with null"); - return; - } - if (rein.getDurability() <= 0) { - deleteReinforcement(rein); - return; + public void insertReinforcement(Reinforcement reinforcement) { + ChunkPair key = ChunkPair.forLocation(reinforcement.getLocation()); + ChunkCache cache = reinforcements.getIfPresent(key); + if (cache == null) { + throw new IllegalStateException("Chunk for created reinforcement was not loaded"); } - CitadelStatics.updateHitStat(CitadelStatics.UPDATE); - db.saveReinforcement(rein); - rein.setDirty(false); + cache.insertReinforcement(reinforcement); } - public void saveManyReinforcements(List reins) { - if (reins == null || reins.size() == 0) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager saveManyReinforcement called with null or empty"); - return; + private void removeReinforcement(Reinforcement reinforcement) { + ChunkPair key = ChunkPair.forLocation(reinforcement.getLocation()); + ChunkCache cache = reinforcements.getIfPresent(key); + if (cache == null) { + throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); } - List removes = new ArrayList(reins.size()); - List updates = new ArrayList(reins.size()); - for (Reinforcement rein : reins) { - if (rein.getDurability() <= 0) { - rein.setDirty(false); - reinforcements.invalidate(rein.getLocation()); - CitadelStatics.updateHitStat(CitadelStatics.DELETE); - removes.add(rein); - } else { - CitadelStatics.updateHitStat(CitadelStatics.UPDATE); - rein.setDirty(false); - updates.add((PlayerReinforcement) rein); - } - } - Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement removing {0}", removes.size()); - db.deleteManyReinforcements(removes); - - Citadel.getInstance().getLogger().log(Level.INFO, "ReinforcementManager saveManyReinforcement saving reinfs {0}", updates.size()); - db.saveManyReinforcements(updates); + cache.rem } - + /** - * Saves the initial reinforcement into the database. - * @param The Reinforcement to save + * @return Internal id of the world for which this instance manages reinforcements */ - public void saveInitialReinforcement(Reinforcement rein) { - // Do a check first, there might be an edge case for example half slabs where there is a reinforcement - // but it got this far. Lets just keep the one already there and ignore this new one. - // If this is some other case then the code already in place should have deleted the reinforcement EX: Air. - if (rein == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager saveInitialReinforcement called with null"); - return; - } - if (getReinforcement(rein.getLocation()) == null) { - reinforcements.put(rein.getLocation(), rein); - CitadelStatics.updateHitStat(CitadelStatics.INSERT); - db.insertReinforcement(rein); - } + public int getWorldID() { + return worldID; } /** - * Returns the Reinforcement from the specified location. + * Returns the Reinforcement for the specified block. World is not checked at + * this stage * - * @param loc - * @return Reinforcement + * @param block Location to get reinforcement for + * @return Reinforcement at the location if one exists, otherwise null */ public Reinforcement getReinforcement(Location loc) { if (loc == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcement called with null"); - return null; + throw new IllegalArgumentException("Can not get reinforcement for null location"); } - - try { - Reinforcement rein = reinforcements.get(loc); - if (rein instanceof NullReinforcement) { - return null; - } - CitadelStatics.updateHitStat(CitadelStatics.CACHE); - return rein; - } catch (Exception e) { - // So we ignore cache errors? - if (!(e.getCause() instanceof LoadingCacheNullException)) { - e.printStackTrace(); - } + ChunkCache cache = reinforcements.getIfPresent(ChunkPair.forLocation(loc)); + if (cache == null) { + throw new IllegalStateException( + "You can not check reinforcements for unloaded chunks. Load the chunk first"); } - return null; - } - - /** - * Returns the Reinforcement from the specified block. - * - * @param block - * @return Reinforcement - */ - public Reinforcement getReinforcement(Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcement block called with null"); + Reinforcement rein = cache.getReinforcement(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + if (rein.isBroken()) { return null; } - return getReinforcement(block.getLocation()); - } - - /** - * Deletes the reinforcement. Should get called from the saveReinforcement - * method if the durability of the reinforcement is less than or equal to 0. - * - * @param rein - */ - public void deleteReinforcement(Reinforcement rein) { - if (rein == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager deleteReinforcement called with null"); - return; - } - rein.setDirty(false); - reinforcements.invalidate(rein.getLocation()); - db.deleteReinforcement(rein); - CitadelStatics.updateHitStat(CitadelStatics.DELETE); + return rein; } /** @@ -227,135 +92,12 @@ public void invalidateAllReinforcements() { } /** - * Returns if the location is reinforced or not. + * Checks if the location is reinforced or not. * - * @param loc - * - The location of the potential reinforcement. - * @return Returns true if one was found. + * @param loc The location of the potential reinforcement. + * @return True if a reinforcement exists at the given location, false otherwise */ public boolean isReinforced(Location loc) { - if (loc == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager isReinforced called with null"); - return false; - } - return getReinforcement(loc) != null; } - - /** - * Returns if the block is reinforced or not. - * - * @param block - * - The block of the potential reinforcement. - * @return Returns true if one was found. - */ - public boolean isReinforced(Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager isReinforced block called with null"); - return false; - } - - return isReinforced(block.getLocation()); - } - - // Saves periodicly all the reinforcements. - private void scheduleSave(){ - Bukkit.getScheduler().runTaskTimerAsynchronously(Citadel.getInstance(), new Runnable(){ - - @Override - public void run() { - try { - long cached = 0l; - long dirty = 0l; - long s = 0l; - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Running Scheduled Save"); - s = System.currentTimeMillis(); - } - List reins = new ArrayList(100); - synchronized(reinforcements){ - for (Reinforcement r: reinforcements.asMap().values()) { - if (r.isDirty()) { - reins.add(r); - dirty++; - } - cached++; - } - } - - if(reins.size() != 0){ - saveManyReinforcements(reins); - } - - if (CitadelConfigManager.shouldLogInternal()) { - s = System.currentTimeMillis() - s; - Citadel.getInstance().getLogger().log(Level.INFO, - "Scheduled Save complete in {0} ms. Cache holds {1} entries, {2} entries saved to DB.", - new Object[] {s, cached, dirty}); - } - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager scheduled save encountered a problem", e); - } - } - - }, 100, CitadelConfigManager.getTickRepeatingSave()); - } - - /** - * This gets all reinforcements in a chunk. This should not be called regularly synchronously as this will call the database first. - * After it grabs the reinforcements it checks if they are already in the cache and if they are it skips it and if not it puts it in there. - * Then returns the list of reinforcements in the Chunk. - */ - public List getReinforcementsByChunk(Chunk chunk){ - if (chunk == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcementsByChunk called with null"); - return new ArrayList(); - } - - List reins = db.getReinforcements(chunk); - List reins_new = new ArrayList(); - for (Reinforcement rein: reins){ - Reinforcement prep = reinforcements.getIfPresent(rein.getLocation()); - if (prep == null || prep instanceof NullReinforcement){ - reinforcements.put(rein.getLocation(), rein); - reins_new.add(rein); - } else { - Reinforcement r = null; - try { - r = reinforcements.get(rein.getLocation()); - } catch (ExecutionException e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager getReinforcementsByChunk failed a get", e); - } - reins_new.add(r); - } - } - return reins_new; - } - - /** - * Identical to {@link #getReinforcementsByChunk(Chunk)} - * just doesn't try to return anything - */ - public void loadReinforcementChunk(Chunk chunk) { - if (chunk == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementManager loadReinforcementChunk called with null"); - return; - } - long s = System.currentTimeMillis(); - List reins = db.getReinforcements(chunk); - int count = 0; - for (Reinforcement rein: reins){ - Reinforcement r = reinforcements.getIfPresent(rein.getLocation()); - if (r == null || r instanceof NullReinforcement) { - reinforcements.put(rein.getLocation(), rein); - count++; - } - } - if (count > 0 && CitadelConfigManager.shouldLogInternal()) { - s = System.currentTimeMillis() - s; - Citadel.getInstance().getLogger().log(Level.INFO, - "Chunk load {0} complete in {1} ms. Added {2} entries to the cache.", - new Object[] {chunk.toString(), s, count}); - } - } } diff --git a/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java b/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java new file mode 100644 index 00000000..999928ba --- /dev/null +++ b/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java @@ -0,0 +1,36 @@ +package vg.civcraft.mc.citadel; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; + +public class ReinforcementTypeManager { + + private Map typesByItem; + private Map typesById; + + public ReinforcementTypeManager() { + typesByItem = new HashMap<>(); + typesById = new TreeMap<>(); + } + + public void register(ReinforcementType type) { + typesByItem.put(type.getItem(), type); + typesById.put(type.getID(), type); + } + + public ReinforcementType getById(int id) { + return typesById.get(id); + } + + public ReinforcementType getByItemStack(ItemStack is) { + ItemStack copy = is.clone(); + copy.setAmount(1); + return typesByItem.get(copy); + } + +} diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index c2b13d0a..41a85f5e 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -10,10 +10,6 @@ import java.util.Set; import java.util.logging.Level; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -30,6 +26,9 @@ import org.bukkit.material.Bed; import org.bukkit.util.Vector; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; @@ -57,7 +56,7 @@ public class Utility { public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { receiver.sendMessage(color + message); - if (CitadelConfigManager.shouldLogPlayerCommands()) { + if (OldCitadelConfigManager.shouldLogPlayerCommands()) { Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); } } @@ -73,7 +72,7 @@ public static void sendAndLog(Player player, ChatColor color, String message, St playerMessage.setHoverEvent(hover); player.spigot().sendMessage(playerMessage); } - if (CitadelConfigManager.shouldLogPlayerCommands()) { + if (OldCitadelConfigManager.shouldLogPlayerCommands()) { Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{player.getName(), message}); } } @@ -99,7 +98,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group if (g.isDisciplined()) { player.sendMessage(ChatColor.RED + "This group is disciplined."); - if (CitadelConfigManager.shouldLogInternal()) { + if (OldCitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.WARNING, "Request to create reinforcement for disciplined group " + g.getName()); } @@ -107,7 +106,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group } if (NonReinforceableType.isNonReinforceable(block.getType())){ player.sendMessage(ChatColor.RED + "That block cannot be reinforced."); - if (CitadelConfigManager.shouldLogInternal()) { + if (OldCitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.WARNING, "Request to create reinforcement for unreinforceable block " + block.getType()); } @@ -171,7 +170,7 @@ public static PlayerReinforcement createPlayerReinforcement(Player player, Group if (event.isCancelled()) { return null; } - if (CitadelConfigManager.shouldLogReinforcement()) { + if (OldCitadelConfigManager.shouldLogReinforcement()) { StringBuffer slb = new StringBuffer(); if (player != null) { slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) @@ -307,7 +306,7 @@ public static boolean wouldPlantDoubleReinforce(final Block block) { private static boolean isReinforceablePlant(Material mat) { // If this list changes, update wouldPlantDoubleReinforce to account // for the new soil types. - return Material.MELON_BLOCK.equals(mat) + return Material.MELON.equals(mat) || Material.PUMPKIN.equals(mat); } /** @@ -418,7 +417,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc } int durability = reinforcement.getDurability(); int durabilityLoss = 1; - if (reinforcement instanceof PlayerReinforcement && CitadelConfigManager.isMaturationEnabled()) { + if (reinforcement instanceof PlayerReinforcement && OldCitadelConfigManager.isMaturationEnabled()) { final int maturationTime = timeUntilMature(reinforcement); PlayerReinforcement rein = (PlayerReinforcement) reinforcement; ReinforcementType type = ReinforcementType.getReinforcementType(rein.getStackRepresentation()); @@ -446,7 +445,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc reinforcement.setDurability(durability); boolean cancelled = durability > 0; if (durability <= 0) { - if (CitadelConfigManager.shouldLogHostileBreaks()) { + if (OldCitadelConfigManager.shouldLogHostileBreaks()) { StringBuffer slb = new StringBuffer(); if (player != null) { slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) @@ -461,7 +460,7 @@ public static boolean reinforcementDamaged(Player player, Reinforcement reinforc cancelled = reinforcementBroken(null, reinforcement); } else { /* TODO: Move to ReinforcementEvent listener*/ - if (CitadelConfigManager.shouldLogDamage()) { + if (OldCitadelConfigManager.shouldLogDamage()) { StringBuffer slb = new StringBuffer(); if (player != null) { slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) @@ -580,7 +579,7 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce return false; } StringBuffer slb = null; - boolean logIt = CitadelConfigManager.shouldLogFriendlyBreaks() && player != null; + boolean logIt = OldCitadelConfigManager.shouldLogFriendlyBreaks() && player != null; if (logIt) { slb = new StringBuffer(); slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) @@ -601,7 +600,7 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce Location location = pr.getLocation(); if (player != null){ Inventory inv = player.getInventory(); - if (CitadelConfigManager.shouldDropReinforcedBlock()){ + if (OldCitadelConfigManager.shouldDropReinforcedBlock()){ // If we should drop a block instead ItemStack stack = createDroppedReinforcementBlock (reinforcement.getLocation().getBlock(), (PlayerReinforcement) reinforcement); @@ -735,39 +734,6 @@ public static boolean isAuthorizedPlayerNear(PlayerReinforcement reinforcement, } return result; } - /** - * Creates a Natural Reinforcement. - * @param The block that will have a natural reinforcement - * @param The Player who damaged the block. - * @return Returns a natural Reinforcement for the block or null if it isn't meant to have one. - */ - public static NaturalReinforcement createNaturalReinforcement(Block block, Player player) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createNaturalReinforcement called with null"); - return null; - } - Material material = block.getType(); - NaturalReinforcementType nType = NaturalReinforcementType. - getNaturalReinforcementType(material); - if (nType == null) { - return null; - } - int breakCount = nType.getDurability(); - NaturalReinforcement nr = new NaturalReinforcement(block, breakCount); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(nr, block, player); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "createNaturalReinforcement for " + block.getType() + " cancelled"); - } - - return null; - } - Citadel.getReinforcementManager().saveInitialReinforcement(nr); - return nr; - } /** * This method is used to convert Block Reinforcements to itemstacks @@ -814,7 +780,7 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac "Utility isDroppedReinforcementBlock called with null"); return null; } - if (!CitadelConfigManager.shouldDropReinforcedBlock()) return null; + if (!OldCitadelConfigManager.shouldDropReinforcedBlock()) return null; ItemMeta meta = stack.getItemMeta(); List lore = meta.getLore(); try{ @@ -863,7 +829,7 @@ public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStac new ReinforcementCreationEvent(rein, loc.getBlock(), p); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - if (CitadelConfigManager.shouldLogInternal()) { + if (OldCitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.INFO, "Dropped reinforcement creation event for " + rein.getType() + " cancelled"); } @@ -902,36 +868,6 @@ public static boolean explodeReinforcement(Block block) { return reinforcementDamaged(null, reinforcement); } - /** - * Creates a MultiBlockReinforcement and saves it to the db. This method is to be used only be other plugins. Citadel - * will not use this anywhere. - * @param locs The locations that make up the structure. - * @param g The group this will belong too. - * @param dur The durability this structure will have. - * @param mature The amount of time until it is mature (in minutes). - * @param acid The amount of time until it is mature (if acid -- in minutes). - * @return - */ - public static MultiBlockReinforcement createMultiBlockReinforcement(List locs, Group g, int dur, int mature, int acid){ - if (locs == null || g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createMultiBlockReinforcement called with null"); - return null; - } - MultiBlockReinforcement rein = new MultiBlockReinforcement(locs, g, dur, mature, acid, -1); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(rein, rein.getLocation().getBlock(), null); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "multiblock reinforcement creation event for " + rein.getType() + " cancelled"); - } - return null; - } - rm.saveInitialReinforcement(rein); - return rein; - } - /** * Display an effect defined in the config around a reinforcement. * @param reinforcement The reinforcement to spawn the effect around. diff --git a/src/vg/civcraft/mc/citadel/command/commands/Acid.java b/src/vg/civcraft/mc/citadel/command/Acid.java similarity index 68% rename from src/vg/civcraft/mc/citadel/command/commands/Acid.java rename to src/vg/civcraft/mc/citadel/command/Acid.java index 83c40a1f..ec357faa 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/Acid.java @@ -1,6 +1,9 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; import java.util.logging.Level; import org.bukkit.Bukkit; @@ -12,67 +15,49 @@ import org.bukkit.entity.Player; import org.bukkit.util.BlockIterator; +import vg.civcraft.mc.citadel.AcidManager; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; +import vg.civcraft.mc.citadel.CitadelWorldManager; +import vg.civcraft.mc.citadel.OldCitadelConfigManager; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.AcidBlockEvent; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.namelayer.group.Group; -public class Acid extends PlayerCommand { - private ReinforcementManager rm = Citadel.getReinforcementManager(); - - public Acid(String name) { - super(name); - setIdentifier("ctacid"); - setDescription("Removes the block above it if using an acid block."); - setUsage("/ctacid"); - setArguments(0, 0); - } +@CivCommand(id = "ctacid") +public class Acid extends StandaloneCommand { + + private static final String acidPermission = "ACIDBLOCK"; @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage("You must be a player to perform this command."); - return true; - } Player p = (Player) sender; Iterator itr = new BlockIterator(p, 40); // Within 2.5 chunks - Material acidBlock = CitadelConfigManager.getAcidBlock(); + AcidManager acidMan = Citadel.getInstance().getAcidManager(); while (itr.hasNext()) { Block block = itr.next(); - if (block.getType() != acidBlock) { + if (!acidMan.isPossibleAcidBlock(block)) { continue; } - Reinforcement rein = rm.getReinforcement(block); - if (rein == null) { + Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (reinforcement == null) { Utility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } - if (!(rein instanceof PlayerReinforcement)) { // Just in case. - // Most chance it is a PlayerReinforcement but otherwise. - Utility.sendAndLog(p, ChatColor.RED, - "An acid block cannot be a natural reinforcement."); - return true; - } - PlayerReinforcement pRein = (PlayerReinforcement) rein; UUID uuid = NameAPI.getUUID(p.getName()); - if (pRein.getGroup() == null) { - Utility.sendAndLog(p, ChatColor.RED, "No-one is on that group."); - return true; - } - if (!pRein.getGroup().isMember(uuid)) { - Utility.sendAndLog(p, ChatColor.RED, "You do not belong on that group."); - return true; - } - if (!pRein.canAcid(p)) { + if (!reinforcement.hasPermission(p, acidPermission)) { Utility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); return true; } + + + int time = Utility.timeUntilAcidMature(pRein); if (time != 0) { Utility.sendAndLog(p, ChatColor.RED, "That acid block is not mature yet."); @@ -103,14 +88,14 @@ public boolean execute(CommandSender sender, String[] args) { AcidBlockEvent event = new AcidBlockEvent(p, pRein, pTopRein); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - if (CitadelConfigManager.shouldLogInternal()) { + if (OldCitadelConfigManager.shouldLogInternal()) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid block event cancelled for acid at " + pRein.getLocation() ); } return true; } - if (CitadelConfigManager.shouldLogHostileBreaks()) { + if (OldCitadelConfigManager.shouldLogHostileBreaks()) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}", new Object[] {block.getLocation(), topFace.getType(), topFace.getLocation()}); } @@ -123,7 +108,7 @@ public boolean execute(CommandSender sender, String[] args) { block.breakNaturally(); // Break the acided block - if (CitadelConfigManager.breakAcidedBlockNaturally()) { + if (OldCitadelConfigManager.breakAcidedBlockNaturally()) { topFace.breakNaturally(); } else { diff --git a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/AreaReinforce.java similarity index 97% rename from src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java rename to src/vg/civcraft/mc/citadel/command/AreaReinforce.java index c6414540..64e56627 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -1,10 +1,8 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.lang.Integer; -import java.lang.Math; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -16,10 +14,10 @@ import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class AreaReinforce extends PlayerCommand { private ReinforcementManager rm = Citadel.getReinforcementManager(); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java b/src/vg/civcraft/mc/citadel/command/Bypass.java similarity index 96% rename from src/vg/civcraft/mc/citadel/command/commands/Bypass.java rename to src/vg/civcraft/mc/citadel/command/Bypass.java index cca5a7e4..f400c8fc 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Bypass.java +++ b/src/vg/civcraft/mc/citadel/command/Bypass.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; diff --git a/src/vg/civcraft/mc/citadel/command/CommandHandler.java b/src/vg/civcraft/mc/citadel/command/CommandHandler.java deleted file mode 100644 index cbc06bb3..00000000 --- a/src/vg/civcraft/mc/citadel/command/CommandHandler.java +++ /dev/null @@ -1,98 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -import vg.civcraft.mc.citadel.command.commands.Acid; -import vg.civcraft.mc.citadel.command.commands.AreaReinforce; -import vg.civcraft.mc.citadel.command.commands.Bypass; -import vg.civcraft.mc.citadel.command.commands.Fortification; -import vg.civcraft.mc.citadel.command.commands.Information; -import vg.civcraft.mc.citadel.command.commands.Insecure; -import vg.civcraft.mc.citadel.command.commands.Materials; -import vg.civcraft.mc.citadel.command.commands.Off; -import vg.civcraft.mc.citadel.command.commands.Reinforce; -import vg.civcraft.mc.citadel.command.commands.ReinforcementsGUI; -import vg.civcraft.mc.citadel.command.commands.SetLogging; -import vg.civcraft.mc.citadel.command.commands.Stats; -import vg.civcraft.mc.citadel.command.commands.ToggleEasyMode; -import vg.civcraft.mc.citadel.command.commands.UpdateReinforcements; -import vg.civcraft.mc.civmodcore.command.Command; - -public class CommandHandler { - public Map commands = new HashMap(); - /** - * Registers the commands for the CommandHandler. - */ - public void registerCommands(){ - addCommands(new Acid("Acid")); - addCommands(new Bypass("Bypass")); - addCommands(new Fortification("Fortification")); - addCommands(new Information("Information")); - addCommands(new Insecure("Insecure")); - addCommands(new Reinforce("Reinforce")); - addCommands(new Materials("Materials")); - addCommands(new Off("Off")); - addCommands(new Stats("Stats")); - addCommands(new UpdateReinforcements("UpdateReinforcements")); - addCommands(new AreaReinforce("AreaReinforce")); - addCommands(new SetLogging("SetLogging")); - addCommands(new ToggleEasyMode("ToggleEasyMode")); - addCommands(new ReinforcementsGUI("ReinforcementGUI")); - } - - private void addCommands(Command command){ - commands.put(command.getIdentifier().toLowerCase(), command); - } - /** - * Is called when a command is executed. Should not be touched by any outside - * plugin. - * @param sender - * @param cmd - * @param args - * @return - */ - public boolean execute(CommandSender sender, org.bukkit.command.Command cmd, String[] args){ - if (commands.containsKey(cmd.getName().toLowerCase())){ - Command command = commands.get(cmd.getName().toLowerCase()); - if (args.length < command.getMinArguments() || args.length > command.getMaxArguments()){ - helpPlayer(command, sender); - return true; - } - - command.execute(sender, args); - } - return true; - } - - /** - * Is called when a tab is pressed. Should not be touched by any outside - * plugin. - * @param sender - * @param cmd - * @param args - * @return - */ - - public List complete(CommandSender sender, org.bukkit.command.Command cmd, String[] args){ - if (commands.containsKey(cmd.getName().toLowerCase())){ - Command command = commands.get(cmd.getName().toLowerCase()); - return command.tabComplete(sender, args); - } - return null; - } - /** - * Sends a player help message. - * @param The Command that was executed. - * @param The CommandSender who executed the command. - */ - public void helpPlayer(Command command, CommandSender sender){ - sender.sendMessage(new StringBuilder().append(ChatColor.RED + "Command: " ).append(command.getName()).toString()); - sender.sendMessage(new StringBuilder().append(ChatColor.RED + "Description: " ).append(command.getDescription()).toString()); - sender.sendMessage(new StringBuilder().append(ChatColor.RED + "Usage: ").append(command.getUsage()).toString()); - } -} diff --git a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java b/src/vg/civcraft/mc/citadel/command/Fortification.java similarity index 98% rename from src/vg/civcraft/mc/citadel/command/commands/Fortification.java rename to src/vg/civcraft/mc/citadel/command/Fortification.java index 5e8e6be8..80c9f7d4 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/Fortification.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; @@ -12,15 +12,15 @@ import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementMode; +import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class Fortification extends PlayerCommand{ private GroupManager gm = NameAPI.getGroupManager(); diff --git a/src/vg/civcraft/mc/citadel/command/commands/Information.java b/src/vg/civcraft/mc/citadel/command/Information.java similarity index 96% rename from src/vg/civcraft/mc/citadel/command/commands/Information.java rename to src/vg/civcraft/mc/citadel/command/Information.java index 48b415ff..fcda7c9e 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Information.java +++ b/src/vg/civcraft/mc/citadel/command/Information.java @@ -1,4 +1,7 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; + +import java.util.ArrayList; +import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -9,9 +12,6 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.civmodcore.command.PlayerCommand; -import java.util.ArrayList; -import java.util.List; - public class Information extends PlayerCommand{ public Information(String name) { diff --git a/src/vg/civcraft/mc/citadel/command/commands/Insecure.java b/src/vg/civcraft/mc/citadel/command/Insecure.java similarity index 96% rename from src/vg/civcraft/mc/citadel/command/commands/Insecure.java rename to src/vg/civcraft/mc/citadel/command/Insecure.java index 56daafa7..a3397669 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Insecure.java +++ b/src/vg/civcraft/mc/citadel/command/Insecure.java @@ -1,4 +1,7 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; + +import java.util.ArrayList; +import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -9,9 +12,6 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.civmodcore.command.PlayerCommand; -import java.util.ArrayList; -import java.util.List; - public class Insecure extends PlayerCommand{ public Insecure(String name) { diff --git a/src/vg/civcraft/mc/citadel/command/commands/Materials.java b/src/vg/civcraft/mc/citadel/command/Materials.java similarity index 97% rename from src/vg/civcraft/mc/citadel/command/commands/Materials.java rename to src/vg/civcraft/mc/citadel/command/Materials.java index be18d82f..4ce7d7b6 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Materials.java +++ b/src/vg/civcraft/mc/citadel/command/Materials.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; diff --git a/src/vg/civcraft/mc/citadel/command/commands/Off.java b/src/vg/civcraft/mc/citadel/command/Off.java similarity index 95% rename from src/vg/civcraft/mc/citadel/command/commands/Off.java rename to src/vg/civcraft/mc/citadel/command/Off.java index 8b32a27e..7f0f4445 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Off.java +++ b/src/vg/civcraft/mc/citadel/command/Off.java @@ -1,4 +1,7 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; + +import java.util.ArrayList; +import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -8,9 +11,6 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.civmodcore.command.PlayerCommand; -import java.util.ArrayList; -import java.util.List; - public class Off extends PlayerCommand{ public Off(String name) { diff --git a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java b/src/vg/civcraft/mc/citadel/command/Reinforce.java similarity index 98% rename from src/vg/civcraft/mc/citadel/command/commands/Reinforce.java rename to src/vg/civcraft/mc/citadel/command/Reinforce.java index 00edf78b..abe0d568 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/Reinforce.java @@ -1,21 +1,23 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; import java.util.UUID; + import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; + import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementMode; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class Reinforce extends PlayerCommand { diff --git a/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java similarity index 98% rename from src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java rename to src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java index d23d8165..6312b5d4 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ReinforcementsGUI.java +++ b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.text.DecimalFormat; import java.util.Collections; @@ -6,17 +6,16 @@ import java.util.LinkedList; import java.util.List; -import net.md_5.bungee.api.ChatColor; - import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import net.md_5.bungee.api.ChatColor; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.civmodcore.inventorygui.ClickableInventory; import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class ReinforcementsGUI extends PlayerCommand { diff --git a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java b/src/vg/civcraft/mc/citadel/command/SetLogging.java similarity index 75% rename from src/vg/civcraft/mc/citadel/command/commands/SetLogging.java rename to src/vg/civcraft/mc/citadel/command/SetLogging.java index bc83a4d3..fdc92bef 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/SetLogging.java +++ b/src/vg/civcraft/mc/citadel/command/SetLogging.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.Arrays; @@ -9,7 +9,7 @@ import org.bukkit.command.ConsoleCommandSender; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; +import vg.civcraft.mc.citadel.OldCitadelConfigManager; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.civmodcore.command.PlayerCommand; @@ -43,12 +43,12 @@ public boolean execute(CommandSender sender, String[] args) { // validated, so lets just do it. if (args.length == 0) { StringBuilder sb = new StringBuilder("Current deep logging set to: \n"); - sb.append(" Internal: ").append(CitadelConfigManager.shouldLogInternal()).append("\n"); - sb.append(" Player Command Responses: ").append(CitadelConfigManager.shouldLogPlayerCommands()).append("\n"); - sb.append(" Friendly/CTB Breaks: ").append(CitadelConfigManager.shouldLogFriendlyBreaks()).append("\n"); - sb.append(" Hostile Breaks: ").append(CitadelConfigManager.shouldLogHostileBreaks()).append("\n"); - sb.append(" Damage: ").append(CitadelConfigManager.shouldLogDamage()).append("\n"); - sb.append(" Reinforcements: ").append(CitadelConfigManager.shouldLogReinforcement()).append("\n"); + sb.append(" Internal: ").append(OldCitadelConfigManager.shouldLogInternal()).append("\n"); + sb.append(" Player Command Responses: ").append(OldCitadelConfigManager.shouldLogPlayerCommands()).append("\n"); + sb.append(" Friendly/CTB Breaks: ").append(OldCitadelConfigManager.shouldLogFriendlyBreaks()).append("\n"); + sb.append(" Hostile Breaks: ").append(OldCitadelConfigManager.shouldLogHostileBreaks()).append("\n"); + sb.append(" Damage: ").append(OldCitadelConfigManager.shouldLogDamage()).append("\n"); + sb.append(" Reinforcements: ").append(OldCitadelConfigManager.shouldLogReinforcement()).append("\n"); Utility.sendAndLog(sender, ChatColor.GREEN, sb.toString()); } @@ -58,22 +58,22 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length >= 1) { if ("internal".equalsIgnoreCase(args[0])) { flag = "internal_logging"; - newval = CitadelConfigManager.shouldLogInternal(); + newval = OldCitadelConfigManager.shouldLogInternal(); } else if ("playercommands".equalsIgnoreCase(args[0])) { flag = "command_logging"; - newval = CitadelConfigManager.shouldLogPlayerCommands(); + newval = OldCitadelConfigManager.shouldLogPlayerCommands(); } else if ("breaks".equalsIgnoreCase(args[0])) { flag = "break_logging"; - newval = CitadelConfigManager.shouldLogFriendlyBreaks(); + newval = OldCitadelConfigManager.shouldLogFriendlyBreaks(); } else if ("hostilebreaks".equalsIgnoreCase(args[0])) { flag = "hostile_logging"; - newval = CitadelConfigManager.shouldLogHostileBreaks(); + newval = OldCitadelConfigManager.shouldLogHostileBreaks(); } else if ("damage".equalsIgnoreCase(args[0])) { flag = "damage_logging"; - newval = CitadelConfigManager.shouldLogDamage(); + newval = OldCitadelConfigManager.shouldLogDamage(); } else if ("reinforcements".equalsIgnoreCase(args[0])) { flag = "reinf_logging"; - newval = CitadelConfigManager.shouldLogReinforcement(); + newval = OldCitadelConfigManager.shouldLogReinforcement(); } } diff --git a/src/vg/civcraft/mc/citadel/command/commands/Stats.java b/src/vg/civcraft/mc/citadel/command/Stats.java similarity index 98% rename from src/vg/civcraft/mc/citadel/command/commands/Stats.java rename to src/vg/civcraft/mc/citadel/command/Stats.java index a35e2b9d..84ae2584 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/Stats.java +++ b/src/vg/civcraft/mc/citadel/command/Stats.java @@ -1,20 +1,21 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class Stats extends PlayerCommand{ diff --git a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java similarity index 97% rename from src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java rename to src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java index 6404a6a6..b02fb13a 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/ToggleEasyMode.java +++ b/src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; diff --git a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java b/src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java similarity index 98% rename from src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java rename to src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java index c52e0e66..5b13047b 100644 --- a/src/vg/civcraft/mc/citadel/command/commands/UpdateReinforcements.java +++ b/src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.command.commands; +package vg.civcraft.mc.citadel.command; import java.util.ArrayList; import java.util.List; @@ -12,13 +12,13 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementManager; +import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcement.MultiBlockReinforcement; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; public class UpdateReinforcements extends PlayerCommand{ diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index a854eaeb..1e979cdf 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -4,893 +4,355 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Time; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; -import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Bukkit; -import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; +import vg.civcraft.mc.citadel.ChunkCache; +import vg.civcraft.mc.citadel.ChunkPair; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; -import vg.civcraft.mc.citadel.reinforcement.MultiBlockReinforcement; -import vg.civcraft.mc.citadel.reinforcement.NaturalReinforcement; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; +import vg.civcraft.mc.citadel.ReinforcementTypeManager; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; public class CitadelReinforcementData { private ManagedDatasource db; - private Citadel plugin = Citadel.getInstance(); - private Logger logger = plugin.getLogger(); + private Citadel plugin; + private Logger logger; + private ReinforcementTypeManager typeMan; - private Map natures = new HashMap(); - private Map invNatures = new HashMap(); - - private static enum ReinforcementNature { - PLAYER_REINFORCEMENT ("PlayerReinforcement"), - NATURAL_REINFORCEMENT ("NaturalReinforcement"), - MULTIBLOCK_REINFORCEMENT ("MultiblockReinforcement"); - - private String label; - - ReinforcementNature(String label) { - this.label = label; - } - - public String getLabel() { - return this.label; - } - - public static ReinforcementNature decode(String label) { - if (label != null) { - for (ReinforcementNature nature : ReinforcementNature.values()) { - if (nature.label.equalsIgnoreCase(label)) { - return nature; - } - } - } - throw new IllegalArgumentException("No ReinforcementNature matching " + label); - } - } - - private static final String getRein = - "SELECT material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " - + "FROM reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; - private static final String getReins = - "SELECT x, y, z, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, rein_id " - + "FROM reinforcement WHERE chunk_x = ? and chunk_z = ? and world = ?;"; - private static final String addRein = - "INSERT INTO reinforcement (x, y, z, world, material_id, durability, insecure, maturation_time, acid_time, rein_type_id, lore, group_id, chunk_x, chunk_z) " - + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); "; - private static final String removeRein = "DELETE from reinforcement WHERE x = ? and y = ? and z = ? and world = ?"; - private static final String updateRein = - "UPDATE reinforcement SET durability = ?, insecure = ?, group_id = ?, maturation_time = ?, acid_time = ? " - + "WHERE x = ? and y = ? and z = ? and world = ?"; - private static final String getNatures = "SELECT rein_type_id, rein_type FROM reinforcement_type"; - - private static final String selectReinCountForGroup = - "SELECT count(*) AS count FROM reinforcement WHERE FIND_IN_SET(CAST(group_id AS char), ?) > 0"; - private static final String selectReinCount = "SELECT count(*) AS count FROM reinforcement"; - - public CitadelReinforcementData(ManagedDatasource db){ + public CitadelReinforcementData(ManagedDatasource db, Citadel plugin, ReinforcementTypeManager typeMan) { this.db = db; - - if (!db.isManaged()) { - // First "migration" is conversion from old system to new - boolean isNew = true; - try (Connection connection = db.getConnection(); - PreparedStatement checkNewInstall = connection.prepareStatement("SELECT * FROM db_version LIMIT 1;"); - // See if this was a new install. If it was, db_version statement will fail. If it isn't, it'll succeed. - // If the version statement fails, return true; this is new install, carryon. - ResultSet rs = checkNewInstall.executeQuery();) { - isNew = !rs.next(); - } catch (SQLException se) { - logger.log(Level.INFO, "New installation: Welcome to Citadel!"); - } - - if (!isNew) { - try (Connection connection = db.getConnection(); - PreparedStatement migrateInstall = connection.prepareStatement( - "INSERT INTO managed_plugin_data (plugin_name, current_migration_number, last_migration)" - + " SELECT plugin_name, max(db_version), max(str_to_date(update_time, '%Y-%m-%d %H:%i:%s' )) FROM db_version WHERE plugin_name = ? LIMIT 1;");) { - migrateInstall.setString(1, Citadel.getInstance().getPluginName()); - int rows = migrateInstall.executeUpdate(); - if (rows == 1) { - logger.log(Level.INFO, "Migration successful!"); - } else { - Bukkit.shutdown(); - logger.log(Level.SEVERE, "Migration failed; db_version exists but uncaptured. Could be version problem."); - return; - } - } catch (SQLException se) { - Bukkit.shutdown(); - // Migration failed... - logger.log(Level.SEVERE, "Migration failure!", se); - return; - } - } - } else { - logger.log(Level.INFO, "Still at it, eh?"); - } - - doPrepareNatures(); + this.plugin = plugin; + this.typeMan = typeMan; + this.logger = plugin.getLogger(); } - private void doPrepareNatures() { - try (Connection connection = db.getConnection(); - PreparedStatement statement = connection.prepareStatement(CitadelReinforcementData.getNatures); - ResultSet set = statement.executeQuery();) { - while (set.next()) { - int id = set.getInt(1); - String type = set.getString(2); - try { - ReinforcementNature nature = ReinforcementNature.decode(type); - natures.put(id, nature); - invNatures.put(nature, id); - } catch (IllegalArgumentException iae) { - logger.log(Level.WARNING, "Note that although configured, {0} is not a recognized Reinforcement Nature", type); - } - } - - if (natures.size() == 0) { - logger.log(Level.SEVERE, "Failed to find any reinforcement types, shutting down."); - Bukkit.shutdown(); - } - } catch (SQLException se) { - logger.log(Level.SEVERE, "Failed to load the reinforcement types, shutting down."); - Bukkit.shutdown(); - } + public boolean startUp() { + registerMigrations(); + return db.updateDatabase(); } - public void registerMigrations() { - db.registerMigration(6, false, - new Callable () { - @Override - public Boolean call() throws Exception { - try (Connection connection = db.getConnection(); - PreparedStatement dotypes = connection.prepareStatement("insert into reinforcement_type(rein_type) values (?);")) { - for (ReinforcementNature x: ReinforcementNature.values()) { - dotypes.setString(1, x.getLabel()); - dotypes.addBatch(); - } - int[] rez = dotypes.executeBatch(); - if (rez.length == ReinforcementNature.values().length) { - return true; - } else { - logger.log(Level.SEVERE, "Failed to insert reinforcement types."); - } - } catch (Exception e) { - logger.log(Level.SEVERE, "Failed to insert reinforcement types.", e); - } - return null; - } - }, - "create table if not exists reinforcement(" + - "x int not null," + - "y int not null," + - "z int not null," + - "world varchar(10) not null," + - "material_id int not null," + - "durability varchar(10) not null," + - "chunk_id varchar(255) not null," + - "insecure tinyint(1) not null," + - "group_id int not null," + - "maturation_time int not null," + - "rein_type_id int not null," + - "lore varchar(255)," - + "primary key (x,y,z,world));", - "create table if not exists reinforcement_type(" - + "rein_type_id int not null auto_increment," - + "rein_type varchar(30) not null," - + "primary key rein_type_key (rein_type_id));"); - db.registerMigration(7, false, "create table if not exists reinforcement_id(" - + "rein_id int not null auto_increment," - + "x int not null," - + "y int not null," - + "z int not null," - + "chunk_id varchar(255)," - + "world varchar (255) not null," - + "primary key rein_id_key (rein_id)," - + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", - // I like turtles mother fucker. Never program because then you get turtles. - "insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;", // populate that bitch. + private void registerMigrations() { + db.registerMigration(7, false, + "create table if not exists reinforcement_id(" + "rein_id int not null auto_increment," + + "x int not null," + "y int not null," + "z int not null," + "chunk_id varchar(255)," + + "world varchar (255) not null," + "primary key rein_id_key (rein_id)," + + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", + // I like turtles mother fucker. Never program because then you get turtles. + "insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;", // populate + // that + // bitch. "alter table reinforcement add rein_id int not null, drop chunk_id;", "update reinforcement r inner join reinforcement_id ri on " - + "ri.x = r.x and ri.y = r.y and ri.z = r.z and ri.world = r.world " - + "set r.rein_id = ri.rein_id", - "alter table reinforcement DROP PRIMARY KEY, " - + "add primary key rein_id_key(rein_id), " - + "drop x," - + "drop y," - + "drop z," - + "drop world;", + + "ri.x = r.x and ri.y = r.y and ri.z = r.z and ri.world = r.world " + + "set r.rein_id = ri.rein_id", + "alter table reinforcement DROP PRIMARY KEY, " + "add primary key rein_id_key(rein_id), " + "drop x," + + "drop y," + "drop z," + "drop world;", "alter table reinforcement_id add index `chunk_id_index` (chunk_id);"); - db.registerMigration(8, false, "alter table reinforcement_id drop primary key," - + " add primary key (rein_id, x, y, z, world);"); + db.registerMigration(8, false, + "alter table reinforcement_id drop primary key," + " add primary key (rein_id, x, y, z, world);"); db.registerMigration(9, false, "alter table reinforcement add acid_time int not null;", "update reinforcement set acid_time = maturation_time;"); // Might take a minute. db.registerMigration(10, false, "drop procedure if exists insertReinID;", - "create definer=current_user procedure insertReinID(" - + "in x int," - + "in y int," - + "in z int," - + "in chunk_id varchar(255)," - + "in world varchar(255)" - + ") sql security invoker begin " - + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" - + "end;", + "create definer=current_user procedure insertReinID(" + "in x int," + "in y int," + "in z int," + + "in chunk_id varchar(255)," + "in world varchar(255)" + ") sql security invoker begin " + + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" + + "select LAST_INSERT_ID() as id;" + "end;", "drop procedure if exists insertCustomReinID;", - "create definer=current_user procedure insertCustomReinID(" - + "in rein_id int," - + "in x int," - + "in y int," - + "in z int," - + "in chunk_id varchar(255)," - + "in world varchar(255)" - + ") sql security invoker begin " - + "insert into reinforcement_id(rein_id, x, y, z, chunk_id, world) values (rein_id, x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" - + "end;"); + "create definer=current_user procedure insertCustomReinID(" + "in rein_id int," + "in x int," + + "in y int," + "in z int," + "in chunk_id varchar(255)," + "in world varchar(255)" + + ") sql security invoker begin " + + "insert into reinforcement_id(rein_id, x, y, z, chunk_id, world) values (rein_id, x, y, z, chunk_id, world);" + + "select LAST_INSERT_ID() as id;" + "end;"); db.registerMigration(11, false, "drop procedure if exists insertRein;", - "create definer=current_user procedure insertRein(" - + "in x int," - + "in y int," - + "in z int," - + "in chunk_id varchar(255)," - + "in world varchar(255)," - + "in material_id int," - + "in durability varchar(10)," - + "in insecure tinyint(1)," - + "in group_id int," - + "in maturation_time int," - + "in lore varchar(255)," - + "in acid_time int," - + "in rein_type varchar(30)" - + ") sql security invoker begin " - + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "insert into reinforcement (" - + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, rein_id, acid_time) VALUES (" - + "material_id, durability, insecure, group_id, maturation_time, " - + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " - + "lore, (select LAST_INSERT_ID()), acid_time);" - + "end;"); + "create definer=current_user procedure insertRein(" + "in x int," + "in y int," + "in z int," + + "in chunk_id varchar(255)," + "in world varchar(255)," + "in material_id int," + + "in durability varchar(10)," + "in insecure tinyint(1)," + "in group_id int," + + "in maturation_time int," + "in lore varchar(255)," + "in acid_time int," + + "in rein_type varchar(30)" + ") sql security invoker begin " + + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" + + "insert into reinforcement (" + + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, rein_id, acid_time) VALUES (" + + "material_id, durability, insecure, group_id, maturation_time, " + + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " + + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); db.registerMigration(12, false, - "CREATE TABLE reinforcement_temp (" - + "rein_id int not null auto_increment," - + "x int not null," - + "y int not null," - + "z int not null," - + "chunk_x int not null," - + "chunk_z int not null," - + "world varchar(255) not null," - + "material_id int not null," - + "durability varchar(10) not null," - + "insecure tinyint(1) not null," - + "group_id int not null," - + "maturation_time int not null," - + "rein_type_id int not null," - + "lore varchar(255)," - + "acid_time int not null," - + "primary key rid (rein_id)," - + "unique index realcoord (x,y,z,world)," - + "index chunkcoord(chunk_x, chunk_z, world)" - + ");", + "CREATE TABLE reinforcement_temp (" + "rein_id int not null auto_increment," + "x int not null," + + "y int not null," + "z int not null," + "chunk_x int not null," + "chunk_z int not null," + + "world varchar(255) not null," + "material_id int not null," + + "durability varchar(10) not null," + "insecure tinyint(1) not null," + + "group_id int not null," + "maturation_time int not null," + "rein_type_id int not null," + + "lore varchar(255)," + "acid_time int not null," + "primary key rid (rein_id)," + + "unique index realcoord (x,y,z,world)," + "index chunkcoord(chunk_x, chunk_z, world)" + ");", "INSERT IGNORE INTO reinforcement_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " - + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " - + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", + + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " + + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", "RENAME TABLE reinforcement_id TO deprecated_reinforcement_id;", "RENAME TABLE reinforcement TO deprecated_reinforcement;", - "RENAME TABLE reinforcement_temp TO reinforcement;", - "DROP PROCEDURE IF EXISTS insertReinID;", - "DROP PROCEDURE IF EXISTS insertCustomReinID;", - "DROP PROCEDURE IF EXISTS insertRein;" - ); - } - - - /** - * Is used to grab the reinforcement from the mysql db. - * If there isn't a reinforcement at the location it - * returns null. - * @param The Location of the wanted Reinforcement. - * @return Returns the Reinforcement of the location. - * @return Returns null if there is no reinforcement. - */ - public Reinforcement getReinforcement(Location loc){ - if (loc == null){ - logger.log(Level.WARNING, "CitadelReinforcementData getReinforcement called with null"); - return null; - } - - try(Connection connection = db.getConnection(); - PreparedStatement getRein = connection.prepareStatement(CitadelReinforcementData.getRein);) { - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - getRein.setInt(1, x); - getRein.setInt(2, y); - getRein.setInt(3, z); - getRein.setString(4, loc.getWorld().getName()); - ResultSet set = getRein.executeQuery(); - if (!set.next()) { - set.close(); - return null; - } - @SuppressWarnings("deprecation") - Material mat = Material.getMaterial(set.getInt(1)); - int durability = set.getInt(2); - boolean inSecure = set.getBoolean(3); - int mature = set.getInt(4); - int acid = set.getInt(5); - int rein_type_id = set.getInt(6); - ReinforcementNature rein_type = natures.get(rein_type_id); - String lore = set.getString(7); - int group_id = set.getInt(8); - //int linked_rein_id = set.getInt(9); - set.close(); - switch(rein_type) { - case PLAYER_REINFORCEMENT: - ItemStack stack = new ItemStack(mat); - if (lore != null) { - ItemMeta meta = stack.getItemMeta(); - List array = Arrays.asList(lore.split("\n")); - meta.setLore(array); - stack.setItemMeta(meta); - } - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - logger.log(Level.WARNING, - "Player Reinforcement at {0} lacks a valid group (group {1} failed lookup)", - new Object[] {loc, group_id}); + "RENAME TABLE reinforcement_temp TO reinforcement;", "DROP PROCEDURE IF EXISTS insertReinID;", + "DROP PROCEDURE IF EXISTS insertCustomReinID;", "DROP PROCEDURE IF EXISTS insertRein;"); + db.registerMigration(13, false, new Callable() { + + @Override + public Boolean call() throws SQLException { + logger.info("Upgrading to Citadel 4.0. This may take a while."); + int failedUpdates = 0; + int successfulUpdates = 0; + Map worldMapping = new HashMap<>(); + for (World world : Bukkit.getWorlds()) { + int id = getOrCreateWorldID(world); + if (id == -1) { + return false; } - return null; // group not found! - } - PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); - rein.setInsecure(inSecure); - return rein; - case NATURAL_REINFORCEMENT: - NaturalReinforcement nrein = new NaturalReinforcement(loc.getBlock(), durability); - return nrein; - case MULTIBLOCK_REINFORCEMENT: - logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); - return null; - default: - logger.log(Level.SEVERE, "Unknown reinforcement type in database: {0}", rein_type_id); - } - } catch (SQLException e) { - logger.log(Level.SEVERE, "Failed while retrieving reinforcement from database", e); - } - if (CitadelConfigManager.shouldLogInternal()) { - logger.log(Level.WARNING, "CitadelReinforcementData getReinforcement failed for {0}", loc); - } - return null; - } - - /** - * Returns a list of reinforcements in a given chunk. - * @param The chunk you want the reinforcements about. - * @return A list of reinforcements in a chunk - */ - public List getReinforcements(Chunk chunk){ - if (chunk == null){ - logger.log(Level.WARNING, "CitadelReinforcementData getReinforcements called with null"); - return null; - } - - List reins = new ArrayList(); - int cx = chunk.getX(); - int cz = chunk.getZ(); - String world = chunk.getWorld().getName(); + worldMapping.put(world.getName(), id); - try (Connection connection = db.getConnection(); - PreparedStatement getReins = connection.prepareStatement(CitadelReinforcementData.getReins);) { - if (CitadelConfigManager.shouldLogInternal()) { - logger.log(Level.WARNING, - "CitadelReinforcementData getReinforcements chunk called for {0}", chunk); - } - getReins.setInt(1, cx); - getReins.setInt(2, cz); - getReins.setString(3, world); - - try (ResultSet set = getReins.executeQuery();) { - while (set.next()) { - int x = set.getInt(1); - int y = set.getInt(2); - int z = set.getInt(3); - @SuppressWarnings("deprecation") - Material mat = Material.getMaterial(set.getInt(4)); - int durability = set.getInt(5); - boolean inSecure = set.getBoolean(6); - int mature = set.getInt(7); - int acid = set.getInt(8); - int rein_type_id = set.getInt(9); - ReinforcementNature rein_type = natures.get(rein_type_id); - String lore = set.getString(10); - int group_id = set.getInt(11); - // Sketch: when doing multiblock, have an FK that self-references the same table, so multiple locations link to a single rein. - //int linked_rein_id = set.getInt(12); - Location loc = new Location(chunk.getWorld(), x, y, z); - - switch(rein_type) { - case PLAYER_REINFORCEMENT: - Group g = GroupManager.getGroup(group_id); - if (g == null) { - if (CitadelConfigManager.shouldLogReinforcement()) { - logger.log(Level.WARNING, - "During Chunk {0} load, Player Reinforcement at {1} lacks a valid group (group {2} failed lookup)", - new Object[] {chunk, loc, group_id}); - } - continue; // group not found! + } + try (Connection connection = db.getConnection(); + PreparedStatement getRein = connection.prepareStatement( + "select rein_id, x, y, z, chunk_x, chunk_z, world, material_id, durability, insecure, group_id, " + + "lore, acid_time from reinforcement;"); + ResultSet rs = getRein.executeQuery()) { + while (rs.next()) { + int id = rs.getInt(1); + int x = rs.getInt(2); + int y = rs.getInt(3); + int z = rs.getInt(4); + int chunk_x = rs.getInt(5); + int chunk_z = rs.getInt(6); + String worldName = rs.getString(7); + int materialID = rs.getInt(8); + String durability = rs.getString(9); + double health = Double.parseDouble(durability); + boolean insecure = rs.getBoolean(10); + int groupId = rs.getInt(11); + String lore = rs.getString(12); + int acidTime = rs.getInt(13); + long msAcidTime = acidTime; + msAcidTime *= 60000; + if (msAcidTime == 0) { + msAcidTime = System.currentTimeMillis(); + } + @SuppressWarnings("deprecation") + Material mat = Material.getMaterial(materialID); + if (mat == null) { + failedUpdates++; + continue; + } + ItemStack is = new ItemStack(mat); + if (lore != null) { + ISUtils.addLore(is, lore); + } + ReinforcementType type = typeMan.getByItemStack(is); + if (type == null) { + failedUpdates++; + continue; + } + int typeID = type.getID(); + Integer worldID = worldMapping.get(worldName); + if (worldID == null) { + failedUpdates++; + continue; } - ItemStack stack = new ItemStack(mat); - if (lore != null){ - ItemMeta meta = stack.getItemMeta(); - List array = Arrays.asList(lore.split("\n")); - meta.setLore(array); - stack.setItemMeta(meta); + try (Connection insertConn = db.getConnection(); + PreparedStatement insertRein = insertConn.prepareStatement( + "insert into reinforcements (id,x,y,z,chunk_x,chunk_z,world_id,type_id," + + "creation_time,health,group_id,insecure) values(?,?,?,?,?,?,?,?,?,?,?,?);");) { + insertRein.setInt(1, id); + insertRein.setInt(2, x); + insertRein.setInt(3, y); + insertRein.setInt(4, z); + insertRein.setInt(5, chunk_x); + insertRein.setInt(6, chunk_z); + insertRein.setInt(7, worldID); + insertRein.setInt(8, typeID); + insertRein.setTime(9, new Time(msAcidTime)); + insertRein.setDouble(10, health); + insertRein.setInt(11, groupId); + insertRein.setBoolean(12, insecure); + insertRein.execute(); } - PlayerReinforcement rein = new PlayerReinforcement(loc, durability, mature, acid, g, stack); - rein.setInsecure(inSecure); - reins.add(rein); - break; - case NATURAL_REINFORCEMENT: - NaturalReinforcement nrein = new NaturalReinforcement(loc.getBlock(), durability); - reins.add(nrein); - break; - case MULTIBLOCK_REINFORCEMENT: - logger.log(Level.WARNING, "Multiblock reinforcements not currently supported"); - break; - default: - logger.log(Level.SEVERE, "Unknown reinforcement type in database: {0}", rein_type_id); + try (Connection deleteConn = db.getConnection(); + PreparedStatement deleteRein = deleteConn + .prepareStatement("delete from reinforcement where id = ?;");) { + deleteRein.setInt(1, id); + deleteRein.execute(); + } + successfulUpdates++; } } - } - } catch (SQLException e) { - logger.log(Level.SEVERE, "Failed while retrieving chunk " + chunk.toString() + " reinforcements from database", e); - } - return reins; - } - - /** - * Inserts a reinforcement into the Database. Should only be called from SaveManager. - * @param The Reinforcement to save. - */ - public void insertReinforcement(Reinforcement rein){ - insertReinforcement(rein, true); - } - - /** - * Internal, just sets the params correctly depending on nature. Assumes a single compatible query across all natures. - * @param rein - * @return - */ - @SuppressWarnings("deprecation") - private PreparedStatement prepInsertRein(Reinforcement rein, PreparedStatement insertRein) throws SQLException { - // universal fields. - Location loc = rein.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - Material mat = rein.getMaterial(); - int dur = rein.getDurability(); - int maturationTime = rein.getMaturationTime(); - int acidTime = rein.getAcidTime(); - int cx = loc.getChunk().getX(); - int cz = loc.getChunk().getZ(); - - // specific fields, "safe" values. - boolean insecure = false; - String lore = null; - int groupId = -1; - int type = 0; - - if (rein instanceof PlayerReinforcement) { - type = invNatures.get(ReinforcementNature.PLAYER_REINFORCEMENT); - - PlayerReinforcement prein = (PlayerReinforcement) rein; - insecure = prein.isInsecure(); - ItemMeta meta = prein.getStackRepresentation().getItemMeta(); - if (meta.hasLore()) { - StringBuilder newlore = new StringBuilder(); - for (String xx: meta.getLore()) { - newlore.append( xx ).append( "\n" ); + logger.info("Completed Citadel 4.0 update. Successfull: " + successfulUpdates + ", Failed: " + + failedUpdates); + if (failedUpdates > 0) { + logger.severe("Some of your old data could not be transfered, it was left intact in the old table. " + + "Contact Citadel developers if you do not know how to fix this yourself"); } - lore = newlore.toString(); - } else { - lore = null; - } - - Group g = prein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player Reinforcement insert at {0} lacks a valid group (lookup failed)", loc); + return true; } - groupId = prein.getGroupId(); - } else if (rein instanceof NaturalReinforcement) { - type = invNatures.get(ReinforcementNature.NATURAL_REINFORCEMENT); - } else if (rein instanceof MultiBlockReinforcement) { - type = invNatures.get(ReinforcementNature.MULTIBLOCK_REINFORCEMENT); - logger.log(Level.WARNING, "A Multiblock reinforcement was prepped for insert, but is not currently supported."); - } - - insertRein.setInt(1, x); - insertRein.setInt(2, y); - insertRein.setInt(3, z); - insertRein.setString(4, world); - insertRein.setInt(5, mat.getId()); - insertRein.setInt(6, dur); - insertRein.setBoolean(7, insecure); - insertRein.setInt(8, maturationTime); - insertRein.setInt(9, acidTime); - insertRein.setInt(10, type); - insertRein.setString(11, lore); - insertRein.setInt(12, groupId); - insertRein.setInt(13, cx); - insertRein.setInt(14, cz); - return insertRein; + }, "create table reinforcement_worlds (id int not null autoincrement, uuid char(36) not null unique, name text not null);", + "create table reinforcements (id int not null auto_increment, x int not null, y int not null, z int not null, " + + "chunk_x int not null, chunk_z int not null, world_id int not null references reinforcement_worlds(id), " + + "type_id int not null, creation_time timestamp not null default now(), health double not null, " + + "group_id int not null, insecure boolean not null default false, index reinChunkLookUp(chunk_x, chunk_z, world_id)," + + "constraint reinforcementUniqueLocation unique (x,y,z,world_id));"); } - /** - * Use this to insert a set of Player reinforcements all at once. Note that this automatically fails over to single-insertions if the batch fails in any way. - * - * @param reins - */ - public void insertManyReinforcements(Collection reins) { - if (reins == null || reins.size() == 0) return; - boolean failover = false; - try (Connection connection = db.getConnection(); - PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { - int count = 0; - for (Reinforcement rein : reins) { - this.prepInsertRein(rein, insertRein).addBatch(); - count++; - if (count % 100 == 0) { - int[] done = insertRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch insert of Player reinforcements -- 100 attempted -- appears to have failed."); - failover = true; - break; - } else if (done.length == 100){ - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- 100 attempted"); - } else { - failover = true; - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- 100 attempted -- outcome indeterminate"); - break; + public ChunkCache loadReinforcements(ChunkPair coords, int worldID) { + List reinforcements = new ArrayList<>(); + World world = null; + try (Connection loadConn = db.getConnection(); + PreparedStatement loadRein = loadConn.prepareStatement( + "select x, y, z, type_id, creation_time, health, group_id, insecure from reinforcements " + + "where chunk_x = ? and chunk_z = ? and world_id = ?;")) { + loadRein.setInt(1, coords.getX()); + loadRein.setInt(2, coords.getZ()); + loadRein.setInt(3, worldID); + try (ResultSet rs = loadRein.executeQuery()) { + while (rs.next()) { + int x = rs.getInt(1); + int y = rs.getInt(2); + int z = rs.getInt(3); + int typeId = rs.getInt(4); + long millisCreation = rs.getTimestamp(5).getTime(); + double health = rs.getDouble(6); + int groupId = rs.getInt(7); + boolean insecure = rs.getBoolean(8); + ReinforcementType type = typeMan.getById(typeId); + Location loc = new Location(world, x, y, z); + if (type == null) { + logger.warning("Ignoring reinforcement at " + loc.toString() + " because of invalid type id " + + typeId); + continue; } - } - } - if (count % 100 != 0) { - int[] done = insertRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch insert of Player reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); - failover = true; - } else if (done.length == (count % 100)){ - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted", (count % 100)); - } else { - failover = true; - logger.log(Level.INFO, "Inserted a batch of Player reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + reinforcements + .add(new Reinforcement(loc, type, groupId, millisCreation, health, false, false, insecure)); } } } catch (SQLException e) { - failover = true; - logger.log(Level.SEVERE, "Citadel encountered a critical error while inserting a batch of reinforcements", e); - } - - if (failover) { - logger.log(Level.WARNING, "Citadel encountered uncertainty while inserting a batch of records. Failing over to individual insertion logic."); - for (Reinforcement rein : reins) { - insertReinforcement(rein, true); - } + logger.severe("Failed to load reinforcements: " + e.toString()); } + return new ChunkCache(coords, reinforcements, worldID); } - public void insertReinforcement(Reinforcement rein, boolean retry){ - if (rein == null){ - logger.log(Level.WARNING, "CitadelReinforcementData insertReinforcement called with null"); + public void saveReinforcements(ChunkCache cache) { + if (!cache.isDirty()) { return; } - - try (Connection connection = db.getConnection(); - PreparedStatement insertRein = connection.prepareStatement(CitadelReinforcementData.addRein);) { - if (this.prepInsertRein(rein, insertRein).executeUpdate() != 1) { - logger.log(Level.WARNING, "Reinforcement insert at {0} failed!", rein.getLocation()); - throw new SQLException("Reinforcement index collision"); - } - } catch (SQLException e) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Citadel has detected a reinforcement that should not be there. Deleting it " - + (retry ? "and trying again. " : "") + "Including the stack in case it is useful.", e); - // Let's delete the reinforcement; if a user is able to place one then the db is out of synch / messed up some how. - deleteReinforcement(rein); - // Now lets try again. - if (retry) { - insertReinforcement(rein, false); - } - } - } - - /** - * Delete a bunch of reinforcements in a batch. - * @param reins - */ - public void deleteManyReinforcements(Collection reins) { - if (reins == null || reins.size() == 0) return; - boolean failover = false; - try (Connection connection = db.getConnection(); - PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { - int count = 0; - for (Reinforcement rein : reins) { - Location loc = rein.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - - removeRein.setInt(1, x); - removeRein.setInt(2, y); - removeRein.setInt(3, z); - removeRein.setString(4, world); - - removeRein.addBatch(); - count++; - if (count % 100 == 0) { - int[] done = removeRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch removal of Reinforcements -- 100 attempted -- appears to have failed."); - failover = true; - } else if (done.length == 100){ - logger.log(Level.INFO, "Removed a batch of Reinforcements -- 100 attempted"); - } else { - failover = true; - logger.log(Level.INFO, "Removed a batch of Reinforcements -- 100 attempted -- outcome indeterminate"); - } + try (Connection conn = db.getConnection()) { + PreparedStatement insertStatement = conn + .prepareStatement("insert into reinforcements (x,y,z,chunk_x,chunk_z,world_id,type_id," + + "health,group_id,insecure) values(?,?,?,?,?,?,?,?,?,?);"); + PreparedStatement deleteStatement = conn + .prepareStatement("delete from reinforcements where x = ? and y = ? and z = ? and world_id = ?;"); + PreparedStatement updateStatement = conn.prepareStatement("update reinforcements " + + "set insecure = ?, health=? where x = ? and y = ? and z = ? and world_id = ?;"); + for (Reinforcement rein : cache.getAll()) { + if (!rein.isDirty()) { + continue; } - } - - if (count % 100 != 0) { - int[] done = removeRein.executeBatch(); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch removal of Reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); - failover = true; - } else if (done.length == (count % 100)){ - logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted", (count % 100)); + if (rein.isNew()) { + if (!rein.isBroken()) { + insertNewReinforcement(cache, rein, insertStatement); + } } else { - failover = true; - logger.log(Level.INFO, "Removed a batch of Reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); + if (rein.isBroken()) { + deleteReinforcement(cache, rein, deleteStatement); + } else { + updateReinforcement(cache, rein, updateStatement); + } } + rein.setDirty(false); } + //deletes before inserts in case a reinforcement was destroyed and then recreated + deleteStatement.executeBatch(); + insertStatement.executeBatch(); + updateStatement.executeBatch(); + cache.setDirty(false); } catch (SQLException e) { - failover = true; - logger.log(Level.SEVERE, "Citadel encountered a critical error while removing a batch of reinforcements", e); - } - - if (failover) { - logger.log(Level.WARNING, "Citadel encountered uncertainty while deleting a batch of records. Failing over to individual deleting logic."); - for (Reinforcement rein : reins) { - deleteReinforcement(rein); - } + logger.severe("Failed to update reinforcement data: " + e.toString()); } } - /** - * Deletes a Reinforcement from the database. Should only be called within SaveManager - * - * @param The Reinforcement to delete. - */ - public void deleteReinforcement(Reinforcement rein){ - if (rein == null){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "CitadelReinforcementData deleteReinforcement called with null"); - return; - } - Location loc = rein.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - try (Connection connection = db.getConnection(); - PreparedStatement removeRein = connection.prepareStatement(CitadelReinforcementData.removeRein);) { - removeRein.setInt(1, x); - removeRein.setInt(2, y); - removeRein.setInt(3, z); - removeRein.setString(4, world); - if (removeRein.executeUpdate() != 1) { - logger.log(Level.SEVERE, "No reinforcement deleted at {0}", loc); - } - } catch (SQLException e) { - logger.log(Level.SEVERE, "Citadel has failed to delete a reinforcement at "+ loc, e); - } + private void insertNewReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement insertStatement) + throws SQLException { + insertStatement.setInt(1, rein.getLocation().getBlockX()); + insertStatement.setInt(2, rein.getLocation().getBlockY()); + insertStatement.setInt(3, rein.getLocation().getBlockZ()); + insertStatement.setInt(4, cache.getChunkPair().getX()); + insertStatement.setInt(5, cache.getChunkPair().getZ()); + insertStatement.setInt(6, cache.getWorldID()); + insertStatement.setInt(7, rein.getType().getID()); + insertStatement.setDouble(8, rein.getHealth()); + insertStatement.setInt(9, rein.getGroupId()); + insertStatement.setBoolean(10, rein.isInsecure()); + insertStatement.addBatch(); } - private PreparedStatement prepSaveReinforcement(Reinforcement rein, PreparedStatement updateRein) throws SQLException { - // Shared - int dur = rein.getDurability(); - int mature = rein.getMaturationTime(); - int acid = rein.getAcidTime(); - Location loc = rein.getLocation(); - int x = loc.getBlockX(); - int y = loc.getBlockY(); - int z = loc.getBlockZ(); - String world = loc.getWorld().getName(); - - // Uniques Prepped - boolean insecure = false; - int groupId = -1; - - if (rein instanceof PlayerReinforcement){ - PlayerReinforcement pRein = (PlayerReinforcement) rein; - insecure = pRein.isInsecure(); - Group g = pRein.getGroup(); - if (g == null) { - logger.log(Level.WARNING, "Player prepSaveReinforcement at {0} lacks a valid group (lookup failed)", loc); - } else { - groupId = g.getGroupId(); - } - } - - updateRein.setInt(1, dur); - updateRein.setBoolean(2, insecure); - updateRein.setInt(3, groupId); - updateRein.setInt(4, mature); - updateRein.setInt(5, acid); - updateRein.setInt(6, x); - updateRein.setInt(7, y); - updateRein.setInt(8, z); - updateRein.setString(9, world); - - return updateRein; + private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement updateStatement) + throws SQLException { + updateStatement.setBoolean(1, rein.isInsecure()); + updateStatement.setDouble(2, rein.getHealth()); + updateStatement.setInt(3, rein.getLocation().getBlockX()); + updateStatement.setInt(4, rein.getLocation().getBlockY()); + updateStatement.setInt(5, rein.getLocation().getBlockZ()); + updateStatement.setInt(6, cache.getWorldID()); + updateStatement.addBatch(); } - /** - * Save many reinforcements all at once! - * - * @param reins - */ - public void saveManyReinforcements(Collection reins) { - if (reins == null || reins.size() == 0) return; - boolean failover = false; - StringBuilder sb = new StringBuilder(); - long s = System.currentTimeMillis(); - long t = 0; - try (Connection connection = db.getConnection(); - PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - int count = 0; - t = System.currentTimeMillis(); - sb.append(t - s).append("ms setup "); - for (Reinforcement rein : reins) { - s = System.currentTimeMillis(); - this.prepSaveReinforcement(rein, updateRein).addBatch(); - t = System.currentTimeMillis(); - sb.append(t - s).append(" "); - count++; - if (count % 100 == 0) { - s = System.currentTimeMillis(); - int[] done = updateRein.executeBatch(); - t = System.currentTimeMillis(); - sb.append(t - s).append(" batch "); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch save of Reinforcements -- 100 attempted -- appears to have failed."); - failover = true; - } else if (done.length == 100){ - logger.log(Level.INFO, "Saved a batch of Reinforcements -- 100 attempted"); - } else { - failover = true; - logger.log(Level.INFO, "Saved a batch of Reinforcements -- 100 attempted -- outcome indeterminate"); - } - } - } - - if (count % 100 != 0) { - s = System.currentTimeMillis(); - int[] done = updateRein.executeBatch(); - t = System.currentTimeMillis(); - sb.append(t - s).append(" batch "); - if (done == null || done.length == 0) { - logger.log(Level.WARNING, "Batch save of reinforcements -- {0} attempted -- appears to have failed.", (count % 100)); - failover = true; - } else if (done.length == (count % 100)){ - logger.log(Level.INFO, "Saved a batch of reinforcements -- {0} attempted", (count % 100)); - } else { - failover = true; - logger.log(Level.INFO, "Saved a batch of reinforcements -- {0} attempted -- outcome indeterminate", (count % 100)); - } - } - } catch (SQLException e) { - failover = true; - logger.log(Level.SEVERE, "Citadel encountered a critical error while saving a batch of reinforcements", e); - } - - logger.log(Level.INFO, sb.toString()); - if (failover) { - logger.log(Level.WARNING, "Citadel encountered uncertainty while saving a batch of records. Failing over to individual save logic."); - for (Reinforcement rein : reins) { - saveReinforcement(rein); - } - } + private void deleteReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement deleteStatement) + throws SQLException { + deleteStatement.setInt(1, rein.getLocation().getBlockX()); + deleteStatement.setInt(2, rein.getLocation().getBlockY()); + deleteStatement.setInt(3, rein.getLocation().getBlockZ()); + deleteStatement.setInt(4, cache.getWorldID()); + deleteStatement.addBatch(); } - /** - * Saves the Reinforcement to the Database. Should only be called from SaveManager. - * @param The Reinforcement to save. - */ - public void saveReinforcement(Reinforcement rein){ - if (rein == null){ - logger.log(Level.WARNING, "CitadelReinforcementData saveReinforcement called with null"); - return; - } - try (Connection connection = db.getConnection(); - PreparedStatement updateRein = connection.prepareStatement(CitadelReinforcementData.updateRein);) { - - if (this.prepSaveReinforcement(rein, updateRein).executeUpdate() != 1) { - logger.log(Level.WARNING, "Update did not alter any records for save at {0}", rein.getLocation()); + public int getOrCreateWorldID(World world) { + try (Connection insertConn = db.getConnection(); + PreparedStatement insertWorld = insertConn + .prepareStatement("select id from reinforcement_worlds where uuid = ?;")) { + insertWorld.setString(1, world.getUID().toString()); + try (ResultSet rs = insertWorld.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } } } catch (SQLException e) { - logger.log(Level.WARNING, - "Failed to save an update to reinforcement at {0}", rein.getLocation()); - logger.log(Level.SEVERE, "The Exception on saving a reinforcement:", e); + logger.severe("Failed to check for existence of world in db: " + e.toString()); + return -1; } - } - - public int getReinCountForGroup(String group){ - if (group == null){ - logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called with null"); - return 0; - } - - Group gg = GroupManager.getGroup(group); - if (gg == null) { - logger.log(Level.WARNING, "CitadelReinforcementData getReinCountForGroup called for {0} which does not exist", group); - return 0; - } - StringBuilder allIDs = new StringBuilder(); - for (Integer id : gg.getGroupIds()) { - allIDs.append(id).append(","); - } - allIDs.append(gg.getGroupId()); - - String finalIDs = allIDs.toString(); - - try (Connection connection = db.getConnection(); - PreparedStatement selectReinCountForGroup = connection.prepareStatement(CitadelReinforcementData.selectReinCountForGroup);) { - selectReinCountForGroup.setString(1, finalIDs); - try (ResultSet set = selectReinCountForGroup.executeQuery();) { - if (!set.next()) { - throw new SQLException("Failed Count"); + try (Connection insertConn = db.getConnection(); + PreparedStatement insertWorld = insertConn.prepareStatement( + "insert into reinforcement_worlds (uuid, name) values(?,?);", + Statement.RETURN_GENERATED_KEYS);) { + insertWorld.setString(1, world.getUID().toString()); + insertWorld.setString(2, world.getName()); + try (ResultSet rs = insertWorld.executeQuery()) { + if (!rs.next()) { + logger.info("Failed to insert world"); + return -1; } - return set.getInt(1); + return rs.getInt(1); } } catch (SQLException e) { - logger.log(Level.SEVERE, "getReinCountForGroup has failed for " + group, e); + logger.severe("Failed to insert world into db: " + e.toString()); + return -1; } - return 0; } - public int getReinCountForAllGroups(){ - try (Connection connection = db.getConnection(); - PreparedStatement selectReinCount = connection.prepareStatement(CitadelReinforcementData.selectReinCount); - ResultSet set = selectReinCount.executeQuery();) { - if (!set.next()) { - throw new SQLException("Failed Count"); - } - return set.getInt(1); - } catch (SQLException e) { - logger.log(Level.SEVERE, "getReinCountForAllGroups has failed", e); - } - return 0; - } } diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 5caa040b..bbc69b3d 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -9,8 +9,8 @@ import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.timeUntilMature; import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; +import static vg.civcraft.mc.citadel.Utility.timeUntilMature; import static vg.civcraft.mc.citadel.Utility.wouldPlantDoubleReinforce; import java.util.Arrays; @@ -50,8 +50,10 @@ import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; +import vg.civcraft.mc.citadel.CitadelWorldManager; +import vg.civcraft.mc.citadel.OldCitadelConfigManager; import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; @@ -68,166 +70,68 @@ public class BlockListener implements Listener { - public static final List all_sides = Arrays.asList(BlockFace.UP, - BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, - BlockFace.EAST); - - public static final List planar_sides = Arrays.asList( - BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - - private ReinforcementManager rm = Citadel.getReinforcementManager(); + public static final List all_sides = Arrays.asList(BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, + BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - //Stop comparators from being placed unless the reinforcement is insecure - @EventHandler(priority = EventPriority.HIGH,ignoreCancelled = true) - public void comparatorPlaceCheck(BlockPlaceEvent event) - { - //We only care if they are placing a comparator - if(event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) return; + public static final List planar_sides = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, + BlockFace.EAST); - Comparator comparator = (Comparator)event.getBlockPlaced().getState().getData(); - Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); - //We only care if the comparator is going placed against something with an inventory - if(block.getState() instanceof InventoryHolder) { - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - if (rein != null && rein instanceof PlayerReinforcement) { - PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; - if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure - Player player = event.getPlayer(); - if (player != null) { - if (playerReinforcement.canAccessChests(player)) { - return; // We also allow players to place against chests they can access - } - Utility.sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); - } - event.setCancelled(true); - } - } + // Stop comparators from being placed unless the reinforcement is insecure + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void comparatorPlaceCheck(BlockPlaceEvent event) { + // We only care if they are placing a comparator + if (event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) { return; } - - // So apparently read-through state can pass through an intermediary block, so lets check that too. - block = block.getRelative(comparator.getFacing().getOppositeFace()); - if(block.getState() instanceof InventoryHolder) { - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - if (rein != null && rein instanceof PlayerReinforcement) { - PlayerReinforcement playerReinforcement = (PlayerReinforcement) rein; - if (!playerReinforcement.isInsecure()) { //Only let them place against /ctinsecure - Player player = event.getPlayer(); - if (player != null) { - if (playerReinforcement.canAccessChests(player)) { - return; // We also allow players to place against chests they can access - } - Utility.sendAndLog(player, ChatColor.RED, "You cannot place that next to a container you do not own."); - } - event.setCancelled(true); - } - } - } - - } - - @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - public void onFortificationMode(BlockPlaceEvent event){ - Player p = event.getPlayer(); - Block b = event.getBlock(); - GroupManager gm = NameAPI.getGroupManager(); - Location loc = b.getLocation(); - Inventory inv = p.getInventory(); - Reinforcement rein = rm.getReinforcement(b.getLocation()); - if (Material.AIR.equals(event.getBlockReplacedState().getType())) { - if (rein != null && rein instanceof PlayerReinforcement){ - //Would be nice to find a more performant way to detect the entity w/o checking every entity. - for (Entity e : loc.getChunk().getEntities()){ - if (e instanceof Hanging){ - Location eloc = e.getLocation().getBlock().getLocation(); - if (eloc.getBlockX() == loc.getBlockX() && eloc.getBlockY() == loc.getBlockY() - && eloc.getBlockZ() == loc.getBlockZ()){ - event.setCancelled(true); - return; - } - } - } - - rm.deleteReinforcement(rein); - } - ItemStack stack = event.getItemInHand(); - rein = isDroppedReinforcementBlock(p, stack, loc); - if (rein != null){ - rm.saveInitialReinforcement(rein); - return; - } + Comparator comparator = (Comparator) event.getBlockPlaced().getState().getData(); + Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); + // Check if the comparator is placed against something with an inventory + if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), block)) { + event.setCancelled(true); + Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + return; } - PlayerState state = PlayerState.get(p); - ReinforcementType type = null; - Group groupToReinforceTo = null; - if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - type = state.getReinforcementType(); - if (type == null) { - Utility.sendAndLog(p, ChatColor.RED, "Something went wrong, you dont seem to have a reinforcement material selected?"); - state.reset(); + // Comparators can also read through a single opaque block + if (block.getType().isOccluding()) { + if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), + block.getRelative(comparator.getFacing().getOppositeFace()))) { event.setCancelled(true); + Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); return; } - groupToReinforceTo = state.getGroup(); - }else if(state.getMode() == ReinforcementMode.NORMAL) { - if (!state.getEasyMode()) { - return; - } - type = ReinforcementType.getReinforcementType(p.getInventory().getItemInOffHand()); - if (type == null) { - return; - } - String gName = gm.getDefaultGroup(p.getUniqueId()); - if (gName != null) { - groupToReinforceTo = GroupManager.getGroup(gName); - } - if (groupToReinforceTo == null) { - return; - } - } - else { - return; } - - if (!canPlace(b, p)){ - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); - event.setCancelled(true); + } + + //remove reinforced air + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void removeReinforcedAir(BlockPlaceEvent e) { + if (e.getBlockReplacedState().getType() != Material.AIR) { return; } - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(b)) { - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); - event.setCancelled(true); - return; - } - // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!type.canBeReinforced(b.getType())) { - Utility.sendAndLog(p, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); - event.setCancelled(true); - return; - } - int required = type.getRequiredAmount(); - if (type.getItemStack().isSimilar(event.getItemInHand())){ - required++; - } - if (inv.containsAtLeast(type.getItemStack(), required)) { - try { - if (createPlayerReinforcement(p, groupToReinforceTo, b, type, event.getItemInHand()) == null) { - Utility.sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); - } else { - state.checkResetMode(); + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); + rein.setHealth(-1); + } + + //prevent players from upgrading a chest into a double chest to bypass the single chests reinforcement + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void preventBypassChestAccess(BlockPlaceEvent e) { + Material mat = e.getBlock().getType(); + if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { + return; + } + for(BlockFace face : planar_sides) { + Block rel = e.getBlock().getRelative(face); + if (rel != null && rel.getType() == mat) { + if (ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { + e.setCancelled(true); + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + break; } - } catch(ReinforcemnetFortificationCancelException ex){ - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); } - } else { - if (state.getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION) { - Utility.sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", - state.getReinforcementType().getMaterial().name())); - state.reset(); - event.setCancelled(true); - } - } + } } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) @@ -250,8 +154,7 @@ public void blockBreakEvent(BlockBreakEvent event) { if (rein == null) { rein = createNaturalReinforcement(event.getBlock(), player); if (rein != null) { - ReinforcementDamageEvent e = new ReinforcementDamageEvent(rein, - player, block); + ReinforcementDamageEvent e = new ReinforcementDamageEvent(rein, player, block); Bukkit.getPluginManager().callEvent(e); if (e.isCancelled()) { event.setCancelled(true); @@ -268,26 +171,21 @@ public void blockBreakEvent(BlockBreakEvent event) { if (rein instanceof PlayerReinforcement) { PlayerReinforcement pr = (PlayerReinforcement) rein; PlayerState state = PlayerState.get(player); - boolean admin_bypass = player - .hasPermission("citadel.admin.bypassmode"); - if (reinforcingBlock != null && isPlant(block) - && (pr.canAccessCrops(player) || admin_bypass)) { + boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); + if (reinforcingBlock != null && isPlant(block) && (pr.canAccessCrops(player) || admin_bypass)) { // player has CROPS access to the soil block, allow them to // break without affecting reinforcement is_cancelled = false; - } else if (state.isBypassMode() - && (pr.canBypass(player) || admin_bypass) + } else if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) && !pr.getGroup().isDisciplined()) { if (admin_bypass) { /* - * Citadel.verbose( VerboseMsg.AdminReinBypass, - * player.getDisplayName(), + * Citadel.verbose( VerboseMsg.AdminReinBypass, player.getDisplayName(), * pr.getBlock().getLocation().toString()); */ } else { /* - * Citadel.verbose( VerboseMsg.ReinBypass, - * player.getDisplayName(), + * Citadel.verbose( VerboseMsg.ReinBypass, player.getDisplayName(), * pr.getBlock().getLocation().toString()); */ } @@ -296,8 +194,7 @@ public void blockBreakEvent(BlockBreakEvent event) { if (!state.isBypassMode() && pr.canBypass(player)) { player.sendMessage(ChatColor.RED + "Enable bypass mode with \"/ctb\" to break this reinforcement"); } - ReinforcementDamageEvent dre = new ReinforcementDamageEvent( - rein, player, block); + ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); Bukkit.getPluginManager().callEvent(dre); @@ -312,8 +209,7 @@ public void blockBreakEvent(BlockBreakEvent event) { is_cancelled = createNaturalReinforcement(block, player) != null; } } else { - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, - player, block); + ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); Bukkit.getPluginManager().callEvent(dre); @@ -334,9 +230,7 @@ public void blockBreakEvent(BlockBreakEvent event) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void pistonExtend(BlockPistonExtendEvent bpee) { for (Block block : bpee.getBlocks()) { - Block realBlock = Utility.getRealBlock(block); - Reinforcement reinforcement = rm.getReinforcement(realBlock - .getLocation()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); if (reinforcement != null) { bpee.setCancelled(true); break; @@ -347,9 +241,7 @@ public void pistonExtend(BlockPistonExtendEvent bpee) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void pistonRetract(BlockPistonRetractEvent bpre) { for (Block block : bpre.getBlocks()) { - Block realBlock = Utility.getRealBlock(block); - Reinforcement reinforcement = rm.getReinforcement(realBlock - .getLocation()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); if (reinforcement != null) { bpre.setCancelled(true); break; @@ -369,7 +261,7 @@ public void blockBurn(BlockBurnEvent bbe) { if (block.getRelative(0, 1, 0).getType() == matfire) { block.getRelative(0, 1, 0).setType(Material.AIR); } // Essential - // Extended fire protection (recommend) + // Extended fire protection (recommend) if (block.getRelative(1, 0, 0).getType() == matfire) { block.getRelative(1, 0, 0).setType(Material.AIR); } @@ -385,27 +277,6 @@ public void blockBurn(BlockBurnEvent bbe) { if (block.getRelative(0, 0, -1).getType() == matfire) { block.getRelative(0, 0, -1).setType(Material.AIR); } - // Aggressive fire protection (would seriously reduce effectiveness - // of flint down to near the "you'd have to use it 25 times" - // mentality) - /* - * if (block.getRelative(1,1,0).getType() == matfire) - * {block.getRelative(1,1,0).setTypeId(0);} if - * (block.getRelative(1,-1,0).getType() == matfire) - * {block.getRelative(1,-1,0).setTypeId(0);} if - * (block.getRelative(-1,1,0).getType() == matfire) - * {block.getRelative(-1,1,0).setTypeId(0);} if - * (block.getRelative(-1,-1,0).getType() == matfire) - * {block.getRelative(-1,-1,0).setTypeId(0);} if - * (block.getRelative(0,1,1).getType() == matfire) - * {block.getRelative(0,1,1).setTypeId(0);} if - * (block.getRelative(0,-1,1).getType() == matfire) - * {block.getRelative(0,-1,1).setTypeId(0);} if - * (block.getRelative(0,1,-1).getType() == matfire) - * {block.getRelative(0,1,-1).setTypeId(0);} if - * (block.getRelative(0,-1,-1).getType() == matfire) - * {block.getRelative(0,-1,-1).setTypeId(0);} - */ } } @@ -445,26 +316,20 @@ public void redstonePower(BlockRedstoneEvent bre) { if (openable.isOpen()) { return; } - Reinforcement generic_reinforcement = Citadel - .getReinforcementManager().getReinforcement(block); - if (generic_reinforcement == null - || !(generic_reinforcement instanceof PlayerReinforcement)) { + Reinforcement generic_reinforcement = Citadel.getReinforcementManager().getReinforcement(block); + if (generic_reinforcement == null || !(generic_reinforcement instanceof PlayerReinforcement)) { return; } PlayerReinforcement reinforcement = (PlayerReinforcement) generic_reinforcement; - double redstoneDistance = CitadelConfigManager - .getMaxRedstoneDistance(); + double redstoneDistance = OldCitadelConfigManager.getMaxRedstoneDistance(); if (!isAuthorizedPlayerNear(reinforcement, redstoneDistance)) { // Citadel.Log( // reinforcement.getLocation().toString()); bre.setNewCurrent(bre.getOldCurrent()); } } catch (Exception e) { - Citadel.getInstance() - .getLogger() - .log(Level.WARNING, - "Exception occured in BlockListener, BlockRedstoneEvent ", - e); + Citadel.getInstance().getLogger().log(Level.WARNING, + "Exception occured in BlockListener, BlockRedstoneEvent ", e); } } @@ -483,37 +348,29 @@ public void interact(PlayerInteractEvent pie) { } Action action = pie.getAction(); - boolean access_reinforcement = action == Action.RIGHT_CLICK_BLOCK - && reinforcement != null && reinforcement.isSecurable(); + boolean access_reinforcement = action == Action.RIGHT_CLICK_BLOCK && reinforcement != null + && reinforcement.isSecurable(); boolean normal_access_denied = reinforcement != null - && ((reinforcement.isDoor() && !reinforcement - .canAccessDoors(player)) || (reinforcement - .isContainer() && !reinforcement - .canAccessChests(player))); + && ((reinforcement.isDoor() && !reinforcement.canAccessDoors(player)) + || (reinforcement.isContainer() && !reinforcement.canAccessChests(player))); boolean admin_can_access = player.hasPermission("citadel.admin"); - if (access_reinforcement && normal_access_denied - && !admin_can_access) { + if (access_reinforcement && normal_access_denied && !admin_can_access) { /* - * Citadel.verbose( VerboseMsg.ReinLocked, - * player.getDisplayName(), block.getLocation().toString()); + * Citadel.verbose( VerboseMsg.ReinLocked, player.getDisplayName(), + * block.getLocation().toString()); */ - //Prevents double broadcasts - if(pie.getHand() == EquipmentSlot.HAND) { - pie.getPlayer().sendMessage( - ChatColor.RED - + String.format("%s is locked", block.getType() - .name())); + // Prevents double broadcasts + if (pie.getHand() == EquipmentSlot.HAND) { + pie.getPlayer().sendMessage(ChatColor.RED + String.format("%s is locked", block.getType().name())); } pie.setCancelled(true); } // Not really sure what this is for. Should come up in testing. /* - * else if (action == Action.PHYSICAL) { AccessDelegate - * aboveDelegate = + * else if (action == Action.PHYSICAL) { AccessDelegate aboveDelegate = * AccessDelegate.getDelegate(block.getRelative(BlockFace.UP)); if - * (aboveDelegate instanceof CropAccessDelegate && - * aboveDelegate.isReinforced()) { Citadel.verbose( - * VerboseMsg.CropTrample, block.getLocation().toString()); + * (aboveDelegate instanceof CropAccessDelegate && aboveDelegate.isReinforced()) + * { Citadel.verbose( VerboseMsg.CropTrample, block.getLocation().toString()); * pie.setCancelled(true); } } */ if (pie.isCancelled() || pie.getHand() != EquipmentSlot.HAND) @@ -529,21 +386,23 @@ public void interact(PlayerInteractEvent pie) { } if (pie.getAction() == Action.LEFT_CLICK_BLOCK && generic_reinforcement == null) { ItemStack stack = player.getInventory().getItemInMainHand(); - ReinforcementType type = ReinforcementType - .getReinforcementType(stack); + ReinforcementType type = ReinforcementType.getReinforcementType(stack); if (type != null) { - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(block)) { - Utility.sendAndLog(player, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); - return; - } - // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); - return; - } - if (!canPlace(block, player)){ - Utility.sendAndLog(player, ChatColor.RED, "Cancelled interact easymode rein, mismatched reinforcement."); + // Don't allow double reinforcing reinforceable plants + if (wouldPlantDoubleReinforce(block)) { + Utility.sendAndLog(player, ChatColor.RED, + "Cancelled block place, crop would already be reinforced."); + return; + } + // Don't allow incorrect reinforcement with exclusive reinforcement types + if (!type.canBeReinforced(block.getType())) { + Utility.sendAndLog(player, ChatColor.RED, + "That material cannot reinforce that type of block. Try a different reinforcement material."); + return; + } + if (!canPlace(block, player)) { + Utility.sendAndLog(player, ChatColor.RED, + "Cancelled interact easymode rein, mismatched reinforcement."); return; } @@ -553,10 +412,12 @@ public void interact(PlayerInteractEvent pie) { g = GroupManager.getGroup(gName); } if (g != null) { - if (createPlayerReinforcement(player, g, block, type, null) == null && CitadelConfigManager.shouldLogReinforcement()) { + if (createPlayerReinforcement(player, g, block, type, null) == null + && OldCitadelConfigManager.shouldLogReinforcement()) { // someone else's job to tell the player what went wrong, but let's do log it. - Citadel.getInstance().getLogger().log(Level.INFO, "Create Reinforcement by {0} at {1} cancelled by plugin", - new Object[] {player.getName(), block.getLocation()}); + Citadel.getInstance().getLogger().log(Level.INFO, + "Create Reinforcement by {0} at {1} cancelled by plugin", + new Object[] { player.getName(), block.getLocation() }); } } } @@ -566,90 +427,7 @@ public void interact(PlayerInteractEvent pie) { return; case REINFORCEMENT_INFORMATION: // did player click on a reinforced block? - if (reinforcement != null) { - String reinforcementStatus = reinforcement.getStatus(); - String ageStatus = reinforcement.getAgeStatus(); - Group group = reinforcement.getGroup(); - StringBuilder sb; - Location blockLoc = reinforcement.getLocation(); - String blockName = reinforcement.getLocation().getBlock().getType().toString(); - String hoverMessage = String.format( - "Block: %s\nLocation: [%s %d %d %d]", - blockName, blockLoc.getWorld().getName(), (int)blockLoc.getX(), (int)blockLoc.getY(), (int)blockLoc.getZ()); - if (player.hasPermission("citadel.admin.ctinfodetails")) { - Utility.sendAndLog(player, ChatColor.GREEN, String.format( - "Loc[%s]", reinforcement.getLocation() - .toString())); - String groupName = "!NULL!"; - if (group != null) { - groupName = String.format("[%s]", group.getName()); - } - sb = new StringBuilder(); - sb.append(String.format( - " Group%s Durability[%d/%d]", - groupName, - reinforcement.getDurability(), - ReinforcementType.getReinforcementType( - reinforcement.getStackRepresentation()) - .getHitPoints())); - int maturationTime = timeUntilMature(reinforcement); - if (maturationTime != 0) { - sb.append(" Immature["); - sb.append(maturationTime); - sb.append("]"); - } - int acidTime = timeUntilAcidMature(reinforcement); - if (CitadelConfigManager.getAcidBlock() == block - .getType()) { - sb.append(" Acid "); - if (acidTime != 0) { - sb.append("Immature["); - sb.append(acidTime); - sb.append("]"); - } else { - sb.append("Mature"); - } - } - if (reinforcement.isInsecure()) { - sb.append(" (Insecure)"); - } - if (group.isDisciplined()) { - sb.append(" (Disciplined)"); - } - sb.append("\nGroup id: " + reinforcement.getGroupId()); - - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); - } else if (reinforcement.canViewInformation(player)) { - sb = new StringBuilder(); - boolean immature = timeUntilMature(reinforcement) != 0 - && CitadelConfigManager.isMaturationEnabled(); - boolean acid = timeUntilAcidMature(reinforcement) != 0 - && CitadelConfigManager.getAcidBlock() == block - .getType(); - String groupName = "!NULL!"; - if (group != null) { - groupName = group.getName(); - } - sb.append(String.format("%s, %s, group: %s", - reinforcementStatus, ageStatus, groupName)); - if (immature) { - sb.append(" (Hardening)"); - } - if (acid) { - sb.append(" (Acid Maturing)"); - } - if (reinforcement.isInsecure()) { - sb.append(" (Insecure)"); - } - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString(), hoverMessage); - } else { - Utility.sendAndLog(player, ChatColor.RED, - reinforcementStatus + ", " + ageStatus, hoverMessage); - } - if (player.getGameMode() == GameMode.CREATIVE) { - pie.setCancelled(true); - } - } +//REMOVED break; case INSECURE: @@ -659,13 +437,11 @@ public void interact(PlayerInteractEvent pie) { if (reinforcement.canMakeInsecure(player)) { reinforcement.toggleInsecure(); // Save the change - /*Citadel.getReinforcementManager().saveReinforcement(reinforcement);*/ + /* Citadel.getReinforcementManager().saveReinforcement(reinforcement); */ if (reinforcement.isInsecure()) { - Utility.sendAndLog(player, ChatColor.YELLOW, - "Reinforcement now insecure"); + Utility.sendAndLog(player, ChatColor.YELLOW, "Reinforcement now insecure"); } else { - Utility.sendAndLog(player, ChatColor.GREEN, - "Reinforcement secured"); + Utility.sendAndLog(player, ChatColor.GREEN, "Reinforcement secured"); } } else { Utility.sendAndLog(player, ChatColor.RED, "Access denied"); @@ -679,20 +455,19 @@ public void interact(PlayerInteractEvent pie) { // set the reinforcemet material to what the player is // holding ItemStack stack = player.getInventory().getItemInMainHand(); - ReinforcementType type = ReinforcementType - .getReinforcementType(stack); + ReinforcementType type = ReinforcementType.getReinforcementType(stack); if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, stack.getType() - .name() + " is not a reinforcable material."); Utility.sendAndLog(player, ChatColor.RED, - "Left Reinforcement mode."); + stack.getType().name() + " is not a reinforcable material."); + Utility.sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); state.reset(); return; } // Don't allow incorrect reinforcement with exclusive reinforcement types if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); - Utility.sendAndLog(player, ChatColor.RED,"Left Reinforcement mode."); + Utility.sendAndLog(player, ChatColor.RED, + "That material cannot reinforce that type of block. Try a different reinforcement material."); + Utility.sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); state.reset(); return; } @@ -707,28 +482,26 @@ public void interact(PlayerInteractEvent pie) { Utility.sendAndLog(player, ChatColor.RED, "Cancelled reinforcement, crop would already be reinforced."); } else { - if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), null) == null && - CitadelConfigManager.shouldLogReinforcement()) { + if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), + null) == null && OldCitadelConfigManager.shouldLogReinforcement()) { // someone else's job to tell the player what went wrong, but let's do log it. - Citadel.getInstance().getLogger().log(Level.INFO, "Create Reinforcement by {0} at {1} cancelled by plugin", - new Object[] {player.getName(), block.getLocation()}); + Citadel.getInstance().getLogger().log(Level.INFO, + "Create Reinforcement by {0} at {1} cancelled by plugin", + new Object[] { player.getName(), block.getLocation() }); } } } else if (reinforcement.canBypass(player) - || (player.isOp() || player - .hasPermission("citadel.admin"))) { + || (player.isOp() || player.hasPermission("citadel.admin"))) { String message = ""; Group group = state.getGroup(); Group old_group = reinforcement.getGroup(); if (!old_group.getName().equals(group.getName())) { reinforcement.setGroup(group); - ReinforcementCreationEvent event = new ReinforcementCreationEvent( - reinforcement, block, player); + ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { - //rm.saveReinforcement(reinforcement); - message = "Group has been changed to: " - + group.getName() + "."; + // rm.saveReinforcement(reinforcement); + message = "Group has been changed to: " + group.getName() + "."; Utility.sendAndLog(player, ChatColor.GREEN, message); } else { reinforcement.setGroup(old_group); @@ -737,31 +510,34 @@ public void interact(PlayerInteractEvent pie) { ItemStack stack = player.getInventory().getItemInMainHand(); ReinforcementType type = ReinforcementType.getReinforcementType(stack); if (type != null && !reinforcement.getStackRepresentation().isSimilar(type.getItemStack())) { - //hit with different rein material, so switch material + // hit with different rein material, so switch material if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, "That material cannot reinforce that type of block. Try a different reinforcement material."); - } - else { - ReinforcementChangeTypeEvent e = new ReinforcementChangeTypeEvent(reinforcement, type, player); + Utility.sendAndLog(player, ChatColor.RED, + "That material cannot reinforce that type of block. Try a different reinforcement material."); + } else { + ReinforcementChangeTypeEvent e = new ReinforcementChangeTypeEvent(reinforcement, type, + player); Bukkit.getPluginManager().callEvent(e); if (!e.isCancelled()) { reinforcementBroken(player, reinforcement); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); + ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, + player); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { - if(createPlayerReinforcement(player, state.getGroup(), block, type, null) != null) { + if (createPlayerReinforcement(player, state.getGroup(), block, type, + null) != null) { Utility.sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); - } else if (CitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Change Reinforcement by {0} at {1} cancelled by plugin", - new Object[] {player.getName(), block.getLocation()}); + } else if (OldCitadelConfigManager.shouldLogReinforcement()) { + Citadel.getInstance().getLogger().log(Level.INFO, + "Change Reinforcement by {0} at {1} cancelled by plugin", + new Object[] { player.getName(), block.getLocation() }); } } } } } } else { - Utility.sendAndLog(player, ChatColor.RED, - "You are not permitted to modify this reinforcement"); + Utility.sendAndLog(player, ChatColor.RED, "You are not permitted to modify this reinforcement"); } pie.setCancelled(true); state.checkResetMode(); @@ -770,27 +546,15 @@ public void interact(PlayerInteractEvent pie) { } } catch (Exception e) { - Citadel.getInstance() - .getLogger() - .log(Level.WARNING, - "General Exception during player interaction", e); + Citadel.getInstance().getLogger().log(Level.WARNING, "General Exception during player interaction", e); } } - // TODO: Come back and figure out why this is causing all the data to be - // re-written inplace with no change - /* - * @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) - * public void chunkLoadEvent(ChunkLoadEvent event) { Chunk chunk = - * event.getChunk(); rm.loadReinforcementChunk(chunk); } - */ - @EventHandler(priority = EventPriority.HIGHEST) public void blockPhysEvent(BlockPhysicsEvent event) { Block block = event.getBlock(); if (block.getType().hasGravity()) { - Reinforcement rein = rm.getReinforcement(Utility - .getRealBlock(block)); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); if (rein != null) { event.setCancelled(true); } @@ -801,10 +565,10 @@ public void blockPhysEvent(BlockPhysicsEvent event) { @EventHandler(priority = EventPriority.HIGHEST) public void liquidDumpEvent(PlayerBucketEmptyEvent event) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().equals(Material.AIR) || block.getType().isSolid()) + if (block.getType().equals(Material.AIR) || block.getType().isSolid()) { return; - - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); if (rein != null) { event.setCancelled(true); } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 08938b03..36a288af 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -45,7 +45,7 @@ import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; +import vg.civcraft.mc.citadel.OldCitadelConfigManager; import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; @@ -246,7 +246,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ sb.append("]"); } int acidTime = timeUntilAcidMature(pr); - if (CitadelConfigManager.getAcidBlock() == block.getType()) { + if (OldCitadelConfigManager.getAcidBlock() == block.getType()) { sb.append(" Acid "); if (acidTime != 0) { sb.append("Immature["); @@ -363,7 +363,7 @@ public void run() { } }.runTaskAsynchronously(Citadel.getInstance()); - if (CitadelConfigManager.defaultBypassOn()) { + if (OldCitadelConfigManager.defaultBypassOn()) { PlayerState state = PlayerState.get(p); if (!state.isBypassMode()) { state.toggleBypassMode(); diff --git a/src/vg/civcraft/mc/citadel/listener/GroupsListener.java b/src/vg/civcraft/mc/citadel/listener/GroupsListener.java deleted file mode 100644 index c150f14d..00000000 --- a/src/vg/civcraft/mc/citadel/listener/GroupsListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package vg.civcraft.mc.citadel.listener; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; - -import vg.civcraft.mc.namelayer.events.GroupDeleteEvent; -import vg.civcraft.mc.namelayer.events.GroupMergeEvent; - -public class GroupsListener implements Listener { - @EventHandler(priority = EventPriority.HIGHEST) - public void deleteGroupEvent(GroupDeleteEvent event){ - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void mergeGroupEvent(GroupMergeEvent event){ - } -} diff --git a/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java b/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java deleted file mode 100644 index 8be6ceae..00000000 --- a/src/vg/civcraft/mc/citadel/misc/CitadelStatics.java +++ /dev/null @@ -1,73 +0,0 @@ -package vg.civcraft.mc.citadel.misc; - -import vg.civcraft.mc.citadel.Citadel; - -public enum CitadelStatics { - - UPDATE, - DELETE, - INSERT, - CACHE, - LOAD; - - private static int reins_loaded_from_db = 0; - private static int reins_called_from_cache = 0; - private static int reins_updated_to_db = 0; - private static int reins_deleted_from_db = 0; - private static int reins_insert_to_db = 0; - - /** - * Increments the counter of the db call type. - * @param en - */ - public static void updateHitStat(CitadelStatics en){ - switch(en){ - case UPDATE: - reins_updated_to_db++; - break; - case DELETE: - reins_deleted_from_db++; - break; - case INSERT: - reins_insert_to_db++; - break; - case CACHE: - reins_called_from_cache++; - break; - case LOAD: - reins_loaded_from_db++; - break; - } - } - - public static void decrementHitStat(CitadelStatics en){ - switch(en){ - case UPDATE: - reins_updated_to_db--; - break; - case DELETE: - reins_deleted_from_db--; - break; - case INSERT: - reins_insert_to_db--; - break; - case CACHE: - reins_called_from_cache--; - break; - case LOAD: - reins_loaded_from_db--; - break; - } - } - - public static void displayStatisticsToConsole(){ - StringBuilder stats = new StringBuilder("Citadel Reinforcement Stats:\n"); - stats.append(" Reinforcements loaded from db ").append(reins_loaded_from_db).append(".\n"); - stats.append(" Reinforcements loaded from cache ").append(reins_called_from_cache).append(".\n"); - stats.append(" Total Reinforcement calls ").append(reins_called_from_cache + reins_loaded_from_db).append(".\n"); - stats.append(" Amount of Reinforcement saves ").append(reins_updated_to_db).append(".\n"); - stats.append(" Reinforcements deleted from the db ").append(reins_deleted_from_db).append(".\n"); - stats.append(" Reinforcements created and saved to db ").append(reins_insert_to_db).append(".\n"); - Citadel.getInstance().getLogger().info(stats.toString()); - } -} diff --git a/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java b/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java deleted file mode 100644 index 335d6b1a..00000000 --- a/src/vg/civcraft/mc/citadel/misc/LoadingCacheNullException.java +++ /dev/null @@ -1,14 +0,0 @@ -package vg.civcraft.mc.citadel.misc; - -public class LoadingCacheNullException extends RuntimeException{ - - private static final long serialVersionUID = -1664671367153338518L; - - public LoadingCacheNullException(String message){ - super(message); - } - - public LoadingCacheNullException(){ - super(); - } -} diff --git a/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java b/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java deleted file mode 100644 index 4f7b42da..00000000 --- a/src/vg/civcraft/mc/citadel/misc/ReinforcemnetFortificationCancelException.java +++ /dev/null @@ -1,10 +0,0 @@ -package vg.civcraft.mc.citadel.misc; - -public class ReinforcemnetFortificationCancelException extends RuntimeException{ - - private static final long serialVersionUID = 5122048063360583699L; - - public ReinforcemnetFortificationCancelException(){ - - } -} diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java new file mode 100644 index 00000000..5e50e2b2 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -0,0 +1,65 @@ +package vg.civcraft.mc.citadel.playerstate; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; + +public class FortificationState extends IPlayerState { + + private ReinforcementType type; + + public FortificationState(Player p, ReinforcementType type) { + super(p); + this.type = type; + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + // check if reinforcement already exists + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); + if (rein != null) { + // something like a slab, we just ignore this + return; + } + Player player = e.getPlayer(); + if (!type.canBeReinforced(e.getBlock().getType())) { + e.setCancelled(true); + Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + e.getBlock().getType()); + return; + } + + ItemMap playerItems = new ItemMap(player.getInventory()); + int available = playerItems.getAmount(type.getItem()); + if (available == 0) { + // TODO leave mode + e.setCancelled(true); + Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); + return; + } + ItemMap toRemove = new ItemMap(type.getItem()); + if (toRemove.removeSafelyFrom(player.getInventory())) { + Utility.sendAndLog(player, ChatColor.RED, + "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); + // TODO exit mode + return; + } + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + } + + @Override + public void handleBreakBlock(BlockBreakEvent e) { + } + +} diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java new file mode 100644 index 00000000..e5284e71 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java @@ -0,0 +1,27 @@ +package vg.civcraft.mc.citadel.playerstate; + +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public abstract class IPlayerState { + + protected UUID uuid; + + public IPlayerState(Player p) { + if (p == null) { + throw new IllegalArgumentException("Player for player state can not be null"); + } + this.uuid = p.getUniqueId(); + } + + public abstract void handleBlockPlace(BlockPlaceEvent e); + + public abstract void handleInteractBlock(PlayerInteractEvent e); + + public abstract void handleBreakBlock(BlockBreakEvent e); + +} diff --git a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java new file mode 100644 index 00000000..b103921f --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -0,0 +1,96 @@ +package vg.civcraft.mc.citadel.playerstate; + +import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; +import static vg.civcraft.mc.citadel.Utility.timeUntilMature; + +import java.text.DecimalFormat; +import java.util.concurrent.TimeUnit; + +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import vg.civcraft.mc.citadel.AcidManager; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.util.TextUtil; +import vg.civcraft.mc.namelayer.group.Group; + +public class InformationState extends IPlayerState { + + private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); + private static final DecimalFormat roundingFormat = new DecimalFormat("0"); + + public InformationState(Player p) { + super(p); + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getClickedBlock()); + if (rein == null) { + return; + } + Player player = e.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE) { + e.setCancelled(true); + } + if (!rein.hasPermission(player, "REINFORCEMENT_INFO")) { + String msg = String.format("Reinforced %s with %s", formatHealth(rein), rein.getType().getName()); + Utility.sendAndLog(player, ChatColor.RED, msg); + return; + } + StringBuilder sb = new StringBuilder(); + sb.append(String.format("Reinforced %s with %s on %s, ", formatHealth(rein), rein.getType().getName(), + rein.getGroup().getName())); + if (!rein.isMature()) { + sb.append(ChatColor.GOLD); + sb.append(formatProgress(rein.getCreationTime(), rein.getType().getMaturationTime(), "mature")); + sb.append(" "); + } + if (rein.isInsecure()) { + sb.append(ChatColor.AQUA); + sb.append("(Insecure)"); + } + AcidManager acidMan = Citadel.getInstance().getAcidManager(); + if(acidMan.isPossibleAcidBlock(e.getClickedBlock())) { + sb.append(ChatColor.GOLD); + long remainingTime = acidMan.getRemainingAcidMaturationTime(rein); + if (remainingTime == 0) { + sb.append("Acid ready"); + } + else { + sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); + } + } + Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); + } + + private static String formatProgress(long start, long timeNeeded, String text) { + long timeTaken = System.currentTimeMillis() - start; + timeTaken = Math.max(timeTaken, timeNeeded); + double progress = Math.min(1.0, ((double) timeTaken) / ((double) timeNeeded)); + return String.format("%s%% %s %s left", commaFormat.format(progress * 100), text, + TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); + } + + private static String formatHealth(Reinforcement rein) { + return String.format("%s%% (%s/%s)", commaFormat.format(rein.getHealth() / rein.getType().getHealth() * 100), + roundingFormat.format(rein.getHealth()), rein.getType().getHealth()); + } + + @Override + public void handleBreakBlock(BlockBreakEvent e) { + } + +} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java deleted file mode 100644 index 2406a37f..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcement/MultiBlockReinforcement.java +++ /dev/null @@ -1,86 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcement; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.bukkit.Location; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.group.Group; - -public class MultiBlockReinforcement extends Reinforcement{ - - List locs; - private Group g; - private static Map reins = - new HashMap(); - - public MultiBlockReinforcement(List locs, Group g, int dur, - int creation, int acid, int multiBlockId) { - super(null, null, dur, creation, acid); - this.g = g; - this.locs = locs; - } - - @Override - /** - * @return Returns the first location in the list of locations. - */ - public Location getLocation(){ - return locs.get(0); - } - - public List getLocations(){ - return locs; - } - - public void setGroup(Group g){ - this.g = g; - isDirty = true; - } - - public Group getGroup(){ - checkValid(); - return g; - } - - private void checkValid(){ - if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "CheckValid was called but the underlying group is gone for " + this.getLocation() + "!"); - return; - } - if (!g.isValid()){ // incase it was recently merged/ deleted. - g = GroupManager.getGroup(g.getGroupId()); - if (g == null) { - Citadel.getInstance().getLogger().log(Level.INFO, "Group " + g.getGroupId() + " was deleted or merged but not marked invalid!"); - } - isDirty = true; - } - } - /** - * This method is used to get the MultiblockReinforcement from a - * particular id. The id is the one from the db. - * @param id- The unique identifier for the MultiBlock. - * @return Returns the MultiBlockReinforcement. - */ - public static MultiBlockReinforcement getMultiRein(int id){ - return reins.get(id); - } - - /** - * Note this is different to the group id of a Group. - * If a reinforcement is made with Group 1 and then is merged into Group 0 then this will return the group_id - * of Group 1. - * @return Returns the value of the group_id from the group it was created with. - */ - public int getGroupId(){ - return g.getGroupId(); - } - - public void setReinId(int id) { - reins.put(id, this); - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/NaturalReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/NaturalReinforcement.java deleted file mode 100644 index e20aa819..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcement/NaturalReinforcement.java +++ /dev/null @@ -1,12 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcement; - -import org.bukkit.block.Block; - -public class NaturalReinforcement extends Reinforcement{ - - public NaturalReinforcement(Block block, int dur){ - super(block.getLocation(), block.getType(), dur, 0, 0); - // The group is null be natural reinforcements don't belong to a group. - } - -} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/NullReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/NullReinforcement.java deleted file mode 100644 index 94a29b16..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcement/NullReinforcement.java +++ /dev/null @@ -1,13 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcement; - -import org.bukkit.Location; - -/** - * Just a place holder for null reinforcements for the cache. No one Should be using this. - */ -public class NullReinforcement extends Reinforcement{ - - public NullReinforcement(Location loc) { - super(loc, null, 0, 0, 0); - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java deleted file mode 100644 index 20b0eeb0..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ /dev/null @@ -1,276 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcement; - -import java.sql.Timestamp; -import java.text.DecimalFormat; -import java.util.logging.Level; - -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.material.Openable; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; - -public class PlayerReinforcement extends Reinforcement{ - private transient int gid; - private Group g; - private static GroupManager gm; - private boolean isInsecure = false; - private ItemStack stack; - private String materialName; - - public PlayerReinforcement(Location loc, int health, - int creation, int acid, Group g, ItemStack stack) { - super(loc, stack.getType(), health, creation, acid); - this.g = g; - this.stack = stack; - if (gm == null) { - gm = NameAPI.getGroupManager(); - } - this.gid = g.getGroupId(); - - ItemMeta meta = this.stack.hasItemMeta() ? this.stack.getItemMeta(): null; - String lore = meta != null && meta.hasLore() && meta.getLore().size() > 0 ? meta.getLore().get(0): null; - - this.materialName = lore != null && lore.length() > 0 ? "\"" + lore + "\"": stack.getType().name(); - } - - public boolean canBypass(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("BYPASS_REINFORCEMENT")); - } - - public boolean canAccessCrops(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CROPS")); - } - - public boolean canAccessChests(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("CHESTS")); - } - - public boolean canAccessDoors(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("DOORS")); - } - - public boolean canViewInformation(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("REINFORCEMENT_INFO")); - } - - public boolean canMakeInsecure(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("INSECURE_REINFORCEMENT")); - } - - public boolean canAcid(Player p) { - checkValid(); - if (g == null) { - return false; - } - return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("ACIDBLOCK")); - } - - public boolean isSecurable() { - return (isContainer() || isDoor()); - } - - public int getDamageMultiplier(){ - checkValid(); - if (g == null){ - return 1; - } - Timestamp ts = NameAPI.getGroupManager().getTimestamp(g.getName()); - - long shiftMultiplier = ((System.currentTimeMillis() - ts.getTime()) / (long)86400000) / (long)Citadel.getReinforcementManager().getDayMultiplier(); - if (shiftMultiplier > 0) { - return 1 << shiftMultiplier; - } - return 1; - } - - /** - * @return return false if it is secure, return true if it is insecure. - */ - public boolean isInsecure(){ - return isInsecure; - } - /** - * Toggles whether or not the block is insecure. - */ - public void toggleInsecure() { - this.setInsecure(!this.isInsecure()); - } - /** - * Set the status of either insecure or secure. - * Mostly used with hoppers to allow or disallow the transfer of items - * from one hopper to another if they are on separate groups. - * @param bool - */ - public void setInsecure(boolean bool){ - isInsecure = bool; - isDirty = true; - } - /** - * @return Returns the percent of the reinforcement. - */ - public double getHealth() { - return (double)getDurability() / ((double)ReinforcementType. - getReinforcementType(stack).getHitPoints()); - } - /** - * @return Returns in textual form the health of the reinforcement. - */ - public String getHealthText() { - double health = getHealth(); - if (CitadelConfigManager.showHealthAsPercent()) { - DecimalFormat df = new DecimalFormat("#.##"); - return df.format(health * 100) + "%"; - } else { - if (health > 0.75) { - return "excellently"; - } else if (health > 0.50) { - return "well"; - } else if (health > 0.25) { - return "decently"; - } else { - return "poorly"; - } - } - } - /** - * Returns true if the block has an inventory that can be opened. - * @return boolean - */ - public boolean rable() { - Block block = getLocation().getBlock(); - return block.getState() instanceof InventoryHolder - || block.getState().getData() instanceof Openable || Utility.doorTypes.contains(block.getType()); - } - - /** - * @return True if the reinforced block is a door/trapdoor etc. or part of one - */ - public boolean isDoor() { - Block block = getLocation().getBlock(); - return Utility.doorTypes.contains(block.getType()) || block.getState().getData() instanceof Openable; - } - - public boolean isContainer() { - return getLocation().getBlock().getState() instanceof InventoryHolder; - } - - - /** - * Returns the group this PlayerReinforcement is associated with. - * @return group - */ - public Group getGroup(){ - checkValid(); - return g; - } - /** - * Sets the Group for this reinforcement - * @param Group - */ - public void setGroup(Group g){ - this.g = g; - this.gid = g.getGroupId(); - isDirty = true; - } - /** - * @return ItemStack associated with this reinforcement - */ - public ItemStack getStackRepresentation(){ - return stack; - } - /** - * @return A string representation of a reinforcement's health, material, ect. - */ - public String getStatus() { - String verb; - if (isSecurable()) { - verb = "Locked"; - } else { - verb = "Reinforced"; - } - - return String.format("%s %s with %s", verb, getHealthText(), this.materialName); - } - - private void checkValid(){ - if (g == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "CheckValid was called but the underlying group " + gid + " is gone for " + this.getLocation() + "!"); - return; - } - if (!g.isValid()){ // incase it was recently merged/ deleted. - int groupId = g.getGroupId(); - g = GroupManager.getGroup(groupId); - if (g == null) { - Citadel.getInstance().getLogger().log(Level.INFO, "Group " + groupId + " was deleted or merged but not marked invalid!"); - } - isDirty = true; - } - } - /** - * Note this is different to the group id of a Group. - * If a reinforcement is made with Group 1 and then is merged into Group 0 then this will return the group_id - * of Group 1. - * @return Returns the value of the group_id from the group it was created with. - */ - public int getGroupId(){ - if (g == null) return gid; - return g.getGroupId(); - } - - public String getAgeStatus() { - int d = this.getDamageMultiplier(); - if(d < 2){ - return "not decayed"; - } - else if(d < 16){ - return "partially decayed"; - } - else if(d < 256){ - return "highly decayed"; - } - else if(d < 2048){ - return "heavily decayed"; - } - else if(d > 2047){ - return "completely decayed"; - } - else - return ""; - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java index 17ac1500..ac0cb73c 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java @@ -1,94 +1,169 @@ package vg.civcraft.mc.citadel.reinforcement; import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; public class Reinforcement { - private int creation; - private int acid; - private Location loc; - private Material mat; - private int dur; + private final long creationTime; + private final ReinforcementType type; + private final Location loc; + private double health; protected boolean isDirty; - - public Reinforcement(Location loc, Material mat, int dur, int creation, int acid){ + protected boolean isNew; + private final int groupId; + private boolean insecure; + + public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, + boolean isDirty, boolean isNew, boolean insecure) { + if (loc == null) { + throw new IllegalArgumentException("Location for reinforcement can not be null"); + } + if (type == null) { + throw new IllegalArgumentException("Reinforcement type for reinforcement can not be null"); + } this.loc = loc; - this.mat = mat; - this.dur = dur; - this.creation = creation; - this.acid = acid; - isDirty = false; + this.type = type; + this.creationTime = creationTime; + this.health = health; + this.isDirty = isDirty; + this.groupId = groupID; + this.isNew = isNew; + this.insecure = insecure; } + + public Reinforcement(Location loc, ReinforcementType type, Group group) { + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + } + /** - * Sets the durability of a reinforcement. - * @param The int of the durability. + * Sets the health of a reinforcement. + * + * @param health new health value */ - public void setDurability(int dur){ - this.dur = dur; + public void setHealth(double health) { + this.health = health; isDirty = true; + if (health <= 0) { + Citadel.getInstance().getReinforcementManager().removeReinforcement(this); + } } + /** - * @return Returns what the current durability is. + * @return Whether reinforcement is mature, meaning the maturation time + * configured for this reinforcements type has passed since the + * reinforcements creation */ - public int getDurability(){ - return dur; + public boolean isMature() { + return System.currentTimeMillis() - creationTime > type.getMaturationTime(); } + /** - * @return Returns the material of the ReinforcementMaterial. + * @return Current health */ - public Material getMaterial(){ - return mat; + public double getHealth() { + return health; } + /** - * @return Return the location of the Reinforcement. + * @return Location of the Reinforcement. */ - public Location getLocation(){ + public Location getLocation() { return loc; } + /** - * @return Returns the time that this reinforcement was created or 0 if it is mature. + * @return Unix time in ms when the reinforcement was created */ - public int getMaturationTime(){ - return creation; + public long getCreationTime() { + return creationTime; } + /** - * Sets the maturation time of this reinforcement. - * @param The time in minutes it was created. + * @return Whether the reinforcement is insecure, meaning it ignores Citadel + * restrictions on hoppers etc. */ - public void setMaturationTime(int time){ - creation = time; - isDirty = true; + public boolean isInsecure() { + return insecure; } + /** - * @return Returns the time that this acid process began or 0 if not acid/done. + * @return Whether this reinforcement needs to be saved to the database */ - public int getAcidTime(){ - return acid; + public boolean isDirty() { + return isDirty; } + /** - * Sets the acid process time of this reinforcement (0 to indicate done/not acid). - * @param The time in minutes acid process began. + * Sets if this reinforcement needs to be saved to the database or not. + * + * @param dirty */ - public void setAcidTime(int acid) { - this.acid = acid; - isDirty = true; + public void setDirty(boolean dirty) { + isDirty = dirty; + if (!dirty) { + isNew = false; + } } + /** - * @return Returns if this reinforcement needs to be saved. + * @return True if the reinforcement has not been written to the database since its creation */ - public boolean isDirty(){ - return isDirty; + public boolean isNew() { + return isNew; } + /** - * Sets if this reinforcement needs to be saved or not. - * @param dirty + * After being broken reinforcements will no longer be accessible via lookup, + * but may still persist in the cache until their deletion is persisted into the + * database + * + * @return True if the reinforcements health is equal to or less than 0 */ - public void setDirty(boolean dirty){ - isDirty = dirty; + public boolean isBroken() { + return health <= 0; + } + + /** + * @return Group this reinforcement is under + */ + public Group getGroup() { + return GroupManager.getGroup(groupId); + } + + /** + * @return Id of the group this reinforcement is under + */ + public int getGroupId() { + return groupId; } - - public Material getType() { - return this.mat; + + /** + * @return Type of this reinforcement + */ + public ReinforcementType getType() { + return type; + } + + /** + * @return Age of this reinforcement in milli seconds + */ + public long getAge() { + return System.currentTimeMillis() - creationTime; + } + + public boolean hasPermission(Player p, String permission) { + Group g = getGroup(); + if (g == null) { + return false; + } + return NameAPI.getGroupManager().hasAccess(g, p.getUniqueId(), PermissionType.getPermission(permission)); } } diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/NaturalReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/NaturalReinforcementType.java deleted file mode 100644 index c7db5737..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/NaturalReinforcementType.java +++ /dev/null @@ -1,59 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcementtypes; - -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; - -import org.bukkit.Material; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; - -public class NaturalReinforcementType { - - public static Map types = - new HashMap(); - - private Material mat; - private int dur; - - public NaturalReinforcementType(Material mat, int breakcount){ - this.mat = mat; - this.dur = breakcount; - types.put(mat, this); - } - - public static void initializeNaturalReinforcementsTypes(){ - for (String type: CitadelConfigManager.getNaturalReinforcementTypes()){ - Material mat = CitadelConfigManager.getNaturalReinforcementMaterial(type); - int dur = CitadelConfigManager.getNaturalReinforcementHitPoints(type); - new NaturalReinforcementType(mat, dur); - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Adding Natural Reinforcement: {0} w/ health {1}", - new Object[] {mat.toString(), dur}); - } - } - } - /** - * Get a NaturalReinforcementType from the specified material. - * @param The Material of the block. - * @return Returns the NaturalReinforcementType or null if none was found. - */ - public static NaturalReinforcementType getNaturalReinforcementType(Material mat){ - return types.containsKey(mat) ? types.get(mat) : null; - } - /** - * Get the Material of a NaturalReinforcementType - * @return Returns the Material of a NaturalReinforcementType. - */ - public Material getMaterial(){ - return mat; - } - /** - * - * @return Returns the durability of the NaturalReinforcementType. - */ - public int getDurability(){ - return dur; - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/NonReinforceableType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/NonReinforceableType.java deleted file mode 100644 index 12be25df..00000000 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/NonReinforceableType.java +++ /dev/null @@ -1,29 +0,0 @@ -package vg.civcraft.mc.citadel.reinforcementtypes; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; - -import org.bukkit.Material; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; - -public class NonReinforceableType { - - public static List mats = new ArrayList(); - - public static void initializeNonReinforceableTypes(){ - List materials = CitadelConfigManager.getNonReinforceableTypes(); - for (String x: materials){ - mats.add(Material.getMaterial(x)); - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Adding Non-reinforceable: {0}", x); - } - } - } - - public static boolean isNonReinforceable(Material mat){ - return mats.contains(mat); - } -} diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 7562cb02..a3fca13f 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -1,190 +1,132 @@ package vg.civcraft.mc.citadel.reinforcementtypes; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.Collection; import java.util.Set; -import java.util.logging.Level; +import java.util.TreeSet; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelConfigManager; public class ReinforcementType { - private int amount; - private double percentReturn; - private int returnValue; - private int hitpoints; - private Material mat; - private int maturationTime; - private int acidTime; - private int scale; - private int gracePeriod; - private ItemStack stack; + private double health; + private double returnChance; + private ItemStack item; + private long maturationTime; + private long acidTime; + private double scale; + private long gracePeriod; private ReinforcementEffect effect; - private Set allowedReinforceables; - private Set disallowedReinforceables; - - private static Map types = - new HashMap(); - - public ReinforcementType(Material mat, int amount, double percentReturn, - int returnValue, int hitpoints, int maturationTime, int acidTime, - int scale, List lore, ReinforcementEffect effect, Set allowsReinforceables, - Set disallowedReinforceables, int gracePeriod) { - this.mat = mat; - this.amount = amount; - this.percentReturn = percentReturn/100; - this.returnValue = returnValue; - this.hitpoints = hitpoints; + private Set allowedReinforceables; + private Set disallowedReinforceables; + private int id; + private String name; + + public ReinforcementType(double health, double returnChance, ItemStack item, long maturationTime, long acidTime, + double scale, long gracePeriod, ReinforcementEffect effect, Collection allowsReinforceables, + Collection disallowedReinforceables, int id, String name) { + this.health = health; + this.name = name; + this.returnChance = returnChance; + this.item = item; this.maturationTime = maturationTime; this.acidTime = acidTime; this.scale = scale; this.effect = effect; - ItemStack stack = new ItemStack(mat, amount); - ItemMeta meta = stack.getItemMeta(); - meta.setLore(lore); - stack.setItemMeta(meta); - this.stack = stack; - types.put(stack, this); - this.allowedReinforceables = allowsReinforceables; - this.disallowedReinforceables = disallowedReinforceables; this.gracePeriod = gracePeriod; - } - - public static void initializeReinforcementTypes(){ - List types = CitadelConfigManager.getReinforcementTypes(); - for (String type: types){ - Material mat = CitadelConfigManager.getMaterial(type); - int amount = CitadelConfigManager.getRequireMents(type); - int percentReturn = CitadelConfigManager.getPercentReturn(type); - int returnValue = CitadelConfigManager.getReturns(type); - int hitpoints = CitadelConfigManager.getHitPoints(type); - int maturation = CitadelConfigManager.getMaturationTime(type); - int acid = CitadelConfigManager.getAcidTime(type); - int maturation_scale = CitadelConfigManager.getMaturationScale(type); - List lore = CitadelConfigManager.getLoreValues(type); - ReinforcementEffect effect = CitadelConfigManager.getReinforcementEffect(type); - List reinforceableMatString = CitadelConfigManager.getReinforceableMaterials(type); - Set reinforceableMats = CitadelConfigManager.parseMaterialList(reinforceableMatString); - List unreinforceableMatString = CitadelConfigManager.getNonReinforceableMaterials(type); - Set nonReinforceableMats = CitadelConfigManager.parseMaterialList(unreinforceableMatString); - int gracePeriod = CitadelConfigManager.getGracePeriod(type); - new ReinforcementType(mat, amount, percentReturn, returnValue, - hitpoints, maturation, acid, maturation_scale, lore, effect, reinforceableMats, nonReinforceableMats, gracePeriod); - if (CitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "Adding Reinforcement {0} with:\n material {1} \n amount {2} " - + "\n return rate {3} \n return? {4} \n health {5} \n maturation {6} " - + "\n acid {7} \n scaling {8} \n lore: {9} \n effect: \n {10} \n grace: {11}", - new Object[] { type, mat.toString(), amount, percentReturn, returnValue, hitpoints, maturation, - acid, maturation_scale, (lore != null ? String.join(" ", lore) : ""), (effect != null ? effect : ""), - gracePeriod}); + if (allowsReinforceables != null) { + this.allowedReinforceables = new TreeSet<>(allowsReinforceables); + } else { + //can only black list OR white list + if (disallowedReinforceables != null) { + this.disallowedReinforceables = new TreeSet<>(disallowedReinforceables); } } - } - - /** - * @return Returns the Material associated with this ReinforcementType. - */ - public Material getMaterial() { - return mat; + this.id = id; } + /** - * @return Returns the required amount of items for this ReinforcementType. + * @return Item used to create instance of this item */ - public int getRequiredAmount() { - return amount; + public ItemStack getItem() { + return item; } + /** - * @return The percent chance that a block will return the reinforcements. Scales with damage. 1 means it is 100% and .5 means 50% + * @return Maximum health */ - public double getPercentReturn() { - return percentReturn; + public double getHealth() { + return health; } + /** - * @return The amount of materials to return on breakage. + * @return The percent chance that a block will return the reinforcements. + * Scales with damage. 1 means it is 100% and .5 means 50% */ - public int getReturnValue() { - return returnValue; + public double getPercentReturn() { + return returnChance; } + /** - * @return Returns the durability of a ReinforcementType. + * @return Nice name to use for messages */ - public int getHitPoints() { - return hitpoints; + public String getName() { + return name; } + /** - * @return Returns the Maturation time needed until this block is mature. + * @return Returns the Maturation time needed until this block is mature in milliseconds */ - public int getMaturationTime(){ + public long getMaturationTime() { return maturationTime; } + /** - * @return Returns the Acid time needed until this acid block is ready. + * @return Returns the acid maturation time needed until this acid block is ready. */ - public int getAcidTime() { + public long getAcidTime() { return acidTime; } + /** - * @return Get the scale of amount of damage a block should take when it is not fully mature. + * @return Get the scale of amount of damage a block should take when it is not + * fully mature. */ - public int getMaturationScale(){ + public double getMaturationScale() { return scale; } + /** - * @return Get the effect to spawn around this type of reinforcement when it is created or damaged. + * @return Get the effect to spawn around this type of reinforcement when it is + * created or damaged. */ - public ReinforcementEffect getReinforcementEffect(){ + public ReinforcementEffect getReinforcementEffect() { return effect; } - /** - * Returns the ReinforcementType for a given ItemStack. - * @param The ItemStack that a player may be holding. - * @return Returns null if no ReinforcementType is found. - * @return Returns the ReinforcementType if found. - */ - public static ReinforcementType getReinforcementType(ItemStack stack){ - for (ItemStack storedStack: types.keySet()) - if (storedStack.isSimilar(stack)) { - return types.get(storedStack); - } - return null; - } - /** - * @return Returns the ItemStack of a ReinforcementType. - */ - public ItemStack getItemStack(){ - return stack; - } - + public boolean canBeReinforced(Material mat) { if (allowedReinforceables == null) { if (disallowedReinforceables == null || !disallowedReinforceables.contains(mat)) { return true; - } - else { + } else { return false; } } return allowedReinforceables.contains(mat); } - - public static List getReinforcementTypes(){ - List type = new ArrayList(); - type.addAll(types.values()); - return type; + + /** + * @return the time in milli seconds to "forgive" reinforcements and apply 100% return + * rate. Set to 0 to disable. + */ + public long getGracePeriod() { + return this.gracePeriod; } /** - * @return the time in minutes to "forgive" reinforcements and apply 100% return rate. Set to 0 to disable. + * @return The unique id identifying this config */ - public int getGracePeriod() { - return this.gracePeriod; + public int getID() { + return id; } } From 48f6bc6da0a44d0fc84435683e70e22d62729c3c Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 13 Mar 2019 02:25:38 +0100 Subject: [PATCH 108/255] More work --- src/vg/civcraft/mc/citadel/ChunkCache.java | 4 +- src/vg/civcraft/mc/citadel/Citadel.java | 7 ++- .../mc/citadel/CitadelWorldManager.java | 2 +- ...r.java => GlobalReinforcementManager.java} | 11 +++- .../mc/citadel/ReinforcementLogic.java | 4 +- .../mc/citadel/ReinforcementManager.java | 4 +- src/vg/civcraft/mc/citadel/Utility.java | 1 - src/vg/civcraft/mc/citadel/command/Acid.java | 3 - .../database/CitadelReinforcementData.java | 15 +++-- .../events/ReinforcementBypassEvent.java | 29 +++++++++ .../events/ReinforcementChangeTypeEvent.java | 50 ++++----------- .../events/ReinforcementCreationEvent.java | 56 +++-------------- .../events/ReinforcementDamageEvent.java | 63 ++++++++----------- .../mc/citadel/events/ReinforcementEvent.java | 36 +++++++++++ .../mc/citadel/listener/BlockListener.java | 12 ---- .../playerstate/FortificationState.java | 5 +- .../mc/citadel/playerstate/IPlayerState.java | 43 ++++++++++++- .../citadel/playerstate/InformationState.java | 13 ++-- 18 files changed, 187 insertions(+), 171 deletions(-) rename src/vg/civcraft/mc/citadel/{CitadelConfigManager.java => GlobalReinforcementManager.java} (93%) create mode 100644 src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java create mode 100644 src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java diff --git a/src/vg/civcraft/mc/citadel/ChunkCache.java b/src/vg/civcraft/mc/citadel/ChunkCache.java index 7dc0e98d..ddcab0fc 100644 --- a/src/vg/civcraft/mc/citadel/ChunkCache.java +++ b/src/vg/civcraft/mc/citadel/ChunkCache.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -63,10 +62,11 @@ public Reinforcement getReinforcement(int x, int y, int z) { return reinforcements.get(new Coords(x, y, z)); } - public Collection getAll() { + public Collection getAllAndCleanUp() { List reins = new ArrayList<>(); reins.addAll(deletedReinforcements); reins.addAll(reinforcements.values()); + deletedReinforcements.clear(); return reins; } diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 1ea12fb5..79663c7b 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -20,10 +20,11 @@ public class Citadel extends ACivMod { private static Logger logger; public static final String chestPerm = "CHESTS"; + public static final String bypassPerm = "BYPASS_REINFORCEMENT"; private CitadelReinforcementData db; private CitadelWorldManager worldManager; - private CitadelConfigManager config; + private GlobalReinforcementManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; private static Citadel instance; @@ -37,7 +38,7 @@ public void onEnable() { this.getPluginLoader().disablePlugin(this); return; } - config = new CitadelConfigManager(this); + config = new GlobalReinforcementManager(this); if (!config.parse()) { logger.severe("Errors in config file, shutting down"); this.getPluginLoader().disablePlugin(this); @@ -102,7 +103,7 @@ private void registerNameLayerPermissions() { PermissionType.registerPermission("REINFORCE", (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission("ACIDBLOCK", (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission("REINFORCEMENT_INFO", (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("BYPASS_REINFORCEMENT", (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission("DOORS", (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission("CROPS", (LinkedList) membersAndAbove.clone()); diff --git a/src/vg/civcraft/mc/citadel/CitadelWorldManager.java b/src/vg/civcraft/mc/citadel/CitadelWorldManager.java index b77d2659..40f7d8fb 100644 --- a/src/vg/civcraft/mc/citadel/CitadelWorldManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelWorldManager.java @@ -130,6 +130,6 @@ public void removeReinforcement(Reinforcement rein) { if (worldManager == null) { throw new IllegalStateException("No world manager for reinforcement at " + rein.getLocation().toString()); } - worldManager.remo + worldManager.removeReinforcement(rein); } } diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java similarity index 93% rename from src/vg/civcraft/mc/citadel/CitadelConfigManager.java rename to src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java index cf8e43ea..5e18eda9 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java @@ -16,13 +16,13 @@ import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.util.ConfigParsing; -public class CitadelConfigManager extends CoreConfigManager { +public class GlobalReinforcementManager extends CoreConfigManager { private ManagedDatasource database; private List reinforcementTypes; private List acidMaterials; - public CitadelConfigManager(ACivMod plugin) { + public GlobalReinforcementManager(ACivMod plugin) { super(plugin); } @@ -79,12 +79,17 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { long maturationTime = ConfigParsing.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), TimeUnit.MILLISECONDS); + String name = config.getString("name"); double maturationScale = config.getInt("scale_amount", 1); double health = config.getDouble("hit_points", 100); double returnChance = config.getDouble("return_chance", 1.0); List reinforceables = parseMaterialList(config, "reinforceables"); List nonReinforceables = parseMaterialList(config, "non_reinforceables"); int id = config.getInt("id", -1); + if (name == null) { + logger.warning("No name specified for reinforcement type at " + config.getCurrentPath()); + name = item.getType().name(); + } if (id == -1) { logger.warning("Reinforcement type at " + config.getCurrentPath() + " had no id, it was ignored"); return null; @@ -95,7 +100,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { return null; } return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, effect, - reinforceables, nonReinforceables, id); + reinforceables, nonReinforceables, id, name); } private List parseMaterialList(ConfigurationSection config, String key) { diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java index 1931edd3..40e44397 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -13,7 +13,7 @@ public class ReinforcementLogic { - public static void damageReinforcement(Player player, Reinforcement reinforcement) { + public static double getDamageApplied(Player player, Reinforcement reinforcement) { double damageAmount = 1.0; if (!reinforcement.isMature()) { double timeExisted = (double) (System.currentTimeMillis() - reinforcement.getCreationTime()); @@ -21,7 +21,7 @@ public static void damageReinforcement(Player player, Reinforcement reinforcemen damageAmount /= (1.0 - progress); damageAmount *= reinforcement.getType().getMaturationScale(); } - reinforcement.setHealth(reinforcement.getHealth() - damageAmount); + return damageAmount; } public static void createReinforcement(Block block, ReinforcementType type) { diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/ReinforcementManager.java index 85f194ff..8e73dd9b 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -44,13 +44,13 @@ public void insertReinforcement(Reinforcement reinforcement) { cache.insertReinforcement(reinforcement); } - private void removeReinforcement(Reinforcement reinforcement) { + public void removeReinforcement(Reinforcement reinforcement) { ChunkPair key = ChunkPair.forLocation(reinforcement.getLocation()); ChunkCache cache = reinforcements.getIfPresent(key); if (cache == null) { throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); } - cache.rem + cache.removeReinforcement(reinforcement); } /** diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 41a85f5e..1aef1213 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -32,7 +32,6 @@ import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; -import vg.civcraft.mc.citadel.reinforcement.MultiBlockReinforcement; import vg.civcraft.mc.citadel.reinforcement.NaturalReinforcement; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; diff --git a/src/vg/civcraft/mc/citadel/command/Acid.java b/src/vg/civcraft/mc/citadel/command/Acid.java index ec357faa..e5b783a0 100644 --- a/src/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/Acid.java @@ -17,9 +17,7 @@ import vg.civcraft.mc.citadel.AcidManager; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelWorldManager; import vg.civcraft.mc.citadel.OldCitadelConfigManager; -import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.AcidBlockEvent; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; @@ -28,7 +26,6 @@ import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; @CivCommand(id = "ctacid") public class Acid extends StandaloneCommand { diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 1e979cdf..7661dfc6 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -31,13 +31,11 @@ public class CitadelReinforcementData { private ManagedDatasource db; - private Citadel plugin; private Logger logger; private ReinforcementTypeManager typeMan; public CitadelReinforcementData(ManagedDatasource db, Citadel plugin, ReinforcementTypeManager typeMan) { this.db = db; - this.plugin = plugin; this.typeMan = typeMan; this.logger = plugin.getLogger(); } @@ -259,8 +257,8 @@ public void saveReinforcements(ChunkCache cache) { PreparedStatement deleteStatement = conn .prepareStatement("delete from reinforcements where x = ? and y = ? and z = ? and world_id = ?;"); PreparedStatement updateStatement = conn.prepareStatement("update reinforcements " - + "set insecure = ?, health=? where x = ? and y = ? and z = ? and world_id = ?;"); - for (Reinforcement rein : cache.getAll()) { + + "set insecure = ?, health=?, type_id=? where x = ? and y = ? and z = ? and world_id = ?;"); + for (Reinforcement rein : cache.getAllAndCleanUp()) { if (!rein.isDirty()) { continue; } @@ -306,10 +304,11 @@ private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedS throws SQLException { updateStatement.setBoolean(1, rein.isInsecure()); updateStatement.setDouble(2, rein.getHealth()); - updateStatement.setInt(3, rein.getLocation().getBlockX()); - updateStatement.setInt(4, rein.getLocation().getBlockY()); - updateStatement.setInt(5, rein.getLocation().getBlockZ()); - updateStatement.setInt(6, cache.getWorldID()); + updateStatement.setInt(3, rein.getType().getID()); + updateStatement.setInt(4, rein.getLocation().getBlockX()); + updateStatement.setInt(5, rein.getLocation().getBlockY()); + updateStatement.setInt(6, rein.getLocation().getBlockZ()); + updateStatement.setInt(7, cache.getWorldID()); updateStatement.addBatch(); } diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java new file mode 100644 index 00000000..7ba6e947 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java @@ -0,0 +1,29 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +/** + * Called when a player bypasses a reinforcement they have access to + * + */ +public class ReinforcementBypassEvent extends ReinforcementEvent { + + private static final HandlerList handlers = new HandlerList(); + + public ReinforcementBypassEvent(Player who, Reinforcement reinforcement) { + super(who, reinforcement); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java index ee11d8a5..eeb81060 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java @@ -1,63 +1,39 @@ package vg.civcraft.mc.citadel.events; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -public class ReinforcementChangeTypeEvent extends Event implements Cancellable{ +/** + * Called when a reinforcements type is changed + * + */ +public class ReinforcementChangeTypeEvent extends ReinforcementEvent { + private static final HandlerList handlers = new HandlerList(); - - private Reinforcement rein; + private ReinforcementType newType; - private Player player; - - private boolean isCancelled = false; - - public ReinforcementChangeTypeEvent(Reinforcement rein, ReinforcementType newType, Player p){ - this.rein = rein; + + public ReinforcementChangeTypeEvent(Player p, Reinforcement rein, ReinforcementType newType) { + super(p, rein); this.newType = newType; - this.player = p; - } - /** - * Gets the Reinforcement that was just modified. - * @return Returns the Reinforcement. - */ - public Reinforcement getReinforcement(){ - return rein; } + /** * * @return Future reinforcement type */ - public ReinforcementType getNewType(){ + public ReinforcementType getNewType() { return newType; } - /** - * @return Returns the Player that modified the Reinforcement. - */ - public Player getPlayer(){ - return player; - } - - @Override - public boolean isCancelled() { - return isCancelled; - } - - @Override - public void setCancelled(boolean value) { - isCancelled = value; - } @Override public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; } diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java index dac56907..9e560225 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java @@ -1,64 +1,28 @@ package vg.civcraft.mc.citadel.events; -import org.bukkit.block.Block; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -public class ReinforcementCreationEvent extends Event implements Cancellable{ - private static final HandlerList handlers = new HandlerList(); - - private Reinforcement rein; - private Block bl; - private Player player; - - private boolean isCancelled = false; - - public ReinforcementCreationEvent(Reinforcement rein, Block block, Player p){ - this.rein = rein; - bl = block; - player = p; - } - /** - * Gets the Reinforcement that was just created. - * @return Returns the Reinforcement. - */ - public Reinforcement getReinforcement(){ - return rein; - } - /** - * Gets the Block that the Reinforcement was created on. - * @return Returns the Block associated with the reinforcement. - */ - public Block getBlock(){ - return bl; - } - /** - * @return Returns the Player that created the Reinforcement. - */ - public Player getPlayer(){ - return player; - } +/** + * Called when a new reinforcement is created + * + */ +public class ReinforcementCreationEvent extends ReinforcementEvent { - @Override - public boolean isCancelled() { - return isCancelled; - } + private static final HandlerList handlers = new HandlerList(); - @Override - public void setCancelled(boolean value) { - isCancelled = value; + public ReinforcementCreationEvent(Player p, Reinforcement rein) { + super(p, rein); } @Override public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; - } + } } diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java index f1022f18..fcc45b88 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java @@ -1,60 +1,49 @@ package vg.civcraft.mc.citadel.events; -import org.bukkit.block.Block; import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.Event; import org.bukkit.event.HandlerList; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -public class ReinforcementDamageEvent extends Event implements Cancellable{ +/** + * Called when a reinforcement is damaged by a player + * + */ +public class ReinforcementDamageEvent extends ReinforcementEvent { + private static final HandlerList handlers = new HandlerList(); - - private boolean isCancelled = false; - private Reinforcement rein; - private Player player; - private Block block; - public ReinforcementDamageEvent(Reinforcement rein, Player player, Block block){ - this.rein = rein; - this.player = player; - this.block = block; - } - /** - * @return Returns the Reinforcement. - */ - public Reinforcement getReinforcement(){ - return rein; + + private double damageDone; + + public ReinforcementDamageEvent(Player player, Reinforcement rein, double damageDone) { + super(player, rein); + this.damageDone = damageDone; } + /** - * @return Returns the block. + * Gets the total damage done by this damaging event + * + * @return Total damage */ - public Block getBlock(){ - return block; + public double getDamageDone() { + return damageDone; } + /** - * @return Returns the Player who damaged the Reinforcement. + * Sets the total damage done + * + * @param damageDone Damage to do */ - public Player getPlayer(){ - return player; - } - - @Override - public boolean isCancelled() { - return isCancelled; - } - - @Override - public void setCancelled(boolean value) { - isCancelled = value; + public void setDamageDone(double damageDone) { + this.damageDone = damageDone; } @Override public HandlerList getHandlers() { return handlers; } - + public static HandlerList getHandlerList() { return handlers; - } + } } diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java new file mode 100644 index 00000000..517ea74d --- /dev/null +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java @@ -0,0 +1,36 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.player.PlayerEvent; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public abstract class ReinforcementEvent extends PlayerEvent implements Cancellable { + + protected Reinforcement reinforcement; + protected boolean isCancelled; + + public ReinforcementEvent(Player who, Reinforcement reinforcement) { + super(who); + this.reinforcement = reinforcement; + isCancelled = false; + } + + /** + * @return Reinforcement involved in this event + */ + public Reinforcement getReinforcement() { + return reinforcement; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean value) { + isCancelled = value; + } +} diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index bbc69b3d..20a0e4ae 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -4,13 +4,10 @@ import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; import static vg.civcraft.mc.citadel.Utility.isAuthorizedPlayerNear; -import static vg.civcraft.mc.citadel.Utility.isDroppedReinforcementBlock; import static vg.civcraft.mc.citadel.Utility.isPlant; import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; -import static vg.civcraft.mc.citadel.Utility.timeUntilMature; import static vg.civcraft.mc.citadel.Utility.wouldPlantDoubleReinforce; import java.util.Arrays; @@ -19,13 +16,9 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Hanging; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -42,25 +35,20 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.material.Comparator; import org.bukkit.material.MaterialData; import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelWorldManager; import vg.civcraft.mc.citadel.OldCitadelConfigManager; import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; -import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 5e50e2b2..b5944ddc 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -7,7 +7,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -17,8 +16,8 @@ public class FortificationState extends IPlayerState { private ReinforcementType type; - public FortificationState(Player p, ReinforcementType type) { - super(p); + public FortificationState(Player p, boolean bypass, ReinforcementType type) { + super(p, bypass); this.type = type; } diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java index e5284e71..1ec1369a 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java @@ -2,26 +2,65 @@ import java.util.UUID; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; +import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + public abstract class IPlayerState { protected UUID uuid; + private boolean bypass; - public IPlayerState(Player p) { + public IPlayerState(Player p, boolean bypass) { if (p == null) { throw new IllegalArgumentException("Player for player state can not be null"); } this.uuid = p.getUniqueId(); + this.bypass = bypass; } public abstract void handleBlockPlace(BlockPlaceEvent e); public abstract void handleInteractBlock(PlayerInteractEvent e); - public abstract void handleBreakBlock(BlockBreakEvent e); + public void handleBreakBlock(BlockBreakEvent e) { + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getBlock()); + if (rein == null) { + //no reinforcement, normal break which we dont care about + return; + } + boolean hasAccess = rein.hasPermission(e.getPlayer(), Citadel.bypassPerm); + if (hasAccess && bypass) { + ReinforcementBypassEvent bypassEvent = new ReinforcementBypassEvent(e.getPlayer(), rein); + Bukkit.getPluginManager().callEvent(bypassEvent); + if (bypassEvent.isCancelled()) { + e.setCancelled(true); + } + return; + } + if (bypass) { + Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, "You could bypass this reinforcement if you turn bypass mode on with '/ctb'"); + } + e.setCancelled(true); + double damage = ReinforcementLogic.getDamageApplied(e.getPlayer(), rein); + ReinforcementDamageEvent dre = new ReinforcementDamageEvent(e.getPlayer(), rein, damage); + Bukkit.getPluginManager().callEvent(dre); + if (dre.isCancelled()) { + return; + } + damage = dre.getDamageDone(); + rein.setHealth(rein.getHealth() - damage); + rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java index b103921f..9dc6e2a1 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -1,14 +1,10 @@ package vg.civcraft.mc.citadel.playerstate; -import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; -import static vg.civcraft.mc.citadel.Utility.timeUntilMature; - import java.text.DecimalFormat; import java.util.concurrent.TimeUnit; import org.bukkit.ChatColor; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; @@ -16,19 +12,18 @@ import vg.civcraft.mc.citadel.AcidManager; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.util.TextUtil; -import vg.civcraft.mc.namelayer.group.Group; public class InformationState extends IPlayerState { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); - public InformationState(Player p) { - super(p); + public InformationState(Player p, boolean bypass) { + super(p, bypass); } @Override @@ -37,7 +32,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getClickedBlock()); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); if (rein == null) { return; } From 77fc064dbe2e50a47a3f0ff27bb1788e702f7985 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 13 Mar 2019 05:13:07 +0100 Subject: [PATCH 109/255] Done for today --- src/vg/civcraft/mc/citadel/Citadel.java | 18 +- .../mc/citadel/PlayerStateManager.java | 45 ++ .../mc/citadel/ReinforcementLogic.java | 7 +- src/vg/civcraft/mc/citadel/Utility.java | 2 +- .../database/CitadelReinforcementData.java | 11 +- .../events/ReinforcementGroupChangeEvent.java | 38 ++ .../mc/citadel/listener/BlockListener.java | 435 +++--------------- .../mc/citadel/listener/EntityListener.java | 240 ++-------- .../playerstate/FortificationState.java | 36 +- .../mc/citadel/playerstate/IPlayerState.java | 22 +- .../citadel/playerstate/InformationState.java | 5 - .../mc/citadel/playerstate/InsecureState.java | 42 ++ .../mc/citadel/playerstate/NormalState.java | 26 ++ .../citadel/playerstate/ReinforcingState.java | 123 +++++ .../citadel/reinforcement/Reinforcement.java | 48 +- 15 files changed, 476 insertions(+), 622 deletions(-) create mode 100644 src/vg/civcraft/mc/citadel/PlayerStateManager.java create mode 100644 src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/InsecureState.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/NormalState.java create mode 100644 src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 79663c7b..ba5cb6d0 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -21,12 +21,17 @@ public class Citadel extends ACivMod { public static final String chestPerm = "CHESTS"; public static final String bypassPerm = "BYPASS_REINFORCEMENT"; + public static final String cropsPerm = "CROPS"; + public static final String insecurePerm = "INSECURE_REINFORCEMENT"; + public static final String reinforcePerm = "REINFORCE"; + public static final String doorPerm = "DOORS"; private CitadelReinforcementData db; private CitadelWorldManager worldManager; private GlobalReinforcementManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; + private PlayerStateManager stateManager; private static Citadel instance; public void onEnable() { @@ -57,6 +62,7 @@ public void onEnable() { this.getPluginLoader().disablePlugin(this); return; } + stateManager = new PlayerStateManager(); acidManager = new AcidManager(config.getAcidMaterials()); registerNameLayerPermissions(); registerListeners(); @@ -100,14 +106,14 @@ private void registerNameLayerPermissions() { modsAndAbove.add(PlayerType.MODS); modsAndAbove.add(PlayerType.ADMINS); modsAndAbove.add(PlayerType.OWNER); - PermissionType.registerPermission("REINFORCE", (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission(reinforcePerm, (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission("ACIDBLOCK", (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission("REINFORCEMENT_INFO", (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("DOORS", (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(doorPerm, (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("CROPS", (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission("INSECURE_REINFORCEMENT", (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(cropsPerm, (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(insecurePerm, (LinkedList) membersAndAbove.clone()); } /** @@ -134,6 +140,10 @@ public CitadelReinforcementData getCitadelDatabase() { public ReinforcementTypeManager getReinforcementTypeManager() { return typeManager; } + + public PlayerStateManager getStateManager() { + return stateManager; + } /** * @return Acid block manager diff --git a/src/vg/civcraft/mc/citadel/PlayerStateManager.java b/src/vg/civcraft/mc/citadel/PlayerStateManager.java new file mode 100644 index 00000000..2434c7b3 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/PlayerStateManager.java @@ -0,0 +1,45 @@ +package vg.civcraft.mc.citadel; + +import java.util.Map; +import java.util.TreeMap; +import java.util.UUID; + +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.NormalState; + +public class PlayerStateManager { + + private Map playerStateMap; + + public PlayerStateManager() { + this.playerStateMap = new TreeMap<>(); + } + + public IPlayerState getState(Player player) { + if (player == null) { + throw new IllegalArgumentException("Can not get state for null player"); + } + IPlayerState state = playerStateMap.get(player.getUniqueId()); + if (state == null) { + state = new NormalState(player, true); + playerStateMap.put(player.getUniqueId(), state); + } + return state; + } + + public void setState(Player p, IPlayerState state) { + if (p == null) { + throw new IllegalArgumentException("Can not set state for null player"); + } + //null state is allowed, it just resets the state + if (state == null) { + playerStateMap.remove(p.getUniqueId()); + } + else { + playerStateMap.put(p.getUniqueId(), state); + } + } + +} diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java index 40e44397..57e316ef 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -10,6 +10,7 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.namelayer.group.Group; public class ReinforcementLogic { @@ -24,11 +25,15 @@ public static double getDamageApplied(Player player, Reinforcement reinforcement return damageAmount; } - public static void createReinforcement(Block block, ReinforcementType type) { + public static void createReinforcement(Block block, ReinforcementType type, Group group) { CitadelWorldManager worldManager = Citadel.getInstance().getReinforcementManager(); } public static Reinforcement getReinforcementProtecting(Block b) { + Reinforcement directReinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(b); + if (directReinforcement != null) { + return directReinforcement; + } Block actual = getResponsibleBlock(b); return getChestReinforcement(actual); } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 1aef1213..15e2503f 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -688,7 +688,7 @@ public static void dropItemAtLocation(Block b, ItemStack is) { * @return Returns true if the player is on the group and has permission. * @return Returns false if the player is not on the group or doesn't have permission. */ - public static boolean isAuthorizedPlayerNear(PlayerReinforcement reinforcement, double distance) { + public static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { if (reinforcement == null) { Citadel.getInstance().getLogger().log(Level.WARNING, "Utility isAuthorizedPlayerNear called with null"); diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 7661dfc6..c751713c 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -257,7 +257,7 @@ public void saveReinforcements(ChunkCache cache) { PreparedStatement deleteStatement = conn .prepareStatement("delete from reinforcements where x = ? and y = ? and z = ? and world_id = ?;"); PreparedStatement updateStatement = conn.prepareStatement("update reinforcements " - + "set insecure = ?, health=?, type_id=? where x = ? and y = ? and z = ? and world_id = ?;"); + + "set insecure = ?, health=?, type_id=? group_id=? where x = ? and y = ? and z = ? and world_id = ?;"); for (Reinforcement rein : cache.getAllAndCleanUp()) { if (!rein.isDirty()) { continue; @@ -305,10 +305,11 @@ private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedS updateStatement.setBoolean(1, rein.isInsecure()); updateStatement.setDouble(2, rein.getHealth()); updateStatement.setInt(3, rein.getType().getID()); - updateStatement.setInt(4, rein.getLocation().getBlockX()); - updateStatement.setInt(5, rein.getLocation().getBlockY()); - updateStatement.setInt(6, rein.getLocation().getBlockZ()); - updateStatement.setInt(7, cache.getWorldID()); + updateStatement.setInt(4, rein.getGroupId()); + updateStatement.setInt(5, rein.getLocation().getBlockX()); + updateStatement.setInt(6, rein.getLocation().getBlockY()); + updateStatement.setInt(7, rein.getLocation().getBlockZ()); + updateStatement.setInt(8, cache.getWorldID()); updateStatement.addBatch(); } diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java new file mode 100644 index 00000000..bed812ac --- /dev/null +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java @@ -0,0 +1,38 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.namelayer.group.Group; + +/** + * Called when the group a reinforcement is on is changed + * + */ +public class ReinforcementGroupChangeEvent extends ReinforcementEvent { + + private static final HandlerList handlers = new HandlerList(); + + private Group newGroup; + + public ReinforcementGroupChangeEvent(Player who, Reinforcement reinforcement, Group newGroup) { + super(who, reinforcement); + this.newGroup = newGroup; + } + + public Group getNewGroup() { + return newGroup; + } + + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } + +} diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index 20a0e4ae..cb3b1795 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -1,29 +1,19 @@ package vg.civcraft.mc.citadel.listener; -import static vg.civcraft.mc.citadel.Utility.canPlace; -import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; -import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; import static vg.civcraft.mc.citadel.Utility.isAuthorizedPlayerNear; -import static vg.civcraft.mc.citadel.Utility.isPlant; import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; -import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.wouldPlantDoubleReinforce; import java.util.Arrays; import java.util.List; -import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; +import org.bukkit.block.Container; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFromToEvent; @@ -34,27 +24,14 @@ import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemStack; import org.bukkit.material.Comparator; import org.bukkit.material.MaterialData; import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.OldCitadelConfigManager; -import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; -import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; -import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; public class BlockListener implements Listener { @@ -64,6 +41,12 @@ public class BlockListener implements Listener { public static final List planar_sides = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); + private double maxRedstoneDistance; + + public BlockListener(double maxRedstoneDistance) { + this.maxRedstoneDistance = maxRedstoneDistance; + } + // Stop comparators from being placed unless the reinforcement is insecure @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void comparatorPlaceCheck(BlockPlaceEvent event) { @@ -91,8 +74,8 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { } } } - - //remove reinforced air + + // remove reinforced air @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void removeReinforcedAir(BlockPlaceEvent e) { if (e.getBlockReplacedState().getType() != Material.AIR) { @@ -101,15 +84,16 @@ public void removeReinforcedAir(BlockPlaceEvent e) { Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); rein.setHealth(-1); } - - //prevent players from upgrading a chest into a double chest to bypass the single chests reinforcement + + // prevent players from upgrading a chest into a double chest to bypass the + // single chests reinforcement @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventBypassChestAccess(BlockPlaceEvent e) { Material mat = e.getBlock().getType(); if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { return; } - for(BlockFace face : planar_sides) { + for (BlockFace face : planar_sides) { Block rel = e.getBlock().getRelative(face); if (rel != null && rel.getType() == mat) { if (ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { @@ -124,95 +108,7 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void blockBreakEvent(BlockBreakEvent event) { - Block block = event.getBlock(); - Player player = event.getPlayer(); - Block reinforcingBlock = null; - Reinforcement rein = rm.getReinforcement(Utility.getRealBlock(block)); - - // if block is a plant check reinforcement on soil block - if (isPlant(block)) { - reinforcingBlock = Utility.findPlantSoil(block); - Reinforcement plant = null; - if (reinforcingBlock != null) - plant = rm.getReinforcement(reinforcingBlock); - if (plant != null) - rein = plant; - } - - if (rein == null) { - rein = createNaturalReinforcement(event.getBlock(), player); - if (rein != null) { - ReinforcementDamageEvent e = new ReinforcementDamageEvent(rein, player, block); - Bukkit.getPluginManager().callEvent(e); - if (e.isCancelled()) { - event.setCancelled(true); - return; - } - if (reinforcementDamaged(player, rein)) { - event.setCancelled(true); - } - } - return; - } - - boolean is_cancelled = true; - if (rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement) rein; - PlayerState state = PlayerState.get(player); - boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); - if (reinforcingBlock != null && isPlant(block) && (pr.canAccessCrops(player) || admin_bypass)) { - // player has CROPS access to the soil block, allow them to - // break without affecting reinforcement - is_cancelled = false; - } else if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) - && !pr.getGroup().isDisciplined()) { - if (admin_bypass) { - /* - * Citadel.verbose( VerboseMsg.AdminReinBypass, player.getDisplayName(), - * pr.getBlock().getLocation().toString()); - */ - } else { - /* - * Citadel.verbose( VerboseMsg.ReinBypass, player.getDisplayName(), - * pr.getBlock().getLocation().toString()); - */ - } - is_cancelled = reinforcementBroken(player, rein); - } else { - if (!state.isBypassMode() && pr.canBypass(player)) { - player.sendMessage(ChatColor.RED + "Enable bypass mode with \"/ctb\" to break this reinforcement"); - } - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if (dre.isCancelled()) { - is_cancelled = true; - } else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - if (!is_cancelled) { - // The player reinforcement broke. Now check for natural - is_cancelled = createNaturalReinforcement(block, player) != null; - } - } else { - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if (dre.isCancelled()) { - is_cancelled = reinforcementDamaged(player, rein); - return; - } else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - - if (is_cancelled) { - event.setCancelled(true); - block.getDrops().clear(); - } + Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) @@ -270,12 +166,8 @@ public void blockBurn(BlockBurnEvent bbe) { @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void onBlockFromToEvent(BlockFromToEvent event) { - Block reinforcementBlock = event.getToBlock(); - if (isPlant(reinforcementBlock)) { - // block to is as plant check block under it for reinforcement - reinforcementBlock = Utility.findPlantSoil(reinforcementBlock); - } - Reinforcement rein = rm.getReinforcement(reinforcementBlock); + // prevent water/lava from spilling reinforced blocks away + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getToBlock()); if (rein != null) { event.setCancelled(true); } @@ -283,258 +175,63 @@ public void onBlockFromToEvent(BlockFromToEvent event) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void redstonePower(BlockRedstoneEvent bre) { - // This currently only protects against reinforced openable objects, - // like doors, from being opened by unauthorizied players. - try { - // NewCurrent <= 0 means the redstone wire is turning off, so the - // container is closing. Closing is good so just return. This also - // shaves off some time when dealing with sand generators. - // OldCurrent > 0 means that the wire was already on, thus the - // container was already open by an authorized player. Now it's - // either staying open or closing. Just return. - if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { - return; - } - Block block = bre.getBlock(); - MaterialData blockData = block.getState().getData(); - if (!(blockData instanceof Openable)) { - return; - } - Openable openable = (Openable) blockData; - if (openable.isOpen()) { - return; - } - Reinforcement generic_reinforcement = Citadel.getReinforcementManager().getReinforcement(block); - if (generic_reinforcement == null || !(generic_reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement reinforcement = (PlayerReinforcement) generic_reinforcement; - double redstoneDistance = OldCitadelConfigManager.getMaxRedstoneDistance(); - if (!isAuthorizedPlayerNear(reinforcement, redstoneDistance)) { - // Citadel.Log( - // reinforcement.getLocation().toString()); - bre.setNewCurrent(bre.getOldCurrent()); - } - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Exception occured in BlockListener, BlockRedstoneEvent ", e); + // prevent doors from being opened by redstone + if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { + return; + } + Block block = bre.getBlock(); + MaterialData blockData = block.getState().getData(); + if (!(blockData instanceof Openable)) { + return; + } + Openable openable = (Openable) blockData; + if (openable.isOpen()) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein == null) { + return; + } + if (!isAuthorizedPlayerNear(rein, maxRedstoneDistance)) { + bre.setNewCurrent(bre.getOldCurrent()); } } - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.LOW) public void interact(PlayerInteractEvent pie) { - try { - if (!pie.hasBlock() || (pie.getHand() != EquipmentSlot.HAND && pie.getHand() != EquipmentSlot.OFF_HAND)) - return; - - Player player = pie.getPlayer(); - Block block = Utility.getRealBlock(pie.getClickedBlock()); - Reinforcement generic_reinforcement = rm.getReinforcement(block); - PlayerReinforcement reinforcement = null; - if (generic_reinforcement instanceof PlayerReinforcement) { - reinforcement = (PlayerReinforcement) generic_reinforcement; - } + if (!pie.hasBlock()) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(pie.getClickedBlock()); + if (rein == null) { + return; + } + } - Action action = pie.getAction(); - boolean access_reinforcement = action == Action.RIGHT_CLICK_BLOCK && reinforcement != null - && reinforcement.isSecurable(); - boolean normal_access_denied = reinforcement != null - && ((reinforcement.isDoor() && !reinforcement.canAccessDoors(player)) - || (reinforcement.isContainer() && !reinforcement.canAccessChests(player))); - boolean admin_can_access = player.hasPermission("citadel.admin"); - if (access_reinforcement && normal_access_denied && !admin_can_access) { - /* - * Citadel.verbose( VerboseMsg.ReinLocked, player.getDisplayName(), - * block.getLocation().toString()); - */ - // Prevents double broadcasts - if (pie.getHand() == EquipmentSlot.HAND) { - pie.getPlayer().sendMessage(ChatColor.RED + String.format("%s is locked", block.getType().name())); - } - pie.setCancelled(true); + // prevent opening reinforced things + @EventHandler(priority = EventPriority.LOWEST) + public void openContainer(PlayerInteractEvent e) { + if (!e.hasBlock()) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + if (rein == null) { + return; + } + if (e.getClickedBlock().getState() instanceof Container) { + if (!rein.hasPermission(e.getPlayer(), Citadel.chestPerm)) { + e.setCancelled(true); + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } - // Not really sure what this is for. Should come up in testing. - /* - * else if (action == Action.PHYSICAL) { AccessDelegate aboveDelegate = - * AccessDelegate.getDelegate(block.getRelative(BlockFace.UP)); if - * (aboveDelegate instanceof CropAccessDelegate && aboveDelegate.isReinforced()) - * { Citadel.verbose( VerboseMsg.CropTrample, block.getLocation().toString()); - * pie.setCancelled(true); } } - */ - if (pie.isCancelled() || pie.getHand() != EquipmentSlot.HAND) - return; - - PlayerState state = PlayerState.get(player); - ReinforcementMode placementMode = state.getMode(); - GroupManager gm = NameAPI.getGroupManager(); - switch (placementMode) { - case NORMAL: - if (!state.getEasyMode()) { - return; - } - if (pie.getAction() == Action.LEFT_CLICK_BLOCK && generic_reinforcement == null) { - ItemStack stack = player.getInventory().getItemInMainHand(); - ReinforcementType type = ReinforcementType.getReinforcementType(stack); - if (type != null) { - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(block)) { - Utility.sendAndLog(player, ChatColor.RED, - "Cancelled block place, crop would already be reinforced."); - return; - } - // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, - "That material cannot reinforce that type of block. Try a different reinforcement material."); - return; - } - if (!canPlace(block, player)) { - Utility.sendAndLog(player, ChatColor.RED, - "Cancelled interact easymode rein, mismatched reinforcement."); - return; - } - - String gName = gm.getDefaultGroup(player.getUniqueId()); - Group g = null; - if (gName != null) { - g = GroupManager.getGroup(gName); - } - if (g != null) { - if (createPlayerReinforcement(player, g, block, type, null) == null - && OldCitadelConfigManager.shouldLogReinforcement()) { - // someone else's job to tell the player what went wrong, but let's do log it. - Citadel.getInstance().getLogger().log(Level.INFO, - "Create Reinforcement by {0} at {1} cancelled by plugin", - new Object[] { player.getName(), block.getLocation() }); - } - } - } - } - return; - case REINFORCEMENT_FORTIFICATION: - return; - case REINFORCEMENT_INFORMATION: - // did player click on a reinforced block? -//REMOVED - break; - - case INSECURE: - // did player click on a reinforced block? - pie.setCancelled(true); - if (reinforcement != null) { - if (reinforcement.canMakeInsecure(player)) { - reinforcement.toggleInsecure(); - // Save the change - /* Citadel.getReinforcementManager().saveReinforcement(reinforcement); */ - if (reinforcement.isInsecure()) { - Utility.sendAndLog(player, ChatColor.YELLOW, "Reinforcement now insecure"); - } else { - Utility.sendAndLog(player, ChatColor.GREEN, "Reinforcement secured"); - } - } else { - Utility.sendAndLog(player, ChatColor.RED, "Access denied"); - } - } - break; - - case REINFORCEMENT: - // player is in reinforcement mode - if (reinforcement == null) { - // set the reinforcemet material to what the player is - // holding - ItemStack stack = player.getInventory().getItemInMainHand(); - ReinforcementType type = ReinforcementType.getReinforcementType(stack); - if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, - stack.getType().name() + " is not a reinforcable material."); - Utility.sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); - state.reset(); - return; - } - // Don't allow incorrect reinforcement with exclusive reinforcement types - if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, - "That material cannot reinforce that type of block. Try a different reinforcement material."); - Utility.sendAndLog(player, ChatColor.RED, "Left Reinforcement mode."); - state.reset(); - return; - } - state.setFortificationItemStack(type.getItemStack()); - // Break any natural reinforcement before placing the player - // reinforcement - if (generic_reinforcement != null) { - reinforcementBroken(null, generic_reinforcement); - } - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(block)) { - Utility.sendAndLog(player, ChatColor.RED, - "Cancelled reinforcement, crop would already be reinforced."); - } else { - if (createPlayerReinforcement(player, state.getGroup(), block, state.getReinforcementType(), - null) == null && OldCitadelConfigManager.shouldLogReinforcement()) { - // someone else's job to tell the player what went wrong, but let's do log it. - Citadel.getInstance().getLogger().log(Level.INFO, - "Create Reinforcement by {0} at {1} cancelled by plugin", - new Object[] { player.getName(), block.getLocation() }); - } - } - } else if (reinforcement.canBypass(player) - || (player.isOp() || player.hasPermission("citadel.admin"))) { - String message = ""; - Group group = state.getGroup(); - Group old_group = reinforcement.getGroup(); - if (!old_group.getName().equals(group.getName())) { - reinforcement.setGroup(group); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, player); - Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - // rm.saveReinforcement(reinforcement); - message = "Group has been changed to: " + group.getName() + "."; - Utility.sendAndLog(player, ChatColor.GREEN, message); - } else { - reinforcement.setGroup(old_group); - } - } - ItemStack stack = player.getInventory().getItemInMainHand(); - ReinforcementType type = ReinforcementType.getReinforcementType(stack); - if (type != null && !reinforcement.getStackRepresentation().isSimilar(type.getItemStack())) { - // hit with different rein material, so switch material - if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, - "That material cannot reinforce that type of block. Try a different reinforcement material."); - } else { - ReinforcementChangeTypeEvent e = new ReinforcementChangeTypeEvent(reinforcement, type, - player); - Bukkit.getPluginManager().callEvent(e); - if (!e.isCancelled()) { - reinforcementBroken(player, reinforcement); - ReinforcementCreationEvent event = new ReinforcementCreationEvent(reinforcement, block, - player); - Bukkit.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - if (createPlayerReinforcement(player, state.getGroup(), block, type, - null) != null) { - Utility.sendAndLog(player, ChatColor.GREEN, "Changed reinforcement type"); - } else if (OldCitadelConfigManager.shouldLogReinforcement()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "Change Reinforcement by {0} at {1} cancelled by plugin", - new Object[] { player.getName(), block.getLocation() }); - } - } - } - } - } - } else { - Utility.sendAndLog(player, ChatColor.RED, "You are not permitted to modify this reinforcement"); - } - pie.setCancelled(true); - state.checkResetMode(); - default: - break; + return; + } + if (e.getClickedBlock().getState().getData() instanceof Openable) { + if (!rein.hasPermission(e.getPlayer(), Citadel.doorPerm)) { + e.setCancelled(true); + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } - - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "General Exception during player interaction", e); } } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 36a288af..2603eb13 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -45,14 +45,11 @@ import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.OldCitadelConfigManager; -import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.CitadelWorldManager; import vg.civcraft.mc.citadel.ReinforcementManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; -import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; @@ -62,8 +59,7 @@ import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; - -public class EntityListener implements Listener{ +public class EntityListener implements Listener { protected GroupManager gm = NameAPI.getGroupManager(); private ReinforcementManager rm = Citadel.getReinforcementManager(); @@ -74,16 +70,17 @@ public void explode(EntityExplodeEvent eee) { while (iterator.hasNext()) { Block b = iterator.next(); Block block = Utility.getRealBlock(b); - //if it's a plant we want to check the reinforcement of the soil block - if(Utility.isPlant(block)) { + // if it's a plant we want to check the reinforcement of the soil block + if (Utility.isPlant(block)) { Block soilBlock = Utility.findPlantSoil(block); - if(soilBlock != null && Citadel.getReinforcementManager().isReinforced(soilBlock)) { + if (soilBlock != null && Citadel.getReinforcementManager().isReinforced(soilBlock)) { block.getDrops().clear(); iterator.remove(); } } - // getRealBlock should return the block we care about so if its already in the list we know it is a double block and was already handled. - if (blocks.contains(block)){ + // getRealBlock should return the block we care about so if its already in the + // list we know it is a double block and was already handled. + if (blocks.contains(block)) { block.getDrops().clear(); iterator.remove(); continue; @@ -94,7 +91,7 @@ public void explode(EntityExplodeEvent eee) { block.getDrops().clear(); iterator.remove(); } - } catch (NoClassDefFoundError e){ + } catch (NoClassDefFoundError e) { Citadel.getInstance().getLogger().log(Level.WARNING, "Class Definition not found in explode", e); } } @@ -110,12 +107,15 @@ public void changeBlock(EntityChangeBlockEvent ecbe) { ecbe.setCancelled(maybeReinforcementDamaged(ecbe.getBlock())); } + // prevent creating golems from reinforced blocks @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void spawn(CreatureSpawnEvent cse) { - ReinforcementManager reinforcementManager = Citadel.getReinforcementManager(); + CitadelWorldManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); EntityType type = cse.getEntityType(); - if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER && type != EntityType.SILVERFISH) return; - + if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER + && type != EntityType.SILVERFISH) { + return; + } for (Block block : getGolemBlocks(type, cse.getLocation().getBlock())) { Reinforcement reinforcement = reinforcementManager.getReinforcement(block); if (reinforcement != null) { @@ -130,7 +130,8 @@ private List getGolemBlocks(EntityType type, Block base) { base = base.getRelative(BlockFace.UP); blocks.add(base); if (type == EntityType.IRON_GOLEM) { - for (BlockFace face : new BlockFace[]{ BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST }) { + for (BlockFace face : new BlockFace[] { BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, + BlockFace.WEST }) { Block arm = base.getRelative(face); if (arm.getType() == Material.IRON_BLOCK) blocks.add(arm); @@ -142,212 +143,28 @@ private List getGolemBlocks(EntityType type, Block base) { return blocks; } - @EventHandler(priority = EventPriority.HIGHEST) - public void playerQuitEvent(PlayerQuitEvent event){ - Player p = event.getPlayer(); - PlayerState state = PlayerState.get(p); - state.reset(); - } - - - //@EventHandler(priority = EventPriority.HIGHEST) - public void hangingPlaceEvent(HangingPlaceEvent event){ - Player p = event.getPlayer(); - Block b = event.getBlock().getRelative(event.getBlockFace()); - if (rm.getReinforcement(b) != null) { - //reinforcement already exists in this location from an actual physical block, so we dont want to allow entity reinforcements here. - //We even dont want to allow placement here as otherwise we would have no way to tell whether the actual underlying block or the entitiy - //"owns" the reinforcement - event.setCancelled(true); - return; - } - Inventory inv = p.getInventory(); - PlayerState state = PlayerState.get(p); - if (ReinforcementMode.REINFORCEMENT_FORTIFICATION != state.getMode()) { - return; - } - if (!canPlace(b, p)){ - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); - event.setCancelled(true); - return; - } - ReinforcementType type = state.getReinforcementType(); - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(b)) { - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); - event.setCancelled(true); - return; - } - int required = type.getRequiredAmount(); - if (type.getItemStack().isSimilar(p.getInventory().getItemInMainHand())){ - required++; - } - if (inv.containsAtLeast(type.getItemStack(), required)) { - try { - if (createPlayerReinforcement(p, state.getGroup(), b, type, p.getInventory().getItemInMainHand()) == null) { - Utility.sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); - } else { - state.checkResetMode(); - } - } catch(ReinforcemnetFortificationCancelException ex){ - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); - } - } else { - Utility.sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", - state.getReinforcementType().getMaterial().name())); - state.reset(); - event.setCancelled(true); - } - } - - //@EventHandler(priority = EventPriority.HIGHEST) - public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ - Reinforcement rein = rm.getReinforcement(event.getEntity().getLocation()); if (rein == null){return;} - if (RemoveCause.PHYSICS.equals(event.getCause())){ - //Checks if block entity was attached to was broken - if (event.getEntity().getLocation().getBlock().getRelative( - event.getEntity().getAttachedFace()).getType().equals(Material.AIR)){ - //Comment out these next two lines to keep floating hanging entities if they are reinforced - rm.deleteReinforcement(rein); - return; - } else { - event.setCancelled(true); - return; - } - } - Entity remover = event.getRemover(); if (!(remover instanceof Player)){event.setCancelled(true);return;} - Player player = (Player)remover; - Block block = event.getEntity().getLocation().getBlock(); - boolean is_cancelled = true; - if (rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement) rein; - PlayerState state = PlayerState.get(player); - ReinforcementMode mode = state.getMode(); - if (ReinforcementMode.REINFORCEMENT_INFORMATION == mode){ - Group group = pr.getGroup(); - StringBuilder sb; - if (player.hasPermission("citadel.admin.ctinfodetails")) { - Utility.sendAndLog(player, ChatColor.GREEN, String.format( - "Loc[%s]", pr.getLocation().toString())); - String groupName = "!NULL!"; - if (group != null) { - groupName = String.format("[%s]"); - } - sb = new StringBuilder(); - sb.append(String.format(" Group%s Durability[%d/%d]", - groupName, - pr.getDurability(), - ReinforcementType.getReinforcementType - (pr.getStackRepresentation()).getHitPoints())); - int maturationTime = timeUntilMature(pr); - if (maturationTime != 0) { - sb.append(" Immature["); - sb.append(maturationTime); - sb.append("]"); - } - int acidTime = timeUntilAcidMature(pr); - if (OldCitadelConfigManager.getAcidBlock() == block.getType()) { - sb.append(" Acid "); - if (acidTime != 0) { - sb.append("Immature["); - sb.append(acidTime); - sb.append("]"); - } else { - sb.append("Mature"); - } - } - if (pr.isInsecure()) { - sb.append(" (Insecure)"); - } - if (group.isDisciplined()) { - sb.append(" (Disciplined)"); - } - sb.append("\nGroup id: " + pr.getGroupId()); - - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); - event.setCancelled(is_cancelled); - return; - } - } - boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); - if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) && !pr.getGroup().isDisciplined()) { - reinforcementBroken(player, rein); - is_cancelled = false; - } else { - - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, event.getEntity().getLocation().getBlock()); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = true; - } - else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - if (!is_cancelled) { - // The player reinforcement broke. Now check for natural - is_cancelled = createNaturalReinforcement(block, player) != null; - } - } else { - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = reinforcementDamaged(player, rein); - return; - } - else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - - if (is_cancelled) { - event.setCancelled(true); - block.getDrops().clear(); - } - } - - //@EventHandler(priority = EventPriority.HIGHEST) - public void playerEntityInteractEvent(PlayerInteractEntityEvent event){ + // @EventHandler(priority = EventPriority.HIGHEST) + public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { Entity entity = event.getRightClicked(); - if (entity instanceof ItemFrame){ + if (entity instanceof ItemFrame) { Reinforcement rein = rm.getReinforcement(entity.getLocation()); if (rein == null || !(rein instanceof PlayerReinforcement)) return; - PlayerReinforcement pr = (PlayerReinforcement)rein; - Group group = pr.getGroup(); if (group == null){return;} - - if (group.isMember(event.getPlayer().getUniqueId()) == false){ - event.setCancelled(true); + PlayerReinforcement pr = (PlayerReinforcement) rein; + Group group = pr.getGroup(); + if (group == null) { return; } - } - } - - //@EventHandler(priority = EventPriority.HIGHEST) - public void entityDamageEvent(EntityDamageByEntityEvent event){ - Entity entity = event.getEntity(); - if (entity instanceof ItemFrame){ - Reinforcement rein = rm.getReinforcement(entity.getLocation()); - if (rein == null || !(rein instanceof PlayerReinforcement)) - return; - Entity damager = event.getDamager(); if (!(damager instanceof Player)){event.setCancelled(true);return;} - Player player = (Player)damager; - PlayerReinforcement pr = (PlayerReinforcement)rein; - Group group = pr.getGroup(); if (group == null){return;} - if (group.isMember(player.getUniqueId()) == false){ + if (group.isMember(event.getPlayer().getUniqueId()) == false) { event.setCancelled(true); return; } } } - @EventHandler(priority=EventPriority.LOWEST) - public void playerJoinEvent(PlayerJoinEvent event){ + @EventHandler(priority = EventPriority.LOWEST) + public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); @@ -355,8 +172,9 @@ public void playerJoinEvent(PlayerJoinEvent event){ @Override public void run() { GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); - for (String groupName : db.getGroupNames(uuid)){ - if(NameAPI.getGroupManager().hasAccess(groupName, uuid, PermissionType.getPermission("REINFORCE"))) { + for (String groupName : db.getGroupNames(uuid)) { + if (NameAPI.getGroupManager().hasAccess(groupName, uuid, + PermissionType.getPermission("REINFORCE"))) { db.updateTimestamp(groupName); } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java index b5944ddc..42969694 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -2,27 +2,44 @@ import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; public class FortificationState extends IPlayerState { private ReinforcementType type; + private Group group; - public FortificationState(Player p, boolean bypass, ReinforcementType type) { + public FortificationState(Player p, boolean bypass, ReinforcementType type, Group group) { super(p, bypass); this.type = type; + this.group = group; } @Override public void handleBlockPlace(BlockPlaceEvent e) { + //check if group still exists + if (!group.isValid()) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "The group " + group.getName() + " seems to have been deleted in the mean time"); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + return; + } + //check if player still has permission + if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm))) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + return; + } // check if reinforcement already exists Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); if (rein != null) { @@ -30,35 +47,34 @@ public void handleBlockPlace(BlockPlaceEvent e) { return; } Player player = e.getPlayer(); + //check if reinforcement can reinforce that block if (!type.canBeReinforced(e.getBlock().getType())) { e.setCancelled(true); Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + e.getBlock().getType()); return; } - ItemMap playerItems = new ItemMap(player.getInventory()); + //check inventory int available = playerItems.getAmount(type.getItem()); if (available == 0) { - // TODO leave mode + Citadel.getInstance().getStateManager().setState(player, null); e.setCancelled(true); Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); return; } + //remove from inventory ItemMap toRemove = new ItemMap(type.getItem()); if (toRemove.removeSafelyFrom(player.getInventory())) { Utility.sendAndLog(player, ChatColor.RED, "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); - // TODO exit mode + Citadel.getInstance().getStateManager().setState(player, null); return; } + //create reinforcement + ReinforcementLogic.createReinforcement(e.getBlock(), type, group); } @Override public void handleInteractBlock(PlayerInteractEvent e) { } - - @Override - public void handleBreakBlock(BlockBreakEvent e) { - } - } diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java index 1ec1369a..d1ca248a 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java @@ -17,10 +17,10 @@ import vg.civcraft.mc.citadel.reinforcement.Reinforcement; public abstract class IPlayerState { - + protected UUID uuid; private boolean bypass; - + public IPlayerState(Player p, boolean bypass) { if (p == null) { throw new IllegalArgumentException("Player for player state can not be null"); @@ -28,15 +28,15 @@ public IPlayerState(Player p, boolean bypass) { this.uuid = p.getUniqueId(); this.bypass = bypass; } - + public abstract void handleBlockPlace(BlockPlaceEvent e); - + public abstract void handleInteractBlock(PlayerInteractEvent e); - + public void handleBreakBlock(BlockBreakEvent e) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getBlock()); if (rein == null) { - //no reinforcement, normal break which we dont care about + // no reinforcement, normal break which we dont care about return; } boolean hasAccess = rein.hasPermission(e.getPlayer(), Citadel.bypassPerm); @@ -48,8 +48,16 @@ public void handleBreakBlock(BlockBreakEvent e) { } return; } + if (Utility.isPlant(e.getBlock())) { + if (rein.hasPermission(e.getPlayer(), Citadel.cropsPerm) + && !e.getBlock().getLocation().equals(rein.getLocation())) { + // allow, because player has crop permission and the only reinforcement protecting is in the soil + return; + } + } if (bypass) { - Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, "You could bypass this reinforcement if you turn bypass mode on with '/ctb'"); + Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, + "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); } e.setCancelled(true); double damage = ReinforcementLogic.getDamageApplied(e.getPlayer(), rein); diff --git a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java index 9dc6e2a1..de756f66 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -6,7 +6,6 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; -import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -84,8 +83,4 @@ private static String formatHealth(Reinforcement rein) { roundingFormat.format(rein.getHealth()), rein.getType().getHealth()); } - @Override - public void handleBreakBlock(BlockBreakEvent e) { - } - } diff --git a/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java new file mode 100644 index 00000000..b7c36771 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -0,0 +1,42 @@ +package vg.civcraft.mc.citadel.playerstate; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; + +public class InsecureState extends IPlayerState { + + public InsecureState(Player p, boolean bypass) { + super(p, bypass); + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + if (rein == null) { + return; + } + e.setCancelled(true); + if (rein.hasPermission(e.getPlayer(), Citadel.insecurePerm)) { + rein.toggleInsecure(); + if (rein.isInsecure()) { + Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, e.getClickedBlock().getType().name() + " is now insecure"); + } else { + Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, e.getClickedBlock().getType().name() + " is now secure"); + } + } else { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "You are not allowed to make this reinforcement insecure"); + } + } + +} diff --git a/src/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/vg/civcraft/mc/citadel/playerstate/NormalState.java new file mode 100644 index 00000000..57bef29f --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -0,0 +1,26 @@ +package vg.civcraft.mc.citadel.playerstate; + +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class NormalState extends IPlayerState { + + public NormalState(Player p, boolean bypass) { + super(p, bypass); + // TODO Auto-generated constructor stub + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + + + } + +} diff --git a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java new file mode 100644 index 00000000..81a22512 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -0,0 +1,123 @@ +package vg.civcraft.mc.citadel.playerstate; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; +import vg.civcraft.mc.citadel.events.ReinforcementGroupChangeEvent; +import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; + +public class ReinforcingState extends IPlayerState { + + private Group group; + + public ReinforcingState(Player p, boolean bypass, Group group) { + super(p, bypass); + this.group = group; + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + // always cancel + e.setCancelled(true); + // does group still exist? + if (!group.isValid()) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "The group " + group.getName() + " seems to have been deleted in the mean time"); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + return; + } + Player player = e.getPlayer(); + // does the player have an item? + if (e.getItem() == null) { + Utility.sendAndLog(player, ChatColor.RED, "You have nothing in your hand to reinforce with"); + return; + } + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(e.getItem()); + // is it a valid item to reinforce with + if (type == null) { + Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + return; + } + // can the item reinforce the clicked block + if (!type.canBeReinforced(e.getClickedBlock().getType())) { + Utility.sendAndLog(player, ChatColor.RED, + type.getName() + " can not reinforce " + e.getClickedBlock().getType()); + return; + } + // does the player have permission to reinforce on that group + if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm))) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You seem to have lost permission to reinforce on " + group.getName()); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + // if reinforcement exists, check if player has permission to edit it + if (rein != null) { + if (!rein.hasPermission(e.getPlayer(), Citadel.bypassPerm)) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You do not have permission to bypass reinforcements on " + group.getName()); + return; + } + } + // check inventory for reinforcement item + ItemMap toConsume = new ItemMap(type.getItem()); + if (!toConsume.isContainedIn(player.getInventory())) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); + return; + } + // consume item from inventory + if (!toConsume.removeSafelyFrom(player.getInventory())) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "Failed to remove reinforcement item from your inventory"); + return; + } + + if (rein == null) { + // just create new reinforcement + ReinforcementLogic.createReinforcement(e.getClickedBlock(), type, group); + } else { + // replace existing one + boolean changedGroup = false; + if (group.getGroupId() != rein.getGroup().getGroupId()) { + // switch group + ReinforcementGroupChangeEvent rgce = new ReinforcementGroupChangeEvent(player, rein, group); + Bukkit.getPluginManager().callEvent(rgce); + if (!rgce.isCancelled()) { + rein.setGroup(group); + changedGroup = true; + } + // informing the user is up to whoever cancelled it + } + if (type != rein.getType()) { + // switch type + ReinforcementChangeTypeEvent rcte = new ReinforcementChangeTypeEvent(player, rein, type); + Bukkit.getPluginManager().callEvent(rcte); + if (!rcte.isCancelled()) { + rein.setType(type); + Utility.sendAndLog(player, ChatColor.GREEN, + "Updated reinforcement to " + rein.getType().getName() + " on " + group.getName()); + } else if (changedGroup) { + Utility.sendAndLog(player, ChatColor.GREEN, "Updated group to " + group.getName()); + } + } + } + } + +} diff --git a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java index ac0cb73c..882b33da 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java @@ -3,6 +3,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; +import vg.civcraft.mc.citadel.ChunkCache; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; @@ -13,16 +14,17 @@ public class Reinforcement { private final long creationTime; - private final ReinforcementType type; + private ReinforcementType type; private final Location loc; private double health; protected boolean isDirty; protected boolean isNew; - private final int groupId; + private int groupId; private boolean insecure; + private ChunkCache owningCache; public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, - boolean isDirty, boolean isNew, boolean insecure) { + boolean isDirty, boolean isNew, boolean insecure, ChunkCache cache) { if (loc == null) { throw new IllegalArgumentException("Location for reinforcement can not be null"); } @@ -37,10 +39,11 @@ public Reinforcement(Location loc, ReinforcementType type, int groupID, long cre this.groupId = groupID; this.isNew = isNew; this.insecure = insecure; + this.owningCache = cache; } - public Reinforcement(Location loc, ReinforcementType type, Group group) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + public Reinforcement(Location loc, ReinforcementType type, Group group, ChunkCache cache) { + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false, cache); } /** @@ -50,7 +53,7 @@ public Reinforcement(Location loc, ReinforcementType type, Group group) { */ public void setHealth(double health) { this.health = health; - isDirty = true; + setDirty(true); if (health <= 0) { Citadel.getInstance().getReinforcementManager().removeReinforcement(this); } @@ -102,19 +105,38 @@ public boolean isDirty() { } /** - * Sets if this reinforcement needs to be saved to the database or not. + * Sets if this reinforcement needs to be saved to the database or not. Will + * automatically update the dirty flag of the cache holding this reinforcement + * as well * * @param dirty */ public void setDirty(boolean dirty) { - isDirty = dirty; + this.isDirty = dirty; if (!dirty) { + // we saved to the database, so we are no longer new now isNew = false; + } else { + owningCache.setDirty(true); } } /** - * @return True if the reinforcement has not been written to the database since its creation + * Switches the insecure flag of the reinforcement + */ + public void toggleInsecure() { + insecure = !insecure; + setDirty(true); + } + + public void setType(ReinforcementType type) { + this.type = type; + setDirty(true); + } + + /** + * @return True if the reinforcement has not been written to the database since + * its creation */ public boolean isNew() { return isNew; @@ -144,6 +166,14 @@ public Group getGroup() { public int getGroupId() { return groupId; } + + public void setGroup(Group group) { + if (group == null) { + throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); + } + this.groupId = group.getGroupId(); + setDirty(true); + } /** * @return Type of this reinforcement From 2ecc2494233fbe5968e9f7b5a81738b40807be76 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 13 Mar 2019 19:39:19 +0100 Subject: [PATCH 110/255] Most commands done --- plugin.yml | 44 ++++-- src/vg/civcraft/mc/citadel/AcidManager.java | 14 +- .../mc/citadel/ReinforcementLogic.java | 13 +- .../mc/citadel/ReinforcementTypeManager.java | 5 + src/vg/civcraft/mc/citadel/Utility.java | 2 +- .../civcraft/mc/citadel/command/Bypass.java | 34 ++--- .../mc/citadel/command/Fortification.java | 120 ++++++---------- .../mc/citadel/command/Information.java | 41 ++---- .../civcraft/mc/citadel/command/Insecure.java | 42 ++---- .../mc/citadel/command/Materials.java | 55 -------- src/vg/civcraft/mc/citadel/command/Off.java | 31 +---- .../mc/citadel/command/Reinforce.java | 97 +++++-------- .../mc/citadel/command/ReinforcementsGUI.java | 89 +++++------- .../mc/citadel/command/SetLogging.java | 127 ----------------- src/vg/civcraft/mc/citadel/command/Stats.java | 130 ------------------ .../database/CitadelReinforcementData.java | 2 + .../mc/citadel/listener/EntityListener.java | 88 ++---------- .../playerstate/FortificationState.java | 8 ++ .../mc/citadel/playerstate/IPlayerState.java | 7 +- .../citadel/playerstate/ReinforcingState.java | 4 + .../reinforcementtypes/ReinforcementType.java | 2 +- 21 files changed, 258 insertions(+), 697 deletions(-) delete mode 100644 src/vg/civcraft/mc/citadel/command/Materials.java delete mode 100644 src/vg/civcraft/mc/citadel/command/SetLogging.java delete mode 100644 src/vg/civcraft/mc/citadel/command/Stats.java diff --git a/plugin.yml b/plugin.yml index e327cb09..420697d0 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,13 +1,18 @@ name: ${project.name} main: vg.civcraft.mc.citadel.Citadel version: ${project.version} -author: Rourke750 +authors: [Rourke750, Maxopoly] depend: [NameLayer, CivModCore] softdepend: [Mercury, BetterShards] description: Citadel allows you to make blocks difficult to break. When a block is reinforced, it must be broken many times before it is destroyed. commands: ctr: aliases: [ctreinforce, reinforce, protect, cprivate, lwc, private] + usage: /ctr [group] + description: 'Enters reinforcing mode. Interacting with blocks in reinforcing mode will reinforce them or modify their reinforcement' + min-args: 0 + max-args: 1 + player-only: true ctacid: usage: /ctacid description: 'Removes the block above it if used on an acid block' @@ -16,31 +21,54 @@ commands: player-only: true ctf: aliases: [ctfortify, fortify] + usage: /ctf [group] + description: 'Enters fortification mode. All blocks placed in fortification mode will automatically be reinforced. If no group is given, your default group will be used' + min-args: 0 + max-args: 1 + player-only: true ctb: aliases: [ctbypass, bypass] + usage: /ctb + description: 'Toggles bypass state. In bypass state you can break blocks reinforced on groups you have access to in a single break' + min-args: 0 + max-args: 0 + player-only: true cti: aliases: [ctinformation, info, ctinfo] + usage: /cti + description: 'Enters information mode. Interacting with blocks in information mode will show information on their reinforcement' + min-args: 0 + max-args: 0 + player-only: true ctin: - aliases: [ctinsecure] + aliases: [ctinsecure, insecure] + usage: /ctin + description: 'Enters insecure mode. Interacting with containers in insecure mode will switch their insecure flag. Insecure containers can interact with hoppers reinforced on a different group. All containers are secure by default' + min-args: 0 + max-args: 0 + player-only: true ctm: aliases: [ctmaterials, materials] cto: aliases: [ctoff, off] - cts: - aliases: [ctstats] - permission: citadel.admin + usage: /cto + description: 'Leaves all reinforcement modes' + min-args: 0 + max-args: 0 + player-only: true ctur: permission: citadel.admin ctar: permission: citadel.admin aliases: [ctareareinforce] - ctsl: - permission: citadel.admin - aliases: [ctsetlogging] cte: aliases: [cteasy,toggleeasymode] ctdl: aliases: [reinforcements,rein] + usage: /ctdl + description: 'Opens a GUI displaying all reinforcement materials' + min-args: 0 + max-args: 0 permissions: citadel.admin: default: op diff --git a/src/vg/civcraft/mc/citadel/AcidManager.java b/src/vg/civcraft/mc/citadel/AcidManager.java index 5ac6f977..163b8167 100644 --- a/src/vg/civcraft/mc/citadel/AcidManager.java +++ b/src/vg/civcraft/mc/citadel/AcidManager.java @@ -8,6 +8,7 @@ import org.bukkit.block.Block; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; public class AcidManager { @@ -42,7 +43,18 @@ public boolean isPossibleAcidBlock(Block b) { * an acid timer configured */ public boolean canBeAcidBlock(Reinforcement rein) { - return rein.getType().getAcidTime() >= 0; + return canBeAcidBlock(rein.getType()); + } + + /** + * Checks if acid blocking is enabled for this reinforcement type + * + * @param rein Reinforcement type to check for + * @return True if the reinforcement type can acid block other reinforcements and has + * an acid timer configured + */ + public boolean canBeAcidBlock(ReinforcementType type) { + return type.getAcidTime() >= 0; } /** diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java index 57e316ef..0cd96a06 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -29,13 +29,18 @@ public static void createReinforcement(Block block, ReinforcementType type, Grou CitadelWorldManager worldManager = Citadel.getInstance().getReinforcementManager(); } - public static Reinforcement getReinforcementProtecting(Block b) { + public static void damageReinforcement(Reinforcement rein, double damage) { + rein.setHealth(rein.getHealth() - damage); + rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + } + + public static Reinforcement getReinforcementProtecting(Block b) { Reinforcement directReinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(b); if (directReinforcement != null) { return directReinforcement; } Block actual = getResponsibleBlock(b); - return getChestReinforcement(actual); + return resolveDoubleChestReinforcement(actual); } /** @@ -90,7 +95,7 @@ public static Block getResponsibleBlock(Block block) { return block; } - public static Reinforcement getChestReinforcement(Block b) { + public static Reinforcement resolveDoubleChestReinforcement(Block b) { Material mat = b.getType(); CitadelWorldManager reinMan = Citadel.getInstance().getReinforcementManager(); Reinforcement rein = reinMan.getReinforcement(b); @@ -124,7 +129,7 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { return false; } if (block.getState() instanceof InventoryHolder) { - Reinforcement rein = ReinforcementLogic.getChestReinforcement(block); + Reinforcement rein = ReinforcementLogic.resolveDoubleChestReinforcement(block); if (rein == null) { return false; } diff --git a/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java b/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java index 999928ba..d7fdf07b 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -32,5 +33,9 @@ public ReinforcementType getByItemStack(ItemStack is) { copy.setAmount(1); return typesByItem.get(copy); } + + public Collection getAllTypes() { + return typesById.values(); + } } diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 15e2503f..25721c12 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -594,7 +594,7 @@ public static boolean reinforcementBroken(Player player, Reinforcement reinforce if ((material.getGracePeriod() > 0 && pr.getMaturationTime() > 0 && pr.getHealth() >= 1.0 && material.getMaturationTime() - timeUntilMature(pr) < material.getGracePeriod() ) || // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. - rng.nextDouble() < pr.getHealth() * material.getPercentReturn()) { + rng.nextDouble() < pr.getHealth() * material.getReturnChance()) { Location location = pr.getLocation(); if (player != null){ diff --git a/src/vg/civcraft/mc/citadel/command/Bypass.java b/src/vg/civcraft/mc/citadel/command/Bypass.java index f400c8fc..b3da2e86 100644 --- a/src/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/vg/civcraft/mc/citadel/command/Bypass.java @@ -7,32 +7,24 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -public class Bypass extends PlayerCommand{ - public Bypass(String name) { - super(name); - setIdentifier("ctb"); - setDescription("Used to bypass block reinforcements."); - setUsage("/ctb"); - setArguments(0,0); - } +@CivCommand(id = "ctb") +public class Bypass extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to perform that command."); - return true; - } - Player p = (Player) sender; - PlayerState state = PlayerState.get(p); - if (state.toggleBypassMode()){ - Utility.sendAndLog(p, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); - } - else { - Utility.sendAndLog(p, ChatColor.GREEN, "Bypass mode has been disabled."); + Player player = (Player) sender; + IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState.isBypassEnabled()) { + Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); + } else { + Utility.sendAndLog(player, ChatColor.GREEN, + "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/Fortification.java b/src/vg/civcraft/mc/citadel/command/Fortification.java index 80c9f7d4..55980fe7 100644 --- a/src/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/Fortification.java @@ -5,117 +5,81 @@ import java.util.UUID; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementMode; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.PlayerStateManager; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.playerstate.FortificationState; +import vg.civcraft.mc.citadel.playerstate.IPlayerState; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Fortification extends PlayerCommand{ - private GroupManager gm = NameAPI.getGroupManager(); - - public Fortification(String name) { - super(name); - setIdentifier("ctf"); - setDescription("Allows you to place already reinforced blocks. Use /fortify groupname with a reinforcement material in your hand, then place down blocks and they will automatically be reinforced to groupname."); - setUsage("/ctf "); - setArguments(0,1); - } +@CivCommand(id = "ctf") +public class Fortification extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to perform this command."); - return true; - } - Player p = (Player) sender; - UUID uuid = NameAPI.getUUID(p.getName()); + Player player = (Player) sender; + UUID uuid = NameAPI.getUUID(player.getName()); String groupName = null; - if(args.length == 0){ - groupName = gm.getDefaultGroup(uuid); - if(groupName == null){ - Utility.sendAndLog(p, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); + if (args.length == 0) { + groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); + if (groupName == null) { + Utility.sendAndLog(player, ChatColor.RED, + "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); return true; } - } - else{ + } else { groupName = args[0]; } - Group g = GroupManager.getGroup(groupName); - if (g == null){ - Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); - return true; - } - - PlayerType type = g.getPlayerType(uuid); - if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ - Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); - return true; - } - if (!p.hasPermission("citadel.admin") && !p.isOp() && !gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("REINFORCE"))){ - Utility.sendAndLog(p, ChatColor.RED, "You do not have permission to " - + "place a reinforcement on this group."); + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + Group group = GroupManager.getGroup(groupName); + if (group == null) { + Utility.sendAndLog(player, ChatColor.RED, "The group" + groupName + "does not exist."); + stateManager.setState(player, null); return true; } - - PlayerState state = PlayerState.get(p); - boolean inFortificationMode = ReinforcementMode.REINFORCEMENT_FORTIFICATION.equals(state.getMode()); - boolean noGroupSpecified = args.length == 0; - boolean noGroupChange = ( - state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())); - ItemStack stack = p.getInventory().getItemInMainHand(); - ReinforcementType reinType = ReinforcementType.getReinforcementType(stack); - boolean noMaterialChange = reinType != null && reinType.equals(state.getReinforcementType()); - if (inFortificationMode && (noGroupSpecified || (noGroupChange && noMaterialChange))) { - Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); - state.reset(); + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager() + .getByItemStack(player.getInventory().getItemInMainHand()); + if (type == null) { + Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + stateManager.setState(player, null); return true; } - - if (stack.getType() == Material.AIR) { - Utility.sendAndLog(p, ChatColor.RED, "You need to be holding something to fortify with, try holding a stone block in your hand."); + boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm)); + if (!hasAccess) { + Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + stateManager.setState(player, null); return true; } - if (reinType == null) { - Utility.sendAndLog(p, ChatColor.RED, "You can't use the item in your hand to reinforce. Try using a stone block."); - return true; + IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState instanceof FortificationState) { + FortificationState fortState = (FortificationState) currentState; + if (fortState.getGroup() == group && fortState.getType() == type) { + stateManager.setState(player, null); + return true; + } } - String hoverMessage = String.format("Material: %s\nGroup: %s", reinType.getMaterial().toString(), groupName); - Utility.sendAndLog( - p, - ChatColor.GREEN, - "You are now in Fortification mode, place blocks down and they will be secured with the material in your hand.\n" - + " Type /fortify or /cto to turn this off when you are done.", - hoverMessage); - state.setMode(ReinforcementMode.REINFORCEMENT_FORTIFICATION); - state.setFortificationItemStack(reinType.getItemStack()); - state.setGroup(g); + stateManager.setState(player, new FortificationState(player, currentState.isBypassEnabled(), type, group)); return true; } @Override public List tabComplete(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) - return null; - if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission("REINFORCE"), (Player)sender); + return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission("REINFORCE"), (Player)sender); - else{ + return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); + else { return new ArrayList(); } } diff --git a/src/vg/civcraft/mc/citadel/command/Information.java b/src/vg/civcraft/mc/citadel/command/Information.java index fcda7c9e..f8f88d5d 100644 --- a/src/vg/civcraft/mc/citadel/command/Information.java +++ b/src/vg/civcraft/mc/citadel/command/Information.java @@ -3,40 +3,29 @@ import java.util.ArrayList; import java.util.List; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementMode; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.PlayerStateManager; +import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.InformationState; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -public class Information extends PlayerCommand{ - - public Information(String name) { - super(name); - setIdentifier("cti"); - setDescription("Get information about a clicked block."); - setUsage("/cti"); - setArguments(0,0); - } +@CivCommand(id = "cti") +public class Information extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to perform that command."); - return true; - } - Player p = (Player) sender; - PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.REINFORCEMENT_INFORMATION){ - Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); - state.reset(); + Player player = (Player) sender; + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState instanceof InformationState) { + stateManager.setState(player, null); } - else{ - Utility.sendAndLog(p, ChatColor.GREEN, "You are now in Information mode, click on blocks to see their reinforcement information! \n Type /cti or /cto to turn this off."); - state.setMode(ReinforcementMode.REINFORCEMENT_INFORMATION); + else { + stateManager.setState(player, new InformationState(player, currentState.isBypassEnabled())); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/Insecure.java b/src/vg/civcraft/mc/citadel/command/Insecure.java index a3397669..e668b9b1 100644 --- a/src/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/vg/civcraft/mc/citadel/command/Insecure.java @@ -3,41 +3,29 @@ import java.util.ArrayList; import java.util.List; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.ReinforcementMode; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.PlayerStateManager; +import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.InsecureState; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -public class Insecure extends PlayerCommand{ - - public Insecure(String name) { - super(name); - setIdentifier("ctin"); - setDescription("Set a block to an insecure reinforcement."); - setUsage("/ctin"); - setArguments(0,0); - } +@CivCommand(id = "ctin") +public class Insecure extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to perform that command."); - return true; - } - Player p = (Player) sender; - PlayerState state = PlayerState.get(p); - if (state.getMode() == ReinforcementMode.INSECURE){ - Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); - state.reset(); + Player player = (Player) sender; + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState instanceof InsecureState) { + stateManager.setState(player, null); } - else{ - Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode changed to " - + ReinforcementMode.INSECURE.name() + "."); - state.setMode(ReinforcementMode.INSECURE); + else { + stateManager.setState(player, new InsecureState(player, currentState.isBypassEnabled())); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/Materials.java b/src/vg/civcraft/mc/citadel/command/Materials.java deleted file mode 100644 index 4ce7d7b6..00000000 --- a/src/vg/civcraft/mc/citadel/command/Materials.java +++ /dev/null @@ -1,55 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; - -public class Materials extends PlayerCommand{ - - public Materials(String name) { - super(name); - setIdentifier("ctm"); - setDescription("Shows a list of all the ReinforcementTypes."); - setUsage("/ctm"); - setArguments(0,0); - } - - @Override - public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to run this command."); - return true; - } - Player p = (Player) sender; - List types = ReinforcementType.getReinforcementTypes(); - String t = "The ItemStacks are as follows: \n"; - for (ReinforcementType type: types){ - t += type.getMaterial().name() + ":\n "; - t += "Amount: " + type.getRequiredAmount() + ".\n "; - t += "Strength: " + type.getHitPoints() + ".\n "; - t += "Material: " + type.getMaterial() + ".\n "; - t += "Maturation: " + type.getMaturationTime() + ".\n "; - t += "Acid Maturation: " + type.getAcidTime() + ".\n "; - if (type.getItemStack().getItemMeta().hasLore()){ - t += "Lore: "; - for (String x: type.getItemStack().getItemMeta().getLore()) - t += x + "\n "; - } - t += "-------\n"; - } - p.sendMessage(ChatColor.GREEN + t); - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); - } - -} diff --git a/src/vg/civcraft/mc/citadel/command/Off.java b/src/vg/civcraft/mc/citadel/command/Off.java index 7f0f4445..46319b81 100644 --- a/src/vg/civcraft/mc/citadel/command/Off.java +++ b/src/vg/civcraft/mc/citadel/command/Off.java @@ -7,36 +7,17 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -public class Off extends PlayerCommand{ - - public Off(String name) { - super(name); - setIdentifier("cto"); - setDescription("Turns all Reinforcement Modes off."); - setUsage("/cto"); - setArguments(0,0); - } +@CivCommand(id = "cto") +public class Off extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to run this command."); - return true; - } - Player p = (Player) sender; - PlayerState state = PlayerState.get(p); - state.reset(); - if (state.isBypassMode()) { - state.toggleBypassMode(); - } - if (state.getEasyMode()) { - state.toggleEasyMode(); - } - Utility.sendAndLog(p, ChatColor.GREEN, "Reinforcement mode has been set to Normal."); + Citadel.getInstance().getStateManager().setState((Player) sender, null); return true; } diff --git a/src/vg/civcraft/mc/citadel/command/Reinforce.java b/src/vg/civcraft/mc/citadel/command/Reinforce.java index abe0d568..17afbb8d 100644 --- a/src/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/Reinforce.java @@ -8,10 +8,17 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.PlayerState; +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.PlayerStateManager; import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.playerstate.FortificationState; +import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.ReinforcingState; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameAPI; @@ -19,75 +26,47 @@ import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Reinforce extends PlayerCommand { - - private GroupManager gm = NameAPI.getGroupManager(); - - public Reinforce(String name) { - super(name); - setIdentifier("ctr"); - setDescription("Reinforce blocks under a group."); - setUsage("/ctr "); - setArguments(0,1); - } +@CivCommand(id = "ctr") +public class Reinforce extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("Must be a player to use that command."); - return true; - } + Player player = (Player) sender; + UUID uuid = NameAPI.getUUID(player.getName()); String groupName = null; - Player p = (Player) sender; - UUID uuid = NameAPI.getUUID(p.getName()); - if(args.length == 0){ - groupName = gm.getDefaultGroup(uuid); - if(groupName == null){ - Utility.sendAndLog(p, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or /create groupname if you don't have a group yet."); + if (args.length == 0) { + groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); + if (groupName == null) { + Utility.sendAndLog(player, ChatColor.RED, + "You need to reinforced to a group! Try /reinforce groupname. \n Or use /create groupname if you don't have a group yet."); return true; } - } - else{ + } else { groupName = args[0]; } - Group g = GroupManager.getGroup(groupName); - if (g == null){ - Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + Group group = GroupManager.getGroup(groupName); + if (group == null) { + Utility.sendAndLog(player, ChatColor.RED, "The group" + groupName + "does not exist."); + stateManager.setState(player, null); return true; } - PlayerType type = g.getPlayerType(uuid); - if (!p.hasPermission("citadel.admin") && !p.isOp() && type == null){ - Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); + boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm)); + if (!hasAccess) { + Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + stateManager.setState(player, null); return true; } - if (!p.hasPermission("citadel.admin") && !p.isOp() && !gm.hasAccess(g.getName(), p.getUniqueId(), PermissionType.getPermission("REINFORCE"))){ - Utility.sendAndLog(p, ChatColor.RED, "You do not have permission to " - + "place a reinforcement on this group."); - return true; - } - - PlayerState state = PlayerState.get(p); - boolean inReinforcementMode = ReinforcementMode.REINFORCEMENT.equals(state.getMode()); - boolean noGroupSpecified = args.length == 0; - boolean noGroupChange = ( - state.getGroup() != null - && state.getGroup().getName() != null - && state.getGroup().getName().equals(g.getName())); - if (inReinforcementMode && (noGroupSpecified || noGroupChange)) { - Utility.sendAndLog(p, ChatColor.GREEN, state.getMode().name() + " has been disabled"); - state.reset(); - return true; + IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState instanceof ReinforcingState) { + ReinforcingState reinState = (ReinforcingState) currentState; + if (reinState.getGroup() == group) { + stateManager.setState(player, null); + return true; + } } - - String hoverMessage = String.format("Group: %s", groupName); - Utility.sendAndLog( - p, - ChatColor.GREEN, - "You are now in Reinforcement mode, hit blocks with a reinforcement material to secure them.\n" - + " Type /reinforce or /cto to turn this off when you are done.", - hoverMessage); - state.setMode(ReinforcementMode.REINFORCEMENT); - state.setGroup(g); + stateManager.setState(player, new ReinforcingState(player, currentState.isBypassEnabled(), group)); return true; } @@ -97,9 +76,9 @@ public List tabComplete(CommandSender sender, String[] args) { return null; if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission("REINFORCE"), (Player)sender); + return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), (Player)sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission("REINFORCE"), (Player)sender); + return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player)sender); else { return new ArrayList(); } diff --git a/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java index 6312b5d4..aafdc964 100644 --- a/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java +++ b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -1,92 +1,77 @@ package vg.civcraft.mc.citadel.command; import java.text.DecimalFormat; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.TimeUnit; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import net.md_5.bungee.api.ChatColor; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; +import vg.civcraft.mc.civmodcore.inventorygui.Clickable; import vg.civcraft.mc.civmodcore.inventorygui.ClickableInventory; import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; +import vg.civcraft.mc.civmodcore.inventorygui.IClickable; +import vg.civcraft.mc.civmodcore.inventorygui.MultiPageView; import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; +import vg.civcraft.mc.civmodcore.util.TextUtil; -public class ReinforcementsGUI extends PlayerCommand { +@CivCommand(id = "ctdl") +public class ReinforcementsGUI extends StandaloneCommand { - private DecimalFormat format; - - public ReinforcementsGUI(String name) { - super(name); - setIdentifier("ctdl"); - setDescription("Open GUI to display all reinforcement materials"); - setUsage("/ctdl"); - setArguments(0, 0); - this.format = new DecimalFormat("##.##"); - } + private DecimalFormat format = new DecimalFormat("##.##"); @Override public boolean execute(CommandSender sender, String[] arg1) { - if (!(sender instanceof Player)) { - sender.sendMessage(ChatColor.RED + "Sorry bae, I cant open GUIs for you"); - return true; - } - List types = ReinforcementType.getReinforcementTypes(); + List types = new LinkedList<>( + Citadel.getInstance().getReinforcementTypeManager().getAllTypes()); int rows = types.size() / 9; if ((types.size() % 9) != 0) { rows++; } - //sort ascending by health + // sort ascending by health Collections.sort(types, new Comparator() { @Override public int compare(ReinforcementType o1, ReinforcementType o2) { - return new Integer(o1.getHitPoints()).compareTo(o2.getHitPoints()); + return Double.compare(o1.getHealth(), o2.getHealth()); } }); - ClickableInventory ci = new ClickableInventory(rows * 9, ChatColor.GOLD + "Citadel"); - int slot = 0; - List items = new LinkedList(); + + List clicks = new LinkedList(); for (ReinforcementType type : types) { - ItemStack is = type.getItemStack().clone(); - is.setAmount(type.getRequiredAmount()); - ISUtils.addLore(is, ChatColor.GREEN + "Hit points: " + type.getHitPoints()); - int daysMature = type.getMaturationTime() / 60 / 24; - int hoursMature = (type.getMaturationTime() - (daysMature * 60 * 24)) / 60; - int minutesMature = (type.getMaturationTime() - (daysMature * 60 * 24) - (hoursMature * 60)); - String matureString = ChatColor.AQUA + "Maturation time: " + createOutputTime(daysMature, "day") - + createOutputTime(hoursMature, "hour") + createOutputTime(minutesMature, "minute"); - ISUtils.addLore(is, matureString.substring(0, matureString.length() - 2)); - int daysAcid = type.getAcidTime() / 60 / 24; - int hoursAcid = (type.getAcidTime() - (daysAcid * 60 * 24)) / 60; - int minutesAcid = (type.getAcidTime() - (daysAcid * 60 * 24) - (hoursAcid * 60)); - String acidString = ChatColor.GOLD + "Acidblock maturation time: " + createOutputTime(daysAcid, "day") - + createOutputTime(hoursAcid, "hour") + createOutputTime(minutesAcid, "minute"); - ISUtils.addLore(is, acidString.substring(0, acidString.length() - 2)); - ISUtils.addLore(is, ChatColor.WHITE + "Return chance: " + format.format(type.getPercentReturn() * 100.0) + " %"); - items.add(is); - ci.setSlot(new DecorationStack(is), slot); - slot++; + ItemStack is = type.getItem().clone(); + ISUtils.setName(is, ChatColor.AQUA + type.getName()); + ISUtils.addLore(is, ChatColor.GREEN + "Health: " + format.format(type.getHealth())); + ISUtils.addLore(is, ChatColor.GOLD + "Maturation time: " + + TextUtil.formatDuration(type.getMaturationTime(), TimeUnit.MILLISECONDS)); + if (Citadel.getInstance().getAcidManager().canBeAcidBlock(type)) { + ISUtils.addLore(is, ChatColor.GOLD + "Acid maturation time: " + + TextUtil.formatDuration(type.getAcidTime(), TimeUnit.MILLISECONDS)); + } else { + ISUtils.addLore(is, ChatColor.GOLD + "Can not be used for acid"); + } + ISUtils.addLore(is, + ChatColor.WHITE + "Return chance: " + format.format(type.getReturnChance() * 100.0) + " %"); + IClickable click = new DecorationStack(is); + clicks.add(click); } - ci.showInventory((Player) sender); + MultiPageView pageView = new MultiPageView((Player) sender, clicks, + org.bukkit.ChatColor.GOLD + "Reinforcements", true); + pageView.showScreen(); return true; } - private String createOutputTime(int value, String timeUnit) { - if (value == 0) { - return ""; - } - if (value == 1) { - return value + " " + timeUnit + ", "; - } - return value + " " + timeUnit + "s, "; - } - @Override public List tabComplete(CommandSender arg0, String[] arg1) { return null; diff --git a/src/vg/civcraft/mc/citadel/command/SetLogging.java b/src/vg/civcraft/mc/citadel/command/SetLogging.java deleted file mode 100644 index fdc92bef..00000000 --- a/src/vg/civcraft/mc/citadel/command/SetLogging.java +++ /dev/null @@ -1,127 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.OldCitadelConfigManager; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; - -public class SetLogging extends PlayerCommand { - - public SetLogging(String name) { - super(name); - setIdentifier("ctsl"); - setDescription("Allows admins to toggle special logging types live or show current status"); - setUsage("/ctsl [internal|playercommands|breaks|hostilebreaks|damage|reinforcements [on|off]]"); - setArguments(0, 2); - } - - @Override - public boolean execute(CommandSender sender, String[] args) { - if (args.length > 0 && !cmds.contains(args[0])) { - return false; - } - - if (args.length >= 1 && !flgs.contains(args[1])) { - return false; - } - - if (!(sender instanceof ConsoleCommandSender) && !sender.isOp() && !sender.hasPermission("citadel.admin")) { - // This should never actually happen thanks to the plugin.yml, but - // we just want to be sure - Utility.sendAndLog(sender, ChatColor.RED, "Nice try"); - return true; - } - - // validated, so lets just do it. - if (args.length == 0) { - StringBuilder sb = new StringBuilder("Current deep logging set to: \n"); - sb.append(" Internal: ").append(OldCitadelConfigManager.shouldLogInternal()).append("\n"); - sb.append(" Player Command Responses: ").append(OldCitadelConfigManager.shouldLogPlayerCommands()).append("\n"); - sb.append(" Friendly/CTB Breaks: ").append(OldCitadelConfigManager.shouldLogFriendlyBreaks()).append("\n"); - sb.append(" Hostile Breaks: ").append(OldCitadelConfigManager.shouldLogHostileBreaks()).append("\n"); - sb.append(" Damage: ").append(OldCitadelConfigManager.shouldLogDamage()).append("\n"); - sb.append(" Reinforcements: ").append(OldCitadelConfigManager.shouldLogReinforcement()).append("\n"); - - Utility.sendAndLog(sender, ChatColor.GREEN, sb.toString()); - } - - String flag = null; - boolean newval = false; - if (args.length >= 1) { - if ("internal".equalsIgnoreCase(args[0])) { - flag = "internal_logging"; - newval = OldCitadelConfigManager.shouldLogInternal(); - } else if ("playercommands".equalsIgnoreCase(args[0])) { - flag = "command_logging"; - newval = OldCitadelConfigManager.shouldLogPlayerCommands(); - } else if ("breaks".equalsIgnoreCase(args[0])) { - flag = "break_logging"; - newval = OldCitadelConfigManager.shouldLogFriendlyBreaks(); - } else if ("hostilebreaks".equalsIgnoreCase(args[0])) { - flag = "hostile_logging"; - newval = OldCitadelConfigManager.shouldLogHostileBreaks(); - } else if ("damage".equalsIgnoreCase(args[0])) { - flag = "damage_logging"; - newval = OldCitadelConfigManager.shouldLogDamage(); - } else if ("reinforcements".equalsIgnoreCase(args[0])) { - flag = "reinf_logging"; - newval = OldCitadelConfigManager.shouldLogReinforcement(); - } - } - - if (args.length < 2) { - newval = !newval; // invert current. - } else { - // If can't figure it out, leave current. - newval = "on".equalsIgnoreCase(args[1])? true : "off".equalsIgnoreCase(args[1]) ? false : newval; - } - - if (flag != null) { - Citadel.getInstance().getConfig().set(flag, newval); - Utility.sendAndLog(sender, ChatColor.GREEN, "Flag " + flag + " is " + (newval ? "on" : "off")); - return true; - } else { - Utility.sendAndLog(sender, ChatColor.RED, "Unknown setting!"); - return false; - } - } - - private static List cmds = Arrays.asList("internal","playercommands", "hostilebreaks", "breaks", "damage", "reinforcements"); - private static List flgs = Arrays.asList("on", "off"); - @Override - public List tabComplete(CommandSender arg0, String[] arg1) { - if (arg1.length == 0) { - return cmds; - } else if (arg1.length == 1) { - ArrayList lst = new ArrayList(); - for (String cmd : cmds) { - if (cmd.toLowerCase().equals(arg1[0])) { - return flgs; - } else if (cmd.contains(arg1[0].toLowerCase())) { - lst.add(cmd); - } - } - return lst; - } else if (arg1.length == 2) { - ArrayList lst = new ArrayList(); - for (String flg : flgs) { - if (flg.toLowerCase().equals(arg1[1])) { - return flgs; - } else if (flg.contains(arg1[1].toLowerCase())) { - lst.add(flg); - } - } - return lst; - } - return null; - } - -} diff --git a/src/vg/civcraft/mc/citadel/command/Stats.java b/src/vg/civcraft/mc/citadel/command/Stats.java deleted file mode 100644 index 84ae2584..00000000 --- a/src/vg/civcraft/mc/citadel/command/Stats.java +++ /dev/null @@ -1,130 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; -import vg.civcraft.mc.namelayer.group.Group; - -public class Stats extends PlayerCommand{ - - private List run = new ArrayList(); - - public Stats(String name) { - super(name); - setIdentifier("cts"); - setDescription("Lists the stats about a certain group."); - setUsage("/cts "); - setArguments(0,1); - } - - @Override - public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage("meh"); - return true; - } - Player p = (Player) sender; - if (!(p.isOp() || p.hasPermission("citadel.admin"))){ - Utility.sendAndLog(p, ChatColor.RED, "You do not have permission for this command."); - return true; - } - if (args.length == 0){ - Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new StatsMessageAllGroups(p)); - return true; - } - Group g = GroupManager.getGroup(args[0]); - - if (g == null){ - Utility.sendAndLog(p, ChatColor.RED, "This group does not exist."); - return true; - } - UUID uuid = NameAPI.getUUID(p.getName()); - if (!g.isMember(uuid) && !(p.isOp() || p.hasPermission("citadel.admin"))){ - Utility.sendAndLog(p, ChatColor.RED, "You are not on this group."); - return true; - } - synchronized(run){ - if (run.contains(g)){ - Utility.sendAndLog(p, ChatColor.RED, "That group is already being searched for."); - return true; - } - run.add(g); - } - Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new StatsMessage(p, g)); - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) - return new ArrayList(); - - if (args.length == 0) { - return GroupTabCompleter.complete(null, null, (Player)sender); - } else if (args.length == 1) { - return GroupTabCompleter.complete(args[0], null, (Player)sender); - } else { - return new ArrayList(); - } - - } - - public class StatsMessage implements Runnable{ - - private final Player p; - private final Group g; - - public StatsMessage(Player p, Group g){ - this.p = p; - this.g = g; - } - - @Override - public void run() { - if (g == null || p == null) { - return; - } - String message = "The amount of reinforcements on this group are: "; - int count = Citadel.getCitadelDatabase().getReinCountForGroup(g.getName()); - message += Integer.toString(count); - synchronized(run){ - run.remove(g); - } - if (p != null && !p.isOnline()) {// meh be safe - return; - } - Utility.sendAndLog(p, ChatColor.GREEN, message); - } - - } - - public class StatsMessageAllGroups implements Runnable{ - - private final Player p; - public StatsMessageAllGroups(Player p){ - this.p = p; - } - - @Override - public void run() { - String message = "The amount of reinforcements on the server are: "; - int count = Citadel.getCitadelDatabase().getReinCountForAllGroups(); - message += count; - if (p != null && !p.isOnline()) // meh be safe - return; - Utility.sendAndLog(p, ChatColor.GREEN, message); - } - } -} diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index c751713c..a4ab742c 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -141,7 +141,9 @@ public Boolean call() throws SQLException { String lore = rs.getString(12); int acidTime = rs.getInt(13); long msAcidTime = acidTime; + //old unit was minutes since unix epoch msAcidTime *= 60000; + //some reins don't have a time stamp, gonna have to guess for those if (msAcidTime == 0) { msAcidTime = System.currentTimeMillis(); } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 2603eb13..1f1bd9fa 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -1,31 +1,17 @@ package vg.civcraft.mc.citadel.listener; -import static vg.civcraft.mc.citadel.Utility.canPlace; -import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; -import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; -import static vg.civcraft.mc.citadel.Utility.explodeReinforcement; import static vg.civcraft.mc.citadel.Utility.getRealBlock; import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; -import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; -import static vg.civcraft.mc.citadel.Utility.timeUntilMature; -import static vg.civcraft.mc.citadel.Utility.wouldPlantDoubleReinforce; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; -import java.util.logging.Level; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -33,70 +19,39 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityBreakDoorEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; -import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; -import org.bukkit.event.hanging.HangingPlaceEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelWorldManager; -import vg.civcraft.mc.citadel.ReinforcementManager; -import vg.civcraft.mc.citadel.ReinforcementMode; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.database.GroupManagerDao; -import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; public class EntityListener implements Listener { protected GroupManager gm = NameAPI.getGroupManager(); - private ReinforcementManager rm = Citadel.getReinforcementManager(); + //apply explosion damage to reinforcements @EventHandler(ignoreCancelled = true) public void explode(EntityExplodeEvent eee) { Iterator iterator = eee.blockList().iterator(); - List blocks = new ArrayList(); + //we can edit the result by removing blocks from the list while (iterator.hasNext()) { - Block b = iterator.next(); - Block block = Utility.getRealBlock(b); - // if it's a plant we want to check the reinforcement of the soil block - if (Utility.isPlant(block)) { - Block soilBlock = Utility.findPlantSoil(block); - if (soilBlock != null && Citadel.getReinforcementManager().isReinforced(soilBlock)) { - block.getDrops().clear(); - iterator.remove(); - } - } - // getRealBlock should return the block we care about so if its already in the - // list we know it is a double block and was already handled. - if (blocks.contains(block)) { - block.getDrops().clear(); + Block block = iterator.next(); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein != null) { + rein.setHealth(rein.getHealth() - 1); iterator.remove(); - continue; - } - blocks.add(block); - try { - if (explodeReinforcement(block)) { - block.getDrops().clear(); - iterator.remove(); - } - } catch (NoClassDefFoundError e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Class Definition not found in explode", e); } } } + //prevent zombies from breaking reinforced doors @EventHandler(ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { ebde.setCancelled(maybeReinforcementDamaged(getRealBlock(ebde.getBlock()))); @@ -143,26 +98,6 @@ private List getGolemBlocks(EntityType type, Block base) { return blocks; } - // @EventHandler(priority = EventPriority.HIGHEST) - public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { - Entity entity = event.getRightClicked(); - if (entity instanceof ItemFrame) { - Reinforcement rein = rm.getReinforcement(entity.getLocation()); - if (rein == null || !(rein instanceof PlayerReinforcement)) - return; - PlayerReinforcement pr = (PlayerReinforcement) rein; - Group group = pr.getGroup(); - if (group == null) { - return; - } - - if (group.isMember(event.getPlayer().getUniqueId()) == false) { - event.setCancelled(true); - return; - } - } - } - @EventHandler(priority = EventPriority.LOWEST) public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); @@ -180,12 +115,5 @@ public void run() { } } }.runTaskAsynchronously(Citadel.getInstance()); - - if (OldCitadelConfigManager.defaultBypassOn()) { - PlayerState state = PlayerState.get(p); - if (!state.isBypassMode()) { - state.toggleBypassMode(); - } - } } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 42969694..2efd6937 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -77,4 +77,12 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { } + + public Group getGroup() { + return group; + } + + public ReinforcementType getType() { + return type; + } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java index d1ca248a..ff49b77c 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java @@ -67,8 +67,11 @@ public void handleBreakBlock(BlockBreakEvent e) { return; } damage = dre.getDamageDone(); - rein.setHealth(rein.getHealth() - damage); - rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + ReinforcementLogic.damageReinforcement(rein, damage); + } + + public boolean isBypassEnabled() { + return bypass; } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 81a22512..4d8bc325 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -119,5 +119,9 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } } + + public Group getGroup() { + return group; + } } diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index a3fca13f..250360f9 100644 --- a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -63,7 +63,7 @@ public double getHealth() { * @return The percent chance that a block will return the reinforcements. * Scales with damage. 1 means it is 100% and .5 means 50% */ - public double getPercentReturn() { + public double getReturnChance() { return returnChance; } From 327b672319f245422996eb983af3dc4a3aa21481 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 14 Mar 2019 00:47:09 +0100 Subject: [PATCH 111/255] Compiles --- src/vg/civcraft/mc/citadel/Citadel.java | 28 +- ...Manager.java => CitadelConfigManager.java} | 53 +- .../mc/citadel/ReinforcementLogic.java | 7 +- .../mc/citadel/ReinforcementMode.java | 10 - src/vg/civcraft/mc/citadel/Utility.java | 937 +----------------- src/vg/civcraft/mc/citadel/command/Acid.java | 87 +- .../mc/citadel/command/AreaReinforce.java | 60 +- .../mc/citadel/command/Fortification.java | 2 +- .../mc/citadel/command/Information.java | 2 +- .../civcraft/mc/citadel/command/Insecure.java | 2 +- src/vg/civcraft/mc/citadel/command/Off.java | 2 - .../mc/citadel/command/Reinforce.java | 7 +- .../mc/citadel/command/ReinforcementsGUI.java | 11 +- .../mc/citadel/command/ToggleEasyMode.java | 61 -- .../citadel/command/UpdateReinforcements.java | 158 --- .../database/CitadelReinforcementData.java | 10 +- .../mc/citadel/events/AcidBlockEvent.java | 79 -- .../events/ReinforcementAcidBlockedEvent.java | 38 + .../events/ReinforcementBypassEvent.java | 2 +- .../events/ReinforcementChangeTypeEvent.java | 2 +- .../events/ReinforcementCreationEvent.java | 2 +- .../events/ReinforcementDamageEvent.java | 2 +- .../mc/citadel/events/ReinforcementEvent.java | 2 +- .../events/ReinforcementGroupChangeEvent.java | 2 +- .../mc/citadel/listener/BlockListener.java | 124 +-- .../mc/citadel/listener/EntityListener.java | 21 +- .../citadel/listener/InventoryListener.java | 124 +-- .../mc/citadel/listener/RedstoneListener.java | 199 ++++ .../mc/citadel/listener/WorldListener.java | 26 - .../mc/citadel/{ => model}/AcidManager.java | 20 +- .../mc/citadel/{ => model}/ChunkCache.java | 32 +- .../{ChunkPair.java => model/ChunkCoord.java} | 23 +- .../GlobalReinforcementManager.java} | 37 +- .../Reinforcement.java | 23 +- .../WorldReinforcementManager.java} | 40 +- .../playerstate/FortificationState.java | 2 +- .../mc/citadel/playerstate/IPlayerState.java | 2 +- .../citadel/playerstate/InformationState.java | 6 +- .../mc/citadel/playerstate/InsecureState.java | 2 +- .../{ => playerstate}/PlayerStateManager.java | 5 +- .../citadel/playerstate/ReinforcingState.java | 2 +- .../ReinforcementTypeManager.java | 4 +- 42 files changed, 579 insertions(+), 1679 deletions(-) rename src/vg/civcraft/mc/citadel/{GlobalReinforcementManager.java => CitadelConfigManager.java} (80%) delete mode 100644 src/vg/civcraft/mc/citadel/ReinforcementMode.java delete mode 100644 src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java delete mode 100644 src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java delete mode 100644 src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java create mode 100644 src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java create mode 100644 src/vg/civcraft/mc/citadel/listener/RedstoneListener.java delete mode 100644 src/vg/civcraft/mc/citadel/listener/WorldListener.java rename src/vg/civcraft/mc/citadel/{ => model}/AcidManager.java (73%) rename src/vg/civcraft/mc/citadel/{ => model}/ChunkCache.java (77%) rename src/vg/civcraft/mc/citadel/{ChunkPair.java => model/ChunkCoord.java} (50%) rename src/vg/civcraft/mc/citadel/{CitadelWorldManager.java => model/GlobalReinforcementManager.java} (71%) rename src/vg/civcraft/mc/citadel/{reinforcement => model}/Reinforcement.java (89%) rename src/vg/civcraft/mc/citadel/{ReinforcementManager.java => model/WorldReinforcementManager.java} (68%) rename src/vg/civcraft/mc/citadel/{ => playerstate}/PlayerStateManager.java (87%) rename src/vg/civcraft/mc/citadel/{ => reinforcementtypes}/ReinforcementTypeManager.java (89%) diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index ba5cb6d0..5610ee95 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -9,7 +9,11 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.InventoryListener; -import vg.civcraft.mc.citadel.listener.WorldListener; +import vg.civcraft.mc.citadel.listener.RedstoneListener; +import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.ACivMod; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; @@ -25,10 +29,12 @@ public class Citadel extends ACivMod { public static final String insecurePerm = "INSECURE_REINFORCEMENT"; public static final String reinforcePerm = "REINFORCE"; public static final String doorPerm = "DOORS"; + public static final String acidPerm = "ACIDBLOCK"; + public static final String infoPerm = "REINFORCEMENT_INFO"; private CitadelReinforcementData db; - private CitadelWorldManager worldManager; - private GlobalReinforcementManager config; + private GlobalReinforcementManager worldManager; + private CitadelConfigManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; private PlayerStateManager stateManager; @@ -43,7 +49,7 @@ public void onEnable() { this.getPluginLoader().disablePlugin(this); return; } - config = new GlobalReinforcementManager(this); + config = new CitadelConfigManager(this); if (!config.parse()) { logger.severe("Errors in config file, shutting down"); this.getPluginLoader().disablePlugin(this); @@ -56,7 +62,7 @@ public void onEnable() { this.getPluginLoader().disablePlugin(this); return; } - worldManager = new CitadelWorldManager(db); + worldManager = new GlobalReinforcementManager(db); if (!worldManager.setup()) { logger.severe("Errors setting up world config, shutting down"); this.getPluginLoader().disablePlugin(this); @@ -92,7 +98,7 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new BlockListener(), this); getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); - getServer().getPluginManager().registerEvents(new WorldListener(), this); + getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); } @SuppressWarnings("unchecked") @@ -107,8 +113,8 @@ private void registerNameLayerPermissions() { modsAndAbove.add(PlayerType.ADMINS); modsAndAbove.add(PlayerType.OWNER); PermissionType.registerPermission(reinforcePerm, (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("ACIDBLOCK", (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission("REINFORCEMENT_INFO", (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(acidPerm, (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission(infoPerm, (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone()); PermissionType.registerPermission(doorPerm, (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone()); @@ -119,7 +125,7 @@ private void registerNameLayerPermissions() { /** * @return The ReinforcementManager of Citadel. */ - public CitadelWorldManager getReinforcementManager() { + public GlobalReinforcementManager getReinforcementManager() { return worldManager; } @@ -144,6 +150,10 @@ public ReinforcementTypeManager getReinforcementTypeManager() { public PlayerStateManager getStateManager() { return stateManager; } + + public CitadelConfigManager getConfigManager() { + return config; + } /** * @return Acid block manager diff --git a/src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java similarity index 80% rename from src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java rename to src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 5e18eda9..80e0eafd 100644 --- a/src/vg/civcraft/mc/citadel/GlobalReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -16,16 +16,24 @@ import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.util.ConfigParsing; -public class GlobalReinforcementManager extends CoreConfigManager { +public class CitadelConfigManager extends CoreConfigManager { private ManagedDatasource database; private List reinforcementTypes; private List acidMaterials; - public GlobalReinforcementManager(ACivMod plugin) { + private boolean logHostileBreaks; + private boolean logFriendlyBreaks; + private boolean logDamage; + private boolean logCreation; + private boolean logMessages; + + private double redstoneRange; + + public CitadelConfigManager(ACivMod plugin) { super(plugin); } - + public List getAcidMaterials() { return acidMaterials; } @@ -35,16 +43,46 @@ protected boolean parseInternal(ConfigurationSection config) { database = (ManagedDatasource) config.get("database"); parseReinforcementTypes(config.getConfigurationSection("reinforcements")); parseAcidMaterials(config); + logHostileBreaks = config.getBoolean("logHostileBreaks", true); + logFriendlyBreaks = config.getBoolean("logFriendlyBreaks", true); + logDamage = config.getBoolean("logDamage", false); + logCreation = config.getBoolean("logCreation", true); + logMessages = config.getBoolean("logMessages", true); + redstoneRange = config.getDouble("redstoneDistance", 3); return true; } + public double getMaxRedstoneDistance() { + return redstoneRange; + } + + public boolean logMessages() { + return logMessages; + } + + public boolean logHostileBreaks() { + return logHostileBreaks; + } + + public boolean logFriendlyBreaks() { + return logFriendlyBreaks; + } + + public boolean logDamage() { + return logDamage; + } + + public boolean logCreation() { + return logCreation; + } + private void parseAcidMaterials(ConfigurationSection config) { acidMaterials = parseMaterialList(config, "acidblock_material"); if (acidMaterials == null) { logger.info("No valid acid materials found in config"); acidMaterials = new LinkedList<>(); } - for(Material mat : acidMaterials) { + for (Material mat : acidMaterials) { logger.info("Adding " + mat.toString() + " as valid acid material"); } } @@ -77,8 +115,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { ReinforcementEffect effect = getReinforcementEffect(config.getConfigurationSection("effect")); long gracePeriod = ConfigParsing.parseTime(config.getString("grace_period", "0"), TimeUnit.MILLISECONDS); long maturationTime = ConfigParsing.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); - long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), - TimeUnit.MILLISECONDS); + long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), TimeUnit.MILLISECONDS); String name = config.getString("name"); double maturationScale = config.getInt("scale_amount", 1); double health = config.getDouble("hit_points", 100); @@ -99,8 +136,8 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + ". This does not make sense and the type will be ignored"); return null; } - return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, effect, - reinforceables, nonReinforceables, id, name); + return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, + effect, reinforceables, nonReinforceables, id, name); } private List parseMaterialList(ConfigurationSection config, String key) { diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java index 0cd96a06..b51031bf 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -8,7 +8,8 @@ import org.bukkit.material.Bed; import vg.civcraft.mc.citadel.listener.BlockListener; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.group.Group; @@ -26,7 +27,7 @@ public static double getDamageApplied(Player player, Reinforcement reinforcement } public static void createReinforcement(Block block, ReinforcementType type, Group group) { - CitadelWorldManager worldManager = Citadel.getInstance().getReinforcementManager(); + GlobalReinforcementManager worldManager = Citadel.getInstance().getReinforcementManager(); } public static void damageReinforcement(Reinforcement rein, double damage) { @@ -97,7 +98,7 @@ public static Block getResponsibleBlock(Block block) { public static Reinforcement resolveDoubleChestReinforcement(Block b) { Material mat = b.getType(); - CitadelWorldManager reinMan = Citadel.getInstance().getReinforcementManager(); + GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); Reinforcement rein = reinMan.getReinforcement(b); if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { return rein; diff --git a/src/vg/civcraft/mc/citadel/ReinforcementMode.java b/src/vg/civcraft/mc/citadel/ReinforcementMode.java deleted file mode 100644 index 37d76d96..00000000 --- a/src/vg/civcraft/mc/citadel/ReinforcementMode.java +++ /dev/null @@ -1,10 +0,0 @@ -package vg.civcraft.mc.citadel; - -public enum ReinforcementMode { - - REINFORCEMENT, - REINFORCEMENT_FORTIFICATION, - REINFORCEMENT_INFORMATION, - NORMAL, - INSECURE; -} diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/vg/civcraft/mc/citadel/Utility.java index 25721c12..caa0b39a 100644 --- a/src/vg/civcraft/mc/citadel/Utility.java +++ b/src/vg/civcraft/mc/citadel/Utility.java @@ -1,13 +1,5 @@ package vg.civcraft.mc.citadel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.ConcurrentModificationException; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.Set; import java.util.logging.Level; import org.bukkit.Bukkit; @@ -15,34 +7,9 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.material.Bed; import org.bukkit.util.Vector; - -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; -import vg.civcraft.mc.citadel.listener.BlockListener; -import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; -import vg.civcraft.mc.citadel.reinforcement.NaturalReinforcement; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.NaturalReinforcementType; -import vg.civcraft.mc.citadel.reinforcementtypes.NonReinforceableType; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementEffect; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; /** * Just a useful class with general and misplaced methods that can be * called from anywhere. @@ -50,289 +17,13 @@ */ public class Utility { - private static ReinforcementManager rm = Citadel.getReinforcementManager(); - private static Random rng = new Random(); - public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { receiver.sendMessage(color + message); - if (OldCitadelConfigManager.shouldLogPlayerCommands()) { + if (Citadel.getInstance().getConfigManager().logMessages()) { Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); } } - - public static void sendAndLog(Player player, ChatColor color, String message, String hoverMessage) { - if (hoverMessage == null || hoverMessage.trim().isEmpty()) { - sendAndLog(player, color, message); - return; - } - HoverEvent hover = new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create()); - for (String line : message.split("\n")) { - TextComponent playerMessage = new TextComponent(color + line); - playerMessage.setHoverEvent(hover); - player.spigot().sendMessage(playerMessage); - } - if (OldCitadelConfigManager.shouldLogPlayerCommands()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{player.getName(), message}); - } - } - - /** - * Creates a PlayerReinforcement or returns null if if player doesn't have - * the required requirements. - * @param The Player who created the reinforcement. - * @param The Group this reinforcement belongs too. - * @param The Block this reinforcement is occurring on. - * @param The ReinforcementType that is being reinforced on the block. - * @param The ItemStack type of the block being placed (if CTF, null if CTR) - * @return The PlayerReinforcement that comes from these parameters or null if certain checks failed. - */ - public static PlayerReinforcement createPlayerReinforcement(Player player, Group g, Block block, - ReinforcementType type, ItemStack reinfMat) { - if (player == null || g == null || block == null || type == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createPlayerReinforcement called with null: {0},{1},{2},{3}", - new Object[] {player, g, block, type}); - return null; - } - - if (g.isDisciplined()) { - player.sendMessage(ChatColor.RED + "This group is disciplined."); - if (OldCitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Request to create reinforcement for disciplined group " + g.getName()); - } - return null; - } - if (NonReinforceableType.isNonReinforceable(block.getType())){ - player.sendMessage(ChatColor.RED + "That block cannot be reinforced."); - if (OldCitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Request to create reinforcement for unreinforceable block " + block.getType()); - } - return null; - } - - if (!NameAPI.getGroupManager().hasAccess(g.getName(), player.getUniqueId(), PermissionType.getPermission("REINFORCE"))) { - player.sendMessage(ChatColor.RED + "You don't have permission to reinforce on this group"); - return null; - } - - // 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) { - Citadel.getInstance().getLogger().info("Reinforcement requirements too low for " + itemType.getType().name()); - return null; - } - 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 null; - } - // 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); - if (event.isCancelled()) { - return null; - } - if (OldCitadelConfigManager.shouldLogReinforcement()) { - StringBuffer slb = new StringBuffer(); - if (player != null) { - slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("]"); - } - slb.append("reinforced a ").append(block.getType()).append(" with a ") - .append(rein.getMaterial()).append(" reinforcement at ") - .append(rein.getLocation()); - Citadel.getInstance().getLogger().info(slb.toString()); - } - // Now eat the materials - - // Handle special case with block reinforcements. - if (type.getMaterial().isBlock()){ - if (slots.size()>1){ - if (inv.getItemInMainHand().isSimilar(itemType) && PlayerState.get(player).getMode() == ReinforcementMode.REINFORCEMENT_FORTIFICATION && slots.get(0) != inv.getHeldItemSlot()){ - requirements--; - } - } - } - if (consumeOffhand) { - ItemStack is = inv.getItemInOffHand(); - int stackSize = is.getAmount(); - int deduction = Math.min(stackSize, requirements); - if (deduction < stackSize) { - is.setAmount(stackSize - deduction); - } else { - inv.setItemInOffHand(null); - } - requirements -= deduction; - } - for (final int slot : slots) { - if (requirements <= 0) { - break; - } - final ItemStack slotItem = inv.getItem(slot); - final int stackSize = slotItem.getAmount(); - final int deduction = Math.min(stackSize, requirements); - - if (deduction < stackSize) { - slotItem.setAmount(stackSize - deduction); - } else { - inv.clear(slot); - } - requirements -= deduction; - } - if (requirements != 0) { - Citadel.getInstance().getLogger().info(String.format( "Reinforcement material out of sync %d vs %d", - requirements, type.getRequiredAmount())); - } - player.updateInventory(); - - rm.saveInitialReinforcement(rein); - playReinforcementEffect(rein); - return rein; - } - - /** - * Creates a player reinforcement without consuming any materials. This should only be used - * for admin tools - * @param The player who is creating the reinforcement - * @param The Group this reinforcement belongs too. - * @param The Block this reinforcement is occurring on. - * @param The ReinforcementType that is being reinforced on the block. - * @return The PlayerReinforcement that comes from these parameters or null if certain checks failed. - * @throws ReinforcemnetFortificationCancelException - */ - public static PlayerReinforcement createPlayerReinforcementWithoutMaterialConsumption(Player player, - Group g, Block block, ReinforcementType type) { - if (g == null || block == null || type == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createPlayerReinforcementWithoutMaterialConsumption called with null: {0},{1},{2}", - new Object[] {g, block, type}); - return null; - } else if (player == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createPlayerReinforcementWithoutMaterialConsumption called with player as null"); - } - - //no error messages towards the player because this might be called a few thousand times - if (g.isDisciplined()) { - return null; - } - if (NonReinforceableType.isNonReinforceable(block.getType())){ - return null; - } - 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); - if (event.isCancelled()) { - throw new ReinforcemnetFortificationCancelException(); - } - rm.saveInitialReinforcement(rein); - playReinforcementEffect(rein); - return rein; - } - - /** - * Checks if creating a plant reinforcement would result in a - * double reinforcement. - * @param The block of the plant. - * @return True if it would create a double reinforcement. - * @return False if it would not. - */ - public static boolean wouldPlantDoubleReinforce(final Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility wouldPlantDoubleReinforce called with null"); - return false; - } - - final Material blockMat = block.getType(); - if (isReinforceablePlant(blockMat) - && rm.getReinforcement(block.getLocation()) != null) { - return true; - } - final Block above = block.getRelative(BlockFace.UP); - final Material aboveMat = above.getType(); - if (isReinforceablePlant(aboveMat)) { - final Set soilTypes = getPlantSoilTypes(aboveMat); - if (soilTypes.contains(blockMat) - && Citadel.getReinforcementManager(). - getReinforcement(above.getLocation()) != null) { - return true; - } - } - return false; - } - - private static boolean isReinforceablePlant(Material mat) { - // If this list changes, update wouldPlantDoubleReinforce to account - // for the new soil types. - return Material.MELON.equals(mat) - || Material.PUMPKIN.equals(mat); - } - /** - * Returns a list of Materials that this plant can go on. - * @param Material of the plant. - * @return List of Materials that it can grow on. - */ - public static Set getPlantSoilTypes(Material mat) { - Set soilTypes = new HashSet(); - if (isSoilPlant(mat)) { - soilTypes.add(Material.SOIL); - } - if (isDirtPlant(mat)) { - soilTypes.add(Material.DIRT); - } - if (isGrassPlant(mat)) { - soilTypes.add(Material.GRASS); - } - if (isSandPlant(mat)) { - soilTypes.add(Material.SAND); - } - if (isSoulSandPlant(mat)) { - soilTypes.add(Material.SOUL_SAND); - } - return soilTypes; - } - + private static boolean isSoilPlant(Material mat) { return Material.WHEAT.equals(mat) || Material.MELON_STEM.equals(mat) @@ -378,264 +69,6 @@ public static boolean isPlant(Material mat) { || isSoulSandPlant(mat); } - private static int maxPlantHeight(Block plant) { - switch(plant.getType()) { - case CACTUS: - return 3; - case SUGAR_CANE_BLOCK: - return 3; - default: - return 1; - } - } - /** - * Checks to see if a reinforcement is damaged if it exists. - * @param The block holding the reinforcement. - * @return Returns false if no reinforcement exists and if it was broken. - */ - public static boolean maybeReinforcementDamaged(Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility maybeReinforcementDamaged called with null"); - return false; - } - - Reinforcement reinforcement = rm.getReinforcement(block.getLocation()); - return reinforcement != null && reinforcementDamaged(null, reinforcement); - } - /** - * Damages the reinforcement. - * @param The Reinforcement required. - * @return True if the reinforcement was securable. - */ - public static boolean reinforcementDamaged(Player player, Reinforcement reinforcement) { - if (reinforcement == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility reinforcementDamaged called with null"); - return false; - } - int durability = reinforcement.getDurability(); - int durabilityLoss = 1; - if (reinforcement instanceof PlayerReinforcement && OldCitadelConfigManager.isMaturationEnabled()) { - final int maturationTime = timeUntilMature(reinforcement); - PlayerReinforcement rein = (PlayerReinforcement) reinforcement; - ReinforcementType type = ReinforcementType.getReinforcementType(rein.getStackRepresentation()); - - durabilityLoss = rein.getDamageMultiplier(); - - if (maturationTime > 0 && type.getMaturationScale() != 0) { - // the default amount of minutes it takes to mature - int normal = type.getMaturationTime(); - if (maturationTime == normal) { - durabilityLoss = durability; - } else { - double percentTo = (double) maturationTime / (double) normal; // the percent of time left of maturation - durabilityLoss = (int) (((double) durabilityLoss / (1.0d - percentTo)) * (double) type.getMaturationScale()); - } // this new code scales smoothly between MaturationScale and a very large number, being closer to - // MaturationScale the closer to "done" a maturation cycle - } - - if (durability < durabilityLoss) { - durabilityLoss = durability; - } - } - int olddurability = durability; - durability -= durabilityLoss; - reinforcement.setDurability(durability); - boolean cancelled = durability > 0; - if (durability <= 0) { - if (OldCitadelConfigManager.shouldLogHostileBreaks()) { - StringBuffer slb = new StringBuffer(); - if (player != null) { - slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("] "); - } else { - slb.append("Something "); - } - slb.append("broke a ").append(reinforcement.getMaterial()).append(" reinforcement at ") - .append(reinforcement.getLocation()); - Citadel.getInstance().getLogger().info(slb.toString()); - } - cancelled = reinforcementBroken(null, reinforcement); - } else { - /* TODO: Move to ReinforcementEvent listener*/ - if (OldCitadelConfigManager.shouldLogDamage()) { - StringBuffer slb = new StringBuffer(); - if (player != null) { - slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("]"); - } else { - slb.append("Something "); - } - slb.append("damaged a ").append(reinforcement.getMaterial()); - int strength = 0; - if (reinforcement instanceof PlayerReinforcement) { - slb.append("reinforcement to "); - ReinforcementType type = ReinforcementType.getReinforcementType( - ((PlayerReinforcement) reinforcement).getStackRepresentation()); - strength = type.getHitPoints(); - } else if (reinforcement instanceof NaturalReinforcement) { - slb.append("natural reinforcement to "); - NaturalReinforcementType type = NaturalReinforcementType.getNaturalReinforcementType( - reinforcement.getType()); - strength = type.getDurability(); - } else { - slb.append("null reinforcement to "); - } - double nratio = strength > 0 ? (double) durability / (double) strength: 0; - double oratio = strength > 0 ? (double) olddurability / (double) strength: 1; - if ( nratio <= 0.25 && oratio > 0.25) { - slb.append("poor ("); - } else if ( nratio <= 0.5 && oratio > 0.5) { - slb.append("decent ("); - } else if ( nratio <= 0.75 && oratio > 0.75) { - slb.append("well ("); - } else if ( nratio < 1.0 && oratio == 1.0) { - slb.append("excellent ("); - } - slb.append(durability).append(") at ").append(reinforcement.getLocation()); - Citadel.getInstance().getLogger().info(slb.toString()); - } - if (reinforcement instanceof PlayerReinforcement) { - // leave message - } - //rm.saveReinforcement(reinforcement); - if(reinforcement instanceof PlayerReinforcement){ - playReinforcementEffect((PlayerReinforcement)reinforcement); - } - } - return cancelled; - } - /** - * Used to get the amount of time left until a reinforcement is mature. - * @param Reinforcement. - * @return Returns 0 if it is mature or the time in minutes until it is mature. - */ - public static int timeUntilMature(Reinforcement reinforcement) { - if (reinforcement == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility timeUntilMature called with null"); - return 0; - } - // Doesn't explicitly save the updated Maturation time into the cache. - // That's the responsibility of the caller. - if (reinforcement instanceof PlayerReinforcement){ - int maturationTime = reinforcement.getMaturationTime(); - if (maturationTime > 0) { - final int curMinute = (int)(System.currentTimeMillis() / 60000L); - if (curMinute >= maturationTime) { - maturationTime = 0; - reinforcement.setMaturationTime(0); - } else { - maturationTime = maturationTime - curMinute; - } - } - return (int) maturationTime; // should be small enough by now - } - return 0; - } - /** - * Used to get the amount of time left until a reinforcement's acid component is mature. - * @param Reinforcement. - * @return Returns 0 if it is mature or the time in minutes until it is mature. - */ - public static int timeUntilAcidMature(Reinforcement reinforcement) { - if (reinforcement == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility timeUntilAcidMature called with null"); - return 0; - } // Doesn't explicitly save the updated Acid Maturation time into the cache. - // That's the responsibility of the caller. - if (reinforcement instanceof PlayerReinforcement){ - int maturationTime = reinforcement.getAcidTime(); - if (maturationTime > 0) { - final int curMinute = (int)(System.currentTimeMillis() / 60000L); - if (curMinute >= maturationTime) { - maturationTime = 0; - reinforcement.setAcidTime(0); - } else { - maturationTime = maturationTime - curMinute; - } - } - return (int) maturationTime; // should be small enough by now - } - return 0; - } - - /** - * - * /ctb mode type break - * - * @param The Player who broke the reinforcement - * @param The Reinforcement broken. - * @return Returns true if it is securable. - * @return Returns false if it is no securable. - */ - public static boolean reinforcementBroken(Player player, Reinforcement reinforcement) { - if (reinforcement == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility reinforcementBroken called with null reinforcement"); - return false; - } - StringBuffer slb = null; - boolean logIt = OldCitadelConfigManager.shouldLogFriendlyBreaks() && player != null; - if (logIt) { - slb = new StringBuffer(); - slb.append("Player ").append(player.getName()).append(" [").append(player.getUniqueId()) - .append("] bypassed a ").append(reinforcement.getMaterial()).append(" reinforcement at ") - .append(reinforcement.getLocation()); - } - Citadel.getReinforcementManager().deleteReinforcement(reinforcement); - if (reinforcement instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement)reinforcement; - ReinforcementType material = ReinforcementType.getReinforcementType(pr.getStackRepresentation()); - // Adds in grace period returns, where if set, allows in minute increments for players to change their minds with - // no loss. Only applies if the reinforcement is immature and undamaged - if ((material.getGracePeriod() > 0 && pr.getMaturationTime() > 0 && pr.getHealth() >= 1.0 && - material.getMaturationTime() - timeUntilMature(pr) < material.getGracePeriod() ) || - // RNG is [0,1) so <= would give chance of return if health is 0. Replaced with < alone to fix. - rng.nextDouble() < pr.getHealth() * material.getReturnChance()) { - - Location location = pr.getLocation(); - if (player != null){ - Inventory inv = player.getInventory(); - if (OldCitadelConfigManager.shouldDropReinforcedBlock()){ - // If we should drop a block instead - ItemStack stack = createDroppedReinforcementBlock - (reinforcement.getLocation().getBlock(), (PlayerReinforcement) reinforcement); - for(ItemStack leftover : inv.addItem( - stack).values()) { - dropItemAtLocation(location, leftover); - } - } - else { - for(ItemStack leftover : inv.addItem( - material.getItemStack()) - .values()) { - dropItemAtLocation(location, leftover); - } - } - } - else { - dropItemAtLocation(location, new ItemStack(material.getMaterial() - , material.getReturnValue())); - } - if (logIt) { - slb.append(" - reinf mat refunded"); - Citadel.getInstance().getLogger().info(slb.toString()); - } - } else if (logIt) { - slb.append(" - reinf mat lost"); - Citadel.getInstance().getLogger().info(slb.toString()); - } - return (pr.isDoor() || pr.isContainer()); - } - if (logIt) { - Citadel.getInstance().getLogger().info(slb.toString()); - } - return false; // implicit isSecureable() == false - } - /** * A better version of dropNaturally that mimics normal drop behavior. @@ -680,370 +113,4 @@ public static void dropItemAtLocation(Block b, ItemStack is) { } dropItemAtLocation(b.getLocation(), is); } - - /** - * Checks if a Redstone player is trying to power a block. - * @param The Reinforcement in question. - * @param The distance the player is from the block. - * @return Returns true if the player is on the group and has permission. - * @return Returns false if the player is not on the group or doesn't have permission. - */ - public static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { - if (reinforcement == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility isAuthorizedPlayerNear called with null"); - return false; - } - Location reinLocation = reinforcement.getLocation(); - double min_x = reinLocation.getX() - distance; - double min_z = reinLocation.getZ() - distance; - double max_x = reinLocation.getX() + distance; - double max_z = reinLocation.getZ() + distance; - List onlinePlayers = new ArrayList(); - for (Player p: Bukkit.getOnlinePlayers()) { - onlinePlayers.add(p); - } - boolean result = false; - try { - for (Player player : onlinePlayers) { - if (player.isDead()) { - continue; - } - Location playerLocation = player.getLocation(); - double player_x = playerLocation.getX(); - double player_z = playerLocation.getZ(); - // Simple bounding box check to quickly rule out Players - // before doing the more expensive playerLocation.distance - if (player_x < min_x || player_x > max_x || - player_z < min_z || player_z > max_z) { - continue; - } - if (!reinforcement.canAccessDoors(player) - && !player.hasPermission("citadel.admin.accesssecurable")) { - continue; - } - double distanceSquared = playerLocation.distance(reinLocation); - if (distanceSquared <= distance) { - result = true; - break; - } - } - } catch (ConcurrentModificationException e) { - Citadel.getInstance().getLogger().warning("ConcurrentModificationException at redstonePower() in BlockListener"); - } - return result; - } - - /** - * This method is used to convert Block Reinforcements to itemstacks - * @param The block that is being converted into a BlockReinforcement - * @param The reinforcement on it - * @return Itemstack form of the reinforcement on a block - */ - public static ItemStack createDroppedReinforcementBlock(Block block, PlayerReinforcement rein){ - if (block == null || rein == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility createDroppedReinforcementBlock called with null"); - return null; - } - ItemStack reinBlock = new ItemStack(block.getType(), 1); - ItemMeta lore = reinBlock.getItemMeta(); - List info = new ArrayList(); - String reinMat = rein.getMaterial().name(); - String amount = Integer.toString(rein.getStackRepresentation().getAmount()); - String dur = Integer.toString(ReinforcementType.getReinforcementType(rein.getStackRepresentation()).getHitPoints()); - String group = rein.getGroup().getName(); - info.add(reinMat); - info.add(amount); - info.add(dur); - info.add(group); - if (rein.getStackRepresentation().hasItemMeta()) { - info.addAll(rein.getStackRepresentation().getItemMeta().getLore()); - lore.setLore(info); - } - reinBlock.setItemMeta(lore); - return reinBlock; - } - /** - * Returns the Reinforcement of a block if it was previously a reinforcement. - * Importantly though if a group that this block was associated with - * gets deleted this block when placed will not belong to anyone. - * @param The player placing the block - * @param The stack the player is placing from - * @param The location where the block is being placed - * @return The PlayerReiforcement associated with this block - */ - public static PlayerReinforcement isDroppedReinforcementBlock(Player p, ItemStack stack, Location loc){ - if (stack == null || loc == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility isDroppedReinforcementBlock called with null"); - return null; - } - if (!OldCitadelConfigManager.shouldDropReinforcedBlock()) return null; - ItemMeta meta = stack.getItemMeta(); - List lore = meta.getLore(); - try{ - if (!meta.hasLore()) { - return null; - } - Iterator value = lore.iterator(); - if (!value.hasNext()) { - return null; - } - Material mat = null; - try { - mat = Material.valueOf(value.next()); - } catch (IllegalArgumentException iae) { - return null; - } - if (!value.hasNext()) { - return null; - } - int amount = Integer.parseInt(value.next()); - if (!value.hasNext()) { - return null; - } - int dur = Integer.parseInt(value.next()); - if (!value.hasNext()) { - return null; - } - String group = value.next(); - List itemStackInfo = new ArrayList(); - while(value.hasNext()) { - itemStackInfo.add(value.next()); - } - ItemStack newStack = new ItemStack(mat, amount); - meta.setLore(itemStackInfo); - newStack.setItemMeta(meta); - ReinforcementType reinType = ReinforcementType.getReinforcementType(newStack); - if (reinType == null) { - return null; - } - Group g = GroupManager.getSpecialCircumstanceGroup(group); - PlayerReinforcement rein = new PlayerReinforcement(loc, dur, - getIntFormofMaturation(System.currentTimeMillis(),reinType.getItemStack()), - getIntFormofAcidMaturation(System.currentTimeMillis(),reinType.getItemStack()), - g, reinType.getItemStack()); - ReinforcementCreationEvent event = - new ReinforcementCreationEvent(rein, loc.getBlock(), p); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - if (OldCitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "Dropped reinforcement creation event for " + rein.getType() + " cancelled"); - } - return null; - } - return rein; - } catch (IllegalArgumentException iae){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility isDroppedReinforcementBlock failed", iae); - } catch(Exception ex){ - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility isDroppedReinforcementBlock failed", ex); - } - return null; - } - /** - * If a reinforcement is exploded checks if it has a reinforcement on it - * or not. - * @param The block that exploded. - * @return True if there is a reinforcement. - * @return False if there is not a reinforcement. - */ - public static boolean explodeReinforcement(Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility explodeReinforcement called with null"); - return false; - } - Reinforcement reinforcement = rm.getReinforcement(block); - if (reinforcement == null) { - reinforcement = createNaturalReinforcement(block, null); - } - if (reinforcement == null) { - return false; - } - return reinforcementDamaged(null, reinforcement); - } - - /** - * Display an effect defined in the config around a reinforcement. - * @param reinforcement The reinforcement to spawn the effect around. - * @return Whether an effect was displayed or not. - */ - public static boolean playReinforcementEffect(PlayerReinforcement reinforcement) { - ReinforcementEffect reinforcementEffect = ReinforcementType.getReinforcementType(reinforcement.getStackRepresentation()).getReinforcementEffect(); - if(reinforcementEffect == null){ - return false; - } - Location centerLocation = reinforcement.getLocation().clone().add(0.5, 0.5, 0.5); - reinforcementEffect.playEffect(centerLocation); - return true; - } - - public static Block getAttachedChest(Block block) { - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility getAttachedChest called with null"); - return null; - } - Material mat = block.getType(); - if (Material.CHEST.equals(mat) || Material.TRAPPED_CHEST.equals(mat)) { - for (BlockFace face : cardinals) { - Block b = block.getRelative(face); - if (b.getType() == mat) { - return b; - } - } - } - return null; - } - - private static BlockFace[] cardinals = new BlockFace[]{BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST}; - - public static List doorTypes = new ArrayList(Arrays.asList( - Material.WOODEN_DOOR, Material.IRON_DOOR_BLOCK, - Material.ACACIA_DOOR, Material.BIRCH_DOOR, - Material.DARK_OAK_DOOR, Material.JUNGLE_DOOR, - Material.SPRUCE_DOOR, Material.WOOD_DOOR)); - /** - * Returns the block the Citadel is looking at, example: for beds, doors we want the bottom half. - * @param block - * @return Returns the block we want. - */ - public static Block getRealBlock(Block block){ - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility getRealBlock called with null"); - return null; - } - Block b = block; - switch (block.getType()){ - case CHEST: - case TRAPPED_CHEST: - if (!rm.isReinforced(block)) { - b = getAttachedChest(block); - } - if (b == null) { - b = block; - } - break; - case WOODEN_DOOR: - case IRON_DOOR_BLOCK: - case ACACIA_DOOR: - case BIRCH_DOOR: - case DARK_OAK_DOOR: - case JUNGLE_DOOR: - case SPRUCE_DOOR: - case WOOD_DOOR: - if (!doorTypes.contains(block.getRelative(BlockFace.UP).getType())) { - b = block.getRelative(BlockFace.DOWN); - } - break; - case BED_BLOCK: - if (((Bed) block.getState().getData()).isHeadOfBed()) { - b = block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); - } - break; - default: - b = block; - } - return b; - } - - private static int getIntFormofMaturation(long creation, ItemStack stack){ - if (stack == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility getIntFormofMaturation called with null"); - return 0; - } - int maturation = (int)(creation / 60000) + - ReinforcementType. - getReinforcementType(stack) - .getMaturationTime(); - return maturation; - } - - private static int getIntFormofAcidMaturation(long creation, ItemStack stack) { - if (stack == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility getIntFormofAcidMaturation called with null"); - return 0; - } - int maturation = (int)(creation / 60000) + - ReinforcementType. - getReinforcementType(stack) - .getAcidTime(); - return maturation; - } - - public static Block findPlantSoil(Block block){ - if (block == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility findPlantSoil called with null"); - return null; - } - final Set soilTypes = getPlantSoilTypes(block.getType()); - if(soilTypes.size() <= 0){ - return null; - } - //find the plants soil below it - Block down = block; - int max_depth = maxPlantHeight(block); - for(int i =0; i < max_depth; ++i){ - down = down.getRelative(BlockFace.DOWN); - if(soilTypes.contains(down.getType())){ - return down; - } - } - return null; - } - - public static boolean canPlace(Block block, Player player) { - Material block_mat = block.getType(); - - if (block_mat == Material.HOPPER || block_mat == Material.DROPPER){ - for (BlockFace direction : BlockListener.all_sides) { - Block adjacent = block.getRelative(direction); - if (!(adjacent.getState() instanceof InventoryHolder)) { - continue; - } - Reinforcement rein = rm.getReinforcement(adjacent); - if (null != rein && rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement)rein; - if (pr.isInsecure() && !pr.canAccessChests(player)) { - return false; - } - } - } - } - if (block_mat == Material.CHEST || block_mat == Material.TRAPPED_CHEST){ - for (BlockFace direction : BlockListener.planar_sides) { - Block adjacent = block.getRelative(direction); - if (!(adjacent.getState() instanceof InventoryHolder)) { - continue; - } - Reinforcement rein = rm.getReinforcement(adjacent); - if (null != rein && rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement)rein; - if (!pr.canAccessChests(player)) { - return false; - } - } - } - } - //stops players from modifying the reinforcement on a half slab by placing another block on top - Reinforcement reinforcement_on_block = Citadel.getReinforcementManager().getReinforcement(block); - if (reinforcement_on_block instanceof PlayerReinforcement) { - PlayerReinforcement reinforcement = (PlayerReinforcement) reinforcement_on_block; - if (!reinforcement.canBypass(player)) { - return false; - } - } else if (reinforcement_on_block != null) { - return false; //not really sure when this could happen but just in case - } - - return true; - } } diff --git a/src/vg/civcraft/mc/citadel/command/Acid.java b/src/vg/civcraft/mc/citadel/command/Acid.java index e5b783a0..8ae05add 100644 --- a/src/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/vg/civcraft/mc/citadel/command/Acid.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.UUID; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.bukkit.Bukkit; @@ -15,22 +15,18 @@ import org.bukkit.entity.Player; import org.bukkit.util.BlockIterator; -import vg.civcraft.mc.citadel.AcidManager; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.OldCitadelConfigManager; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.events.AcidBlockEvent; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.citadel.events.ReinforcementAcidBlockedEvent; +import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.civmodcore.util.TextUtil; @CivCommand(id = "ctacid") public class Acid extends StandaloneCommand { - - private static final String acidPermission = "ACIDBLOCK"; @Override public boolean execute(CommandSender sender, String[] args) { @@ -40,24 +36,23 @@ public boolean execute(CommandSender sender, String[] args) { while (itr.hasNext()) { Block block = itr.next(); if (!acidMan.isPossibleAcidBlock(block)) { - continue; + Utility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); + return true; } Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(block); if (reinforcement == null) { Utility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } - UUID uuid = NameAPI.getUUID(p.getName()); - if (!reinforcement.hasPermission(p, acidPermission)) { - Utility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); + if (!reinforcement.hasPermission(p, Citadel.acidPerm)) { + Utility.sendAndLog(p, ChatColor.RED, + "You do not have sufficient permission to use acid blocks on this group."); return true; } - - - - int time = Utility.timeUntilAcidMature(pRein); - if (time != 0) { - Utility.sendAndLog(p, ChatColor.RED, "That acid block is not mature yet."); + long neededTime = acidMan.getRemainingAcidMaturationTime(reinforcement); + if (neededTime > 0) { + Utility.sendAndLog(p, ChatColor.RED, "That acid block will be mature in " + + TextUtil.formatDuration(neededTime, TimeUnit.MILLISECONDS)); return true; } Block topFace = block.getRelative(BlockFace.UP); @@ -65,53 +60,35 @@ public boolean execute(CommandSender sender, String[] args) { Utility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); return true; } - Reinforcement topRein = rm.getReinforcement(topFace); + Reinforcement topRein = ReinforcementLogic.getReinforcementProtecting(topFace); if (topRein == null) { - Utility.sendAndLog(p, ChatColor.RED, "That block doesn't have a reinforcement."); + Utility.sendAndLog(p, ChatColor.RED, "The block above doesn't have a reinforcement."); return true; } - if (!(topRein instanceof PlayerReinforcement)) { - continue; - } - PlayerReinforcement pTopRein = (PlayerReinforcement) topRein; - ReinforcementType acidBlockType = ReinforcementType - .getReinforcementType(pRein.getStackRepresentation()); - ReinforcementType topReinType = ReinforcementType - .getReinforcementType(pTopRein.getStackRepresentation()); - if (acidBlockType.getAcidTime() < topReinType.getAcidTime()) { - Utility.sendAndLog(p, ChatColor.RED, "This acid block is too weak for that reinforcement."); + if (!acidMan.canAcidBlock(reinforcement.getType(), topRein.getType())) { + Utility.sendAndLog(p, ChatColor.RED, + reinforcement.getType().getName() + " can not acid away " + topRein.getType().getName()); return true; } - AcidBlockEvent event = new AcidBlockEvent(p, pRein, pTopRein); + ReinforcementAcidBlockedEvent event = new ReinforcementAcidBlockedEvent(p, reinforcement, topRein); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - if (OldCitadelConfigManager.shouldLogInternal()) { - Citadel.getInstance().getLogger().log(Level.INFO, - "Acid block event cancelled for acid at " + pRein.getLocation() ); - } + if (Citadel.getInstance().getConfigManager().isDebugEnabled()) { + Citadel.getInstance().getLogger().log(Level.INFO, + "Acid block event cancelled for acid at " + reinforcement.getLocation()); + } return true; } - if (OldCitadelConfigManager.shouldLogHostileBreaks()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}", - new Object[] {block.getLocation(), topFace.getType(), topFace.getLocation()}); + if (Citadel.getInstance().getConfigManager().logHostileBreaks()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}, activated by {3}", + new Object[] { block.getLocation(), topFace.getType(), topFace.getLocation(), p.getName() }); } - - // Consider if should simply be an AcidBlockEvent listener. This will do for now. - Utility.reinforcementBroken(p, pRein); - rm.deleteReinforcement(pTopRein); - - // Break the acid block + reinforcement.setHealth(-1); + //play particles for top block + ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1); block.breakNaturally(); - - // Break the acided block - if (OldCitadelConfigManager.breakAcidedBlockNaturally()) { - topFace.breakNaturally(); - } - else { - topFace.setType(Material.AIR); - } - + topFace.breakNaturally(); } return true; } diff --git a/src/vg/civcraft/mc/citadel/command/AreaReinforce.java b/src/vg/civcraft/mc/citadel/command/AreaReinforce.java index 64e56627..a5fe0015 100644 --- a/src/vg/civcraft/mc/citadel/command/AreaReinforce.java +++ b/src/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -5,31 +5,22 @@ import java.util.UUID; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementManager; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -public class AreaReinforce extends PlayerCommand { - private ReinforcementManager rm = Citadel.getReinforcementManager(); - private GroupManager gm = NameAPI.getGroupManager(); - - public AreaReinforce(String name) { - super(name); - setIdentifier("ctar"); - setDescription("Allows you to reinforce entire areas"); - setUsage("/ctar "); - setArguments(6, 7); - } +@CivCommand(id = "ctar") +public class AreaReinforce extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { @@ -39,22 +30,15 @@ public boolean execute(CommandSender sender, String[] args) { } Player p = (Player) sender; UUID uuid = NameAPI.getUUID(p.getName()); - if (!p.isOp() && !p.hasPermission("citadel.admin")) { - // This should never actually happen thanks to the plugin.yml, but - // we just want to be sure - Utility.sendAndLog(p, ChatColor.RED, "Nice try"); - return true; - } - - ReinforcementType rt = ReinforcementType.getReinforcementType(p.getInventory().getItemInMainHand()); - - if (rt == null) { + ReinforcementType reinType = Citadel.getInstance().getReinforcementTypeManager() + .getByItemStack(p.getInventory().getItemInMainHand()); + if (reinType == null) { Utility.sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); return true; } String groupName = null; if (args.length == 6) { - groupName = gm.getDefaultGroup(uuid); + groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == null) { Utility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); return true; @@ -62,8 +46,8 @@ public boolean execute(CommandSender sender, String[] args) { } else { groupName = args[0]; } - Group g = GroupManager.getGroup(groupName); - if (g == null) { + Group group = GroupManager.getGroup(groupName); + if (group == null) { Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } @@ -88,25 +72,25 @@ public boolean execute(CommandSender sender, String[] args) { Utility.sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); return false; } + int count = 0; for (int x = xMin; x <= xMax; x++) { for (int y = yMin; y <= yMax; y++) { for (int z = zMin; z <= zMax; z++) { - Block current = Utility.getRealBlock(p.getWorld() - .getBlockAt(x, y, z)); - if (!(current.getType() == Material.AIR) && !rm.isReinforced(current) - && !Utility.wouldPlantDoubleReinforce(current)) { - if (!rt.canBeReinforced(current.getType())) { - Utility.sendAndLog(p, ChatColor.RED, "The block at " + x + ", " + y + ", " + z + - " was not reinforced because the material type you are using cannot reinforce that type of block."); - continue; - } - Utility.createPlayerReinforcementWithoutMaterialConsumption(p, g, current, rt); + Block current = p.getWorld().getBlockAt(x, y, z); + if (!reinType.canBeReinforced(current.getType())) { + continue; + } + Block protecting = ReinforcementLogic.getResponsibleBlock(current); + if (!current.getLocation().equals(protecting.getLocation())) { + continue; } + count++; + ReinforcementLogic.createReinforcement(current, reinType, group); } } } - Utility.sendAndLog(p, ChatColor.GREEN, "Successfully created reinforcements"); + Utility.sendAndLog(p, ChatColor.GREEN, "Successfully created " + count + "reinforcements"); return true; } diff --git a/src/vg/civcraft/mc/citadel/command/Fortification.java b/src/vg/civcraft/mc/citadel/command/Fortification.java index 55980fe7..a3d80e01 100644 --- a/src/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/vg/civcraft/mc/citadel/command/Fortification.java @@ -9,10 +9,10 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.PlayerStateManager; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.playerstate.FortificationState; import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; diff --git a/src/vg/civcraft/mc/citadel/command/Information.java b/src/vg/civcraft/mc/citadel/command/Information.java index f8f88d5d..c81d2a9c 100644 --- a/src/vg/civcraft/mc/citadel/command/Information.java +++ b/src/vg/civcraft/mc/citadel/command/Information.java @@ -7,9 +7,9 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.IPlayerState; import vg.civcraft.mc.citadel.playerstate.InformationState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; diff --git a/src/vg/civcraft/mc/citadel/command/Insecure.java b/src/vg/civcraft/mc/citadel/command/Insecure.java index e668b9b1..bc43015f 100644 --- a/src/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/vg/civcraft/mc/citadel/command/Insecure.java @@ -7,9 +7,9 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.IPlayerState; import vg.civcraft.mc.citadel.playerstate.InsecureState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; diff --git a/src/vg/civcraft/mc/citadel/command/Off.java b/src/vg/civcraft/mc/citadel/command/Off.java index 46319b81..999eb960 100644 --- a/src/vg/civcraft/mc/citadel/command/Off.java +++ b/src/vg/civcraft/mc/citadel/command/Off.java @@ -3,12 +3,10 @@ import java.util.ArrayList; import java.util.List; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; diff --git a/src/vg/civcraft/mc/citadel/command/Reinforce.java b/src/vg/civcraft/mc/citadel/command/Reinforce.java index 17afbb8d..368bbf90 100644 --- a/src/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/vg/civcraft/mc/citadel/command/Reinforce.java @@ -9,18 +9,13 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.PlayerStateManager; -import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.playerstate.FortificationState; import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.ReinforcingState; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; diff --git a/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java index aafdc964..b581b220 100644 --- a/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java +++ b/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -1,7 +1,6 @@ package vg.civcraft.mc.citadel.command; import java.text.DecimalFormat; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; @@ -16,10 +15,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.civmodcore.inventorygui.Clickable; -import vg.civcraft.mc.civmodcore.inventorygui.ClickableInventory; import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; import vg.civcraft.mc.civmodcore.inventorygui.IClickable; import vg.civcraft.mc.civmodcore.inventorygui.MultiPageView; @@ -35,10 +31,6 @@ public class ReinforcementsGUI extends StandaloneCommand { public boolean execute(CommandSender sender, String[] arg1) { List types = new LinkedList<>( Citadel.getInstance().getReinforcementTypeManager().getAllTypes()); - int rows = types.size() / 9; - if ((types.size() % 9) != 0) { - rows++; - } // sort ascending by health Collections.sort(types, new Comparator() { @@ -47,7 +39,6 @@ public int compare(ReinforcementType o1, ReinforcementType o2) { return Double.compare(o1.getHealth(), o2.getHealth()); } }); - List clicks = new LinkedList(); for (ReinforcementType type : types) { ItemStack is = type.getItem().clone(); @@ -55,7 +46,7 @@ public int compare(ReinforcementType o1, ReinforcementType o2) { ISUtils.addLore(is, ChatColor.GREEN + "Health: " + format.format(type.getHealth())); ISUtils.addLore(is, ChatColor.GOLD + "Maturation time: " + TextUtil.formatDuration(type.getMaturationTime(), TimeUnit.MILLISECONDS)); - if (Citadel.getInstance().getAcidManager().canBeAcidBlock(type)) { + if (type.getAcidTime() > 0) { ISUtils.addLore(is, ChatColor.GOLD + "Acid maturation time: " + TextUtil.formatDuration(type.getAcidTime(), TimeUnit.MILLISECONDS)); } else { diff --git a/src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java b/src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java deleted file mode 100644 index b02fb13a..00000000 --- a/src/vg/civcraft/mc/citadel/command/ToggleEasyMode.java +++ /dev/null @@ -1,61 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import vg.civcraft.mc.citadel.PlayerState; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; - -public class ToggleEasyMode extends PlayerCommand { - - public ToggleEasyMode(String name) { - super(name); - setIdentifier("cte"); - setDescription("Toggle easy mode"); - setUsage("/cte [on|off]"); - setArguments(0, 1); - } - - @Override - public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)) { - sender.sendMessage("Must be a player to perform that command."); - return true; - } - Player p = (Player) sender; - PlayerState state = PlayerState.get(p); - if (args.length == 1) { - if (args[0].equalsIgnoreCase("on")) { - if (!state.getEasyMode()) { - state.toggleEasyMode(); - } - Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); - } else if (args[0].equalsIgnoreCase("off")) { - if (state.getEasyMode()) { - state.toggleEasyMode(); - } - Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); - } else { - Utility.sendAndLog(p, ChatColor.RED, String.format("Usage: %s", this.getUsage())); - } - return true; - } - if (state.toggleEasyMode()) { - Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been enabled."); - } else { - Utility.sendAndLog(p, ChatColor.GREEN, "Easy mode has been disabled."); - } - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); - } - -} diff --git a/src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java b/src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java deleted file mode 100644 index 5b13047b..00000000 --- a/src/vg/civcraft/mc/citadel/command/UpdateReinforcements.java +++ /dev/null @@ -1,158 +0,0 @@ -package vg.civcraft.mc.citadel.command; - -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementManager; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.MultiBlockReinforcement; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.civmodcore.command.PlayerCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.group.Group; - -public class UpdateReinforcements extends PlayerCommand{ - - public UpdateReinforcements(String name) { - super(name); - setIdentifier("ctur"); - setDescription("Updates all reinforcements in a chunk and group to a certain group."); - setUsage("/ctur "); - setArguments(0,2); - } - - @Override - public boolean execute(CommandSender sender, String[] args) { - if (!(sender instanceof Player)){ - sender.sendMessage("How would this even work."); - return true; - } - Player p = (Player) sender; - if (!p.hasPermission("citadel.admin") || !p.isOp()){ - Utility.sendAndLog(p, ChatColor.RED, "Nice try"); - return true; - } - - if (args.length == 0){ - Utility.sendAndLog(p, ChatColor.GREEN, "Searching for groups in current chunk."); - Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new FindGroups(p, p.getLocation())); - return true; - } - else if (args.length == 1){ - Utility.sendAndLog(p, ChatColor.RED, "Please enter two groups."); - return true; - } - - Group old = GroupManager.getGroup(args[0]); - Group n = GroupManager.getGroup(args[1]); - - if (old == null || n == null){ - Utility.sendAndLog(p, ChatColor.RED, "One of the groups does not exist."); - return true; - } - - Utility.sendAndLog(p, ChatColor.GREEN, "Beginning to change groups."); - Bukkit.getScheduler().runTaskAsynchronously(Citadel.getInstance(), new UpdateGroups(p, p.getLocation().getChunk(), old, n)); - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - // TODO Auto-generated method stub - return null; - } - - class UpdateGroups implements Runnable{ - - private final Group old, n; - private final Player p; - private final Chunk c; - public UpdateGroups(Player p, Chunk c, Group old, Group n){ - this.old = old; - this.n = n; - this.p = p; - this.c = c; - } - - @Override - public void run() { - ReinforcementManager rm = Citadel.getReinforcementManager(); - List reins = rm.getReinforcementsByChunk(c); - for (Reinforcement r: reins){ - if (r instanceof PlayerReinforcement){ - PlayerReinforcement rein = (PlayerReinforcement) r; - if (rein.getGroup().getName().equals(old.getName())) { - rein.setGroup(n); - } - } - else if (r instanceof MultiBlockReinforcement){ - MultiBlockReinforcement rein = (MultiBlockReinforcement) r; - if (rein.getGroup().getName().equals(old.getName())) { - rein.setGroup(n); - } - } - } - if (!p.isOnline()) - return; - - Utility.sendAndLog(p, ChatColor.GREEN, "The groups have been updated."); - } - - } - - class FindGroups implements Runnable{ - - private final Player p; - private final Location loc; - - public FindGroups(Player p, Location loc){ - this.p = p; - this.loc = loc; - } - - @Override - public void run() { - ReinforcementManager rm = Citadel.getReinforcementManager(); - List reins = rm.getReinforcementsByChunk(loc.getChunk()); - List groups = new ArrayList(); - for (Reinforcement r: reins){ - if (r instanceof PlayerReinforcement){ - PlayerReinforcement rein = (PlayerReinforcement) r; - String name = rein.getGroup().getName(); - if (groups.contains(name)) { - continue; - } - groups.add(name); - } - else if (r instanceof MultiBlockReinforcement){ - MultiBlockReinforcement rein = (MultiBlockReinforcement) r; - String name = rein.getGroup().getName(); - if (groups.contains(name)) { - continue; - } - groups.add(name); - } - } - if (!p.isOnline()) { - return; - } - StringBuilder names = new StringBuilder(); - for (String g: groups) { - names.append(g).append(" "); - } - - Utility.sendAndLog(p, ChatColor.GREEN, "The groups in this chunk are: " + names); - } - - } - -} diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index a4ab742c..84b53108 100644 --- a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -19,12 +19,12 @@ import org.bukkit.World; import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.ChunkCache; -import vg.civcraft.mc.citadel.ChunkPair; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementTypeManager; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.ChunkCache; +import vg.civcraft.mc.citadel.model.ChunkCoord; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; @@ -211,7 +211,7 @@ public Boolean call() throws SQLException { + "constraint reinforcementUniqueLocation unique (x,y,z,world_id));"); } - public ChunkCache loadReinforcements(ChunkPair coords, int worldID) { + public ChunkCache loadReinforcements(ChunkCoord coords, int worldID) { List reinforcements = new ArrayList<>(); World world = null; try (Connection loadConn = db.getConnection(); diff --git a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java b/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java deleted file mode 100644 index 245663b6..00000000 --- a/src/vg/civcraft/mc/citadel/events/AcidBlockEvent.java +++ /dev/null @@ -1,79 +0,0 @@ -package vg.civcraft.mc.citadel.events; - -import org.bukkit.entity.Player; -import org.bukkit.event.Cancellable; -import org.bukkit.event.HandlerList; -import org.bukkit.event.player.PlayerEvent; - -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; - -/** - * Event that is called when an acid block action is performed - * - */ -public class AcidBlockEvent extends PlayerEvent implements Cancellable { - private static final HandlerList handlers = new HandlerList(); - - private final PlayerReinforcement acidBlock; - private final PlayerReinforcement destroyedBlock; - - /** - * Creates a new AcidBlockEvent instance - * @param player The player performing the acid action - * @param acidBlock The acid block instance - * @param destroyedBlock The destroyed block instance - */ - public AcidBlockEvent(final Player player, final PlayerReinforcement acidBlock, - PlayerReinforcement destroyedBlock) { - super(player); - - this.acidBlock = acidBlock; - this.destroyedBlock = destroyedBlock; - } - - /** - * Gets the PlayerReinforcement on the acid block. - * @return Returns the PlayerReinforcement. - */ - public PlayerReinforcement getAcidBlockReinforcement() { - return acidBlock; - } - - /** - * Gets the PlayerReinforcement on the block above the Acid Block. - * @return Returns the PlayerReinforcement for the block above the Acid Block. - */ - public PlayerReinforcement getDestroyedBlockReinforcement() { - return destroyedBlock; - } - - /** - * @Deprecated - * @return Returns the PlayerReinforcement for the block above the Acid Block. - * @deprecated Use getDestroyedBlockReinforcement instead. - */ - @Deprecated - public PlayerReinforcement getDestoryedBlockReinforcement() { - return destroyedBlock; - } - - private boolean isCancelled = false; - @Override - public boolean isCancelled() { - return isCancelled; - } - - @Override - public void setCancelled(boolean value) { - isCancelled = value; - } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -} \ No newline at end of file diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java new file mode 100644 index 00000000..42707605 --- /dev/null +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java @@ -0,0 +1,38 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.model.Reinforcement; + +/** + * Called when a block is destroyed by an acid block + * + */ +public class ReinforcementAcidBlockedEvent extends ReinforcementEvent { + private static final HandlerList handlers = new HandlerList(); + + private Reinforcement acidBlock; + + public ReinforcementAcidBlockedEvent(Player player, Reinforcement acidBlock,Reinforcement destroyedBlock) { + super(player, destroyedBlock); + this.acidBlock = acidBlock; + } + + /** + * Gets the reinforcement of the acid block. + * @return Acid block reinforcement + */ + public Reinforcement getAcidBlockReinforcement() { + return acidBlock; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} \ No newline at end of file diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java index 7ba6e947..898186e0 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java @@ -3,7 +3,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; /** * Called when a player bypasses a reinforcement they have access to diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java index eeb81060..58aa3ca5 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java @@ -3,7 +3,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; /** diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java index 9e560225..6ac61c52 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java @@ -3,7 +3,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; /** * Called when a new reinforcement is created diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java index fcc45b88..66fba183 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java @@ -3,7 +3,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; /** * Called when a reinforcement is damaged by a player diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java index 517ea74d..0f108baf 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java @@ -4,7 +4,7 @@ import org.bukkit.event.Cancellable; import org.bukkit.event.player.PlayerEvent; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; public abstract class ReinforcementEvent extends PlayerEvent implements Cancellable { diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java b/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java index bed812ac..6ba64e87 100644 --- a/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java +++ b/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java @@ -3,7 +3,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.namelayer.group.Group; /** diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/vg/civcraft/mc/citadel/listener/BlockListener.java index cb3b1795..0445ffaf 100644 --- a/src/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -1,8 +1,5 @@ package vg.civcraft.mc.citadel.listener; -import static vg.civcraft.mc.citadel.Utility.isAuthorizedPlayerNear; -import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; - import java.util.Arrays; import java.util.List; @@ -10,6 +7,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; import org.bukkit.block.Container; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -18,20 +16,17 @@ import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPhysicsEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.material.Comparator; -import org.bukkit.material.MaterialData; import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; public class BlockListener implements Listener { @@ -41,12 +36,6 @@ public class BlockListener implements Listener { public static final List planar_sides = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - private double maxRedstoneDistance; - - public BlockListener(double maxRedstoneDistance) { - this.maxRedstoneDistance = maxRedstoneDistance; - } - // Stop comparators from being placed unless the reinforcement is insecure @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void comparatorPlaceCheck(BlockPlaceEvent event) { @@ -111,56 +100,35 @@ public void blockBreakEvent(BlockBreakEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonExtend(BlockPistonExtendEvent bpee) { - for (Block block : bpee.getBlocks()) { - Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); - if (reinforcement != null) { - bpee.setCancelled(true); - break; - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonRetract(BlockPistonRetractEvent bpre) { - for (Block block : bpre.getBlocks()) { - Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); - if (reinforcement != null) { - bpre.setCancelled(true); - break; - } - } - } - private static final Material matfire = Material.FIRE; @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void blockBurn(BlockBurnEvent bbe) { - boolean wasprotected = maybeReinforcementDamaged(bbe.getBlock()); - if (wasprotected) { - bbe.setCancelled(wasprotected); - Block block = bbe.getBlock(); - // Basic essential fire protection - if (block.getRelative(0, 1, 0).getType() == matfire) { - block.getRelative(0, 1, 0).setType(Material.AIR); - } // Essential - // Extended fire protection (recommend) - if (block.getRelative(1, 0, 0).getType() == matfire) { - block.getRelative(1, 0, 0).setType(Material.AIR); - } - if (block.getRelative(-1, 0, 0).getType() == matfire) { - block.getRelative(-1, 0, 0).setType(Material.AIR); - } - if (block.getRelative(0, -1, 0).getType() == matfire) { - block.getRelative(0, -1, 0).setType(Material.AIR); - } - if (block.getRelative(0, 0, 1).getType() == matfire) { - block.getRelative(0, 0, 1).setType(Material.AIR); - } - if (block.getRelative(0, 0, -1).getType() == matfire) { - block.getRelative(0, 0, -1).setType(Material.AIR); - } + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(bbe.getBlock()); + if (reinforcement == null) { + return; + } + bbe.setCancelled(true); + Block block = bbe.getBlock(); + // Basic essential fire protection + if (block.getRelative(0, 1, 0).getType() == matfire) { + block.getRelative(0, 1, 0).setType(Material.AIR); + } // Essential + // Extended fire protection (recommend) + if (block.getRelative(1, 0, 0).getType() == matfire) { + block.getRelative(1, 0, 0).setType(Material.AIR); + } + if (block.getRelative(-1, 0, 0).getType() == matfire) { + block.getRelative(-1, 0, 0).setType(Material.AIR); + } + if (block.getRelative(0, -1, 0).getType() == matfire) { + block.getRelative(0, -1, 0).setType(Material.AIR); + } + if (block.getRelative(0, 0, 1).getType() == matfire) { + block.getRelative(0, 0, 1).setType(Material.AIR); + } + if (block.getRelative(0, 0, -1).getType() == matfire) { + block.getRelative(0, 0, -1).setType(Material.AIR); } } @@ -173,30 +141,6 @@ public void onBlockFromToEvent(BlockFromToEvent event) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void redstonePower(BlockRedstoneEvent bre) { - // prevent doors from being opened by redstone - if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { - return; - } - Block block = bre.getBlock(); - MaterialData blockData = block.getState().getData(); - if (!(blockData instanceof Openable)) { - return; - } - Openable openable = (Openable) blockData; - if (openable.isOpen()) { - return; - } - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); - if (rein == null) { - return; - } - if (!isAuthorizedPlayerNear(rein, maxRedstoneDistance)) { - bre.setNewCurrent(bre.getOldCurrent()); - } - } - @EventHandler(priority = EventPriority.LOW) public void interact(PlayerInteractEvent pie) { if (!pie.hasBlock()) { @@ -247,6 +191,7 @@ public void blockPhysEvent(BlockPhysicsEvent event) { } + // prevent placing water inside of reinforced blocks @EventHandler(priority = EventPriority.HIGHEST) public void liquidDumpEvent(PlayerBucketEmptyEvent event) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); @@ -258,4 +203,15 @@ public void liquidDumpEvent(PlayerBucketEmptyEvent event) { event.setCancelled(true); } } + + //prevent breaking reinforced blocks through plant growth + @EventHandler(ignoreCancelled = true) + public void onStructureGrow(StructureGrowEvent event) { + for (BlockState block_state : event.getBlocks()) { + if (ReinforcementLogic.getReinforcementProtecting(block_state.getBlock()) != null) { + event.setCancelled(true); + return; + } + } + } } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 1f1bd9fa..4924a92b 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -1,8 +1,5 @@ package vg.civcraft.mc.citadel.listener; -import static vg.civcraft.mc.citadel.Utility.getRealBlock; -import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -24,9 +21,9 @@ import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelWorldManager; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; @@ -54,18 +51,26 @@ public void explode(EntityExplodeEvent eee) { //prevent zombies from breaking reinforced doors @EventHandler(ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { - ebde.setCancelled(maybeReinforcementDamaged(getRealBlock(ebde.getBlock()))); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ebde.getBlock()); + if (rein != null) { + ebde.setCancelled(true); + ReinforcementLogic.damageReinforcement(rein, 1.0); + } } @EventHandler(ignoreCancelled = true) public void changeBlock(EntityChangeBlockEvent ecbe) { - ecbe.setCancelled(maybeReinforcementDamaged(ecbe.getBlock())); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ecbe.getBlock()); + if (rein != null) { + ecbe.setCancelled(true); + ReinforcementLogic.damageReinforcement(rein, 1.0); + } } // prevent creating golems from reinforced blocks @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void spawn(CreatureSpawnEvent cse) { - CitadelWorldManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); + GlobalReinforcementManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); EntityType type = cse.getEntityType(); if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER && type != EntityType.SILVERFISH) { diff --git a/src/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/vg/civcraft/mc/citadel/listener/InventoryListener.java index fa6dcd8c..95c650b8 100644 --- a/src/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -1,123 +1,47 @@ package vg.civcraft.mc.citadel.listener; -import org.bukkit.Location; -import org.bukkit.block.BlockState; -import org.bukkit.block.DoubleChest; +import org.bukkit.block.Container; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementManager; -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.model.Reinforcement; public class InventoryListener implements Listener { - private ReinforcementManager rm = Citadel.getReinforcementManager(); - - public PlayerReinforcement getReinforcement(Inventory inv) { - // Returns reinforcement of the inventory's holder or null if none - // exists - final InventoryHolder holder = inv.getHolder(); - Location loc; - if (holder instanceof DoubleChest) { - loc = Utility.getRealBlock(((DoubleChest) holder).getLocation().getBlock()).getLocation(); - } else if (holder instanceof BlockState) { - loc = Utility.getRealBlock(((BlockState) holder).getLocation().getBlock()).getLocation(); - } else { - // Entity or Vehicle inventories - return null; - } - Reinforcement rein = rm.getReinforcement(loc); - if (rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement) rein; - return pr; - } - return null; - } + //prevent sucking reinforcements out of reinforced containers with hoppers on different groups or filling into them @EventHandler(ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { - // Prevent hopper minecarts from extracting from reinforced containers - // or - // filling up reinforced containers. - // Prevent misowned hoppers from stealing from reinforced containers. - // - // Allowed transfers: - // Assertions: - // Public reinforcement == Non-reinforced - // Y is a member of Group X - // Insecure sources act like public reinforcements - // Public -> Public - // Public -> Group X - // Public -> Personal Y - // Group X -> Group X - // Group X -> Personal Y - // Personal Y -> Personal Y - - // Fail safe - event.setCancelled(true); - // Source - final Inventory src = event.getSource(); - final PlayerReinforcement srcRein = getReinforcement(src); - // Destination - final Inventory dest = event.getDestination(); - final PlayerReinforcement destRein = getReinforcement(dest); - if (srcRein == null) { - if (destRein != null) { - final Group destOwner = destRein.getGroup(); - if (destOwner != null && destOwner.isDisciplined()) { - // Dest is disabled, deny - return; - } - } - // Public can transfer into any, allow - // (Public -> Public, Public -> Group X, Public -> Personal Y) - event.setCancelled(false); - return; + Inventory SourceInv = event.getSource(); + Reinforcement sourceRein = null; + if (SourceInv.getHolder() instanceof Container) { + sourceRein = ReinforcementLogic.getReinforcementProtecting(((Container) SourceInv.getHolder()).getBlock()); } - if (srcRein.isInsecure()) { - // Insecure source reinforcement allows transfer as if it's - // a public reinforcement, allow - event.setCancelled(false); - return; + Inventory destInv = event.getDestination(); + Reinforcement destRein = null; + if (destInv.getHolder() instanceof Container) { + destRein = ReinforcementLogic.getReinforcementProtecting(((Container) destInv.getHolder()).getBlock()); } - // Assertion: srcRein != null - if (destRein == null) { - // Non-public cannot transfer into a public, deny + if (sourceRein == null && destRein == null) { return; } - // Assertion: srcRein != null && destRein != null - final Group srcOwner = srcRein.getGroup(); - final Group destOwner = destRein.getGroup(); - // Check for null group failure - if (srcOwner == null || destOwner == null) { - /* - * if (Citadel.verboseEnabled(VerboseMsg.NullGroup)) { String msg; - * if (srcOwner == null) { msg = Citadel.verboseFmt( - * VerboseMsg.NullGroup, "srcOwner", srcRein.getOwnerName()); } else - * { // destOwner == null msg = Citadel.verboseFmt( - * VerboseMsg.NullGroup, "dstOwner", destRein.getOwnerName()); } if - * (!priorMessages_.contains(msg)) { Citadel.info(msg); - * priorMessages_.add(msg); } } - */ - // Unable to determine reinforcement owner match, deny + if (sourceRein != null && destRein == null) { + if (!sourceRein.isInsecure()) { + event.setCancelled(true); + } return; } - if (srcOwner.isDisciplined() || destOwner.isDisciplined()) { - // Disabled group involved, deny + if (sourceRein == null && destRein != null) { + if (!destRein.isInsecure()) { + event.setCancelled(true); + } return; } - if (srcOwner == destOwner) { - // Reinforcement owners match, allow - // (Group X -> Group X, Personal Y -> Personal Y) - event.setCancelled(false); - return; + //both reinforced at this point + if (sourceRein.getGroup().getGroupId() != destRein.getGroup().getGroupId()) { + event.setCancelled(true); } - // Reinforcement owners don't match, deny } } \ No newline at end of file diff --git a/src/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/vg/civcraft/mc/citadel/listener/RedstoneListener.java new file mode 100644 index 00000000..ca6d5a4a --- /dev/null +++ b/src/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -0,0 +1,199 @@ +package vg.civcraft.mc.citadel.listener; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.material.Button; +import org.bukkit.material.Door; +import org.bukkit.material.MaterialData; +import org.bukkit.material.Openable; +import org.bukkit.material.PressurePlate; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.model.Reinforcement; + +public class RedstoneListener implements Listener { + + private double maxRedstoneDistance; + + private Map> authorizations; + + public RedstoneListener(double maxRedstoneDistance) { + this.maxRedstoneDistance = maxRedstoneDistance; + Bukkit.getScheduler().scheduleSyncRepeatingTask(Citadel.getInstance(), () -> { + authorizations.clear(); + }, 1L, 1L); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void pressButton(PlayerInteractEvent e) { + if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + if (e.getClickedBlock().getType() != Material.STONE_BUTTON + && e.getClickedBlock().getType() != Material.WOOD_BUTTON) { + return; + } + Button button = (Button) (e.getClickedBlock().getState().getData()); + Block buttonBlock = e.getClickedBlock(); + Block attachedBlock = e.getClickedBlock().getRelative(button.getAttachedFace().getOppositeFace()); + // prepare all sides of button itself + setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getAttachedFace()); + // prepare all sides of the block attached to + setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getAttachedFace().getOppositeFace()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void stepPressurePlate(PlayerInteractEvent e) { + if (e.getAction() != Action.PHYSICAL) { + return; + } + if (!(e.getClickedBlock().getState().getData() instanceof PressurePlate)) { + return; + } + setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); + } + + private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { + for (BlockFace face : BlockListener.all_sides) { + if (face == skip) { + continue; + } + Block rel = block.getRelative(face); + MaterialData blockData = rel.getState().getData(); + if (!(blockData instanceof Openable)) { + continue; + } + Location locationToSave; + if (blockData instanceof Door) { + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + // block is upper half of a door + locationToSave = rel.getRelative(BlockFace.DOWN).getLocation(); + } else { + // already the lower half of the door + locationToSave = rel.getLocation(); + } + } else { + locationToSave = rel.getLocation(); + } + List existingAuths = authorizations.get(locationToSave); + if (existingAuths == null) { + existingAuths = new LinkedList(); + authorizations.put(locationToSave, existingAuths); + } + existingAuths.add(player.getUniqueId()); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void redstonePower(BlockRedstoneEvent bre) { + // prevent doors from being opened by redstone + if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { + return; + } + Block block = bre.getBlock(); + MaterialData blockData = block.getState().getData(); + if (!(blockData instanceof Openable)) { + return; + } + Openable openable = (Openable) blockData; + if (openable.isOpen()) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein == null) { + return; + } + if (rein.isInsecure()) { + boolean playerNearby = isAuthorizedPlayerNear(rein, maxRedstoneDistance); + if (!playerNearby) { + bre.setNewCurrent(bre.getOldCurrent()); + } + return; + } + List playersActivating = authorizations.get(block.getLocation()); + if (playersActivating == null) { + bre.setNewCurrent(bre.getOldCurrent()); + return; + } + for (UUID uuid : playersActivating) { + if (rein.hasPermission(uuid, Citadel.doorPerm)) { + // single valid perm is enough to open + return; + } + } + // noone valid found nearby, so deny + bre.setNewCurrent(bre.getOldCurrent()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void pistonExtend(BlockPistonExtendEvent bpee) { + for (Block block : bpee.getBlocks()) { + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); + if (reinforcement != null) { + bpee.setCancelled(true); + break; + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void pistonRetract(BlockPistonRetractEvent bpre) { + for (Block block : bpre.getBlocks()) { + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); + if (reinforcement != null) { + bpre.setCancelled(true); + break; + } + } + } + + private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { + Location reinLocation = reinforcement.getLocation(); + double min_x = reinLocation.getX() - distance; + double min_z = reinLocation.getZ() - distance; + double max_x = reinLocation.getX() + distance; + double max_z = reinLocation.getZ() + distance; + boolean result = false; + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.isDead()) { + continue; + } + Location playerLocation = player.getLocation(); + double player_x = playerLocation.getX(); + double player_z = playerLocation.getZ(); + // Simple bounding box check to quickly rule out Players + // before doing the more expensive playerLocation.distance + if (player_x < min_x || player_x > max_x || player_z < min_z || player_z > max_z) { + continue; + } + if (!reinforcement.hasPermission(player, Citadel.doorPerm)) { + continue; + } + double distanceSquared = playerLocation.distance(reinLocation); + if (distanceSquared <= distance) { + result = true; + break; + } + } + return result; + } + +} diff --git a/src/vg/civcraft/mc/citadel/listener/WorldListener.java b/src/vg/civcraft/mc/citadel/listener/WorldListener.java deleted file mode 100644 index 7fe9c5d6..00000000 --- a/src/vg/civcraft/mc/citadel/listener/WorldListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package vg.civcraft.mc.citadel.listener; - -import org.bukkit.block.BlockState; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.StructureGrowEvent; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementManager; - -public class WorldListener implements Listener{ - @EventHandler(ignoreCancelled = true) - public void onStructureGrow(StructureGrowEvent event) { - ReinforcementManager rm = Citadel.getReinforcementManager(); - for (BlockState block_state : event.getBlocks()) { - if (rm.getReinforcement(block_state.getLocation()) != null) { - event.setCancelled(true); - /*Citadel.verbose( - VerboseMsg.ReinOvergrowth, - block_state.getLocation().toString()); - */ - return; - } - } - } -} diff --git a/src/vg/civcraft/mc/citadel/AcidManager.java b/src/vg/civcraft/mc/citadel/model/AcidManager.java similarity index 73% rename from src/vg/civcraft/mc/citadel/AcidManager.java rename to src/vg/civcraft/mc/citadel/model/AcidManager.java index 163b8167..46f47001 100644 --- a/src/vg/civcraft/mc/citadel/AcidManager.java +++ b/src/vg/civcraft/mc/citadel/model/AcidManager.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.model; import java.util.Collection; import java.util.Set; @@ -7,7 +7,6 @@ import org.bukkit.Material; import org.bukkit.block.Block; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; public class AcidManager { @@ -34,17 +33,6 @@ public boolean isPossibleAcidBlock(Block b) { } return material.contains(mat); } - - /** - * Checks if acid blocking is enabled for this reinforcement - * - * @param rein Reinforcement to check for - * @return True if the reinforcement can acid block other reinforcements and has - * an acid timer configured - */ - public boolean canBeAcidBlock(Reinforcement rein) { - return canBeAcidBlock(rein.getType()); - } /** * Checks if acid blocking is enabled for this reinforcement type @@ -53,8 +41,10 @@ public boolean canBeAcidBlock(Reinforcement rein) { * @return True if the reinforcement type can acid block other reinforcements and has * an acid timer configured */ - public boolean canBeAcidBlock(ReinforcementType type) { - return type.getAcidTime() >= 0; + public boolean canAcidBlock(ReinforcementType acidBlock, ReinforcementType victim) { + //TODO + + return true; } /** diff --git a/src/vg/civcraft/mc/citadel/ChunkCache.java b/src/vg/civcraft/mc/citadel/model/ChunkCache.java similarity index 77% rename from src/vg/civcraft/mc/citadel/ChunkCache.java rename to src/vg/civcraft/mc/citadel/model/ChunkCache.java index ddcab0fc..9f3e838a 100644 --- a/src/vg/civcraft/mc/citadel/ChunkCache.java +++ b/src/vg/civcraft/mc/citadel/model/ChunkCache.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.model; import java.util.ArrayList; import java.util.Collection; @@ -9,19 +9,18 @@ import org.bukkit.Location; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; - public class ChunkCache { - private final ChunkPair chunkPair; + private final ChunkCoord chunkPair; private Map reinforcements; private List deletedReinforcements; private boolean isDirty; private final int worldID; - public ChunkCache(ChunkPair chunkPair, Collection reins, int worldID) { + public ChunkCache(ChunkCoord chunkPair, Collection reins, int worldID) { this.reinforcements = new TreeMap<>(); for (Reinforcement rein : reins) { + rein.setOwningCache(this); reinforcements.put(new Coords(rein.getLocation()), rein); } this.chunkPair = chunkPair; @@ -39,9 +38,10 @@ public void insertReinforcement(Reinforcement rein) { throw new IllegalStateException( "Trying to insert reinforcement at " + rein.getLocation().toString() + ", but one already existed"); } + rein.setOwningCache(this); reinforcements.put(key, rein); } - + public void removeReinforcement(Reinforcement rein) { Coords key = new Coords(rein.getLocation()); Reinforcement removed = reinforcements.remove(key); @@ -54,7 +54,7 @@ public void removeReinforcement(Reinforcement rein) { deletedReinforcements.add(rein); } - public ChunkPair getChunkPair() { + public ChunkCoord getChunkPair() { return chunkPair; } @@ -62,6 +62,13 @@ public Reinforcement getReinforcement(int x, int y, int z) { return reinforcements.get(new Coords(x, y, z)); } + /** + * Used when dumping all reinforcements to the database. Returns not only the + * existing reinforcements, but also the ones deleted and not yet removed from + * the database + * + * @return All reinforcements possibly needing to be persisted to the database + */ public Collection getAllAndCleanUp() { List reins = new ArrayList<>(); reins.addAll(deletedReinforcements); @@ -70,6 +77,17 @@ public Collection getAllAndCleanUp() { return reins; } + /** + * Gets all existing reinforcements within this chunk + * + * @return All reinforcements + */ + public Collection getAll() { + List reins = new ArrayList<>(); + reins.addAll(reinforcements.values()); + return reins; + } + public boolean isDirty() { return isDirty; } diff --git a/src/vg/civcraft/mc/citadel/ChunkPair.java b/src/vg/civcraft/mc/citadel/model/ChunkCoord.java similarity index 50% rename from src/vg/civcraft/mc/citadel/ChunkPair.java rename to src/vg/civcraft/mc/citadel/model/ChunkCoord.java index e509c2e8..cfb37d20 100644 --- a/src/vg/civcraft/mc/citadel/ChunkPair.java +++ b/src/vg/civcraft/mc/citadel/model/ChunkCoord.java @@ -1,13 +1,14 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.model; +import org.bukkit.Chunk; import org.bukkit.Location; -public class ChunkPair { +public class ChunkCoord { private int x; private int z; - public ChunkPair(int x, int z) { + public ChunkCoord(int x, int z) { this.x = x; this.z = z; } @@ -27,14 +28,18 @@ public long getCombinedKey() { return key; } - public static ChunkPair fromKey(long key) { + public static ChunkCoord fromKey(long key) { int x = (int) key; int z = (int) ((key >> 32) & 0x00000000); - return new ChunkPair(x, z); + return new ChunkCoord(x, z); } - public static ChunkPair forLocation(Location loc) { - return new ChunkPair(loc.getChunk().getX(), loc.getChunk().getZ()); + public static ChunkCoord forLocation(Location loc) { + return new ChunkCoord(loc.getChunk().getX(), loc.getChunk().getZ()); + } + + public static ChunkCoord forChunk(Chunk chunk) { + return new ChunkCoord(chunk.getX(), chunk.getZ()); } public int hashCode() { @@ -43,8 +48,8 @@ public int hashCode() { } public boolean equals(Object o) { - if (o instanceof ChunkPair) { - ChunkPair pair = (ChunkPair) o; + if (o instanceof ChunkCoord) { + ChunkCoord pair = (ChunkCoord) o; return pair.x == x && pair.z == z; } return false; diff --git a/src/vg/civcraft/mc/citadel/CitadelWorldManager.java b/src/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java similarity index 71% rename from src/vg/civcraft/mc/citadel/CitadelWorldManager.java rename to src/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java index 40f7d8fb..649f98d1 100644 --- a/src/vg/civcraft/mc/citadel/CitadelWorldManager.java +++ b/src/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java @@ -1,24 +1,25 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.model; +import java.util.Collection; import java.util.Map; import java.util.TreeMap; import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -public class CitadelWorldManager { +public class GlobalReinforcementManager { private Map uuidToInternalID; - private Map worldToManager; + private Map worldToManager; private CitadelReinforcementData dao; - public CitadelWorldManager(CitadelReinforcementData dao) { + public GlobalReinforcementManager(CitadelReinforcementData dao) { this.uuidToInternalID = new TreeMap<>(); this.worldToManager = new TreeMap<>(); this.dao = dao; @@ -41,7 +42,7 @@ public boolean registerWorld(World world) { return false; } uuidToInternalID.put(world.getUID(), id); - ReinforcementManager manager = new ReinforcementManager(dao, id); + WorldReinforcementManager manager = new WorldReinforcementManager(dao, id); worldToManager.put(world.getUID(), manager); return true; } @@ -64,7 +65,7 @@ public Reinforcement getReinforcement(Block block) { * @param rein Reinforcement created */ public void insertReinforcement(Reinforcement rein) { - ReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); + WorldReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); if (worldManager == null) { if (!registerWorld(rein.getLocation().getWorld())) { throw new IllegalStateException("Failed to register world"); @@ -82,7 +83,7 @@ public void insertReinforcement(Reinforcement rein) { * @return Reinforcement at the location if one exists, otherwise null */ public Reinforcement getReinforcement(Location location) { - ReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); + WorldReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); if (worldManager == null) { return null; } @@ -115,7 +116,7 @@ public boolean isReinforced(Block b) { * Saves all reinforcements out to the database */ public void flushAll() { - for (ReinforcementManager man : worldToManager.values()) { + for (WorldReinforcementManager man : worldToManager.values()) { man.invalidateAllReinforcements(); } } @@ -126,10 +127,26 @@ public void flushAll() { * @param rein The reinforcement destroyed */ public void removeReinforcement(Reinforcement rein) { - ReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); + WorldReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); if (worldManager == null) { throw new IllegalStateException("No world manager for reinforcement at " + rein.getLocation().toString()); } worldManager.removeReinforcement(rein); } + + /** + * Gets all reinforcements in a chunk. Only use this if you know what you're doing + * @param chunk Chunk to get reinforcements for + * @return All reinforcements within the chunk + */ + public Collection getAllReinforcements(Chunk chunk) { + if (chunk == null) { + throw new IllegalArgumentException("Chunk can not be null"); + } + WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); + if (worldManager == null) { + throw new IllegalStateException("No world manager for reinforcement in " + chunk.getWorld().toString()); + } + return worldManager.getAllReinforcements(chunk); + } } diff --git a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java b/src/vg/civcraft/mc/citadel/model/Reinforcement.java similarity index 89% rename from src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java rename to src/vg/civcraft/mc/citadel/model/Reinforcement.java index 882b33da..65f1d2e6 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/Reinforcement.java +++ b/src/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -1,9 +1,10 @@ -package vg.civcraft.mc.citadel.reinforcement; +package vg.civcraft.mc.citadel.model; + +import java.util.UUID; import org.bukkit.Location; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.ChunkCache; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; @@ -24,7 +25,7 @@ public class Reinforcement { private ChunkCache owningCache; public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, - boolean isDirty, boolean isNew, boolean insecure, ChunkCache cache) { + boolean isDirty, boolean isNew, boolean insecure) { if (loc == null) { throw new IllegalArgumentException("Location for reinforcement can not be null"); } @@ -39,11 +40,17 @@ public Reinforcement(Location loc, ReinforcementType type, int groupID, long cre this.groupId = groupID; this.isNew = isNew; this.insecure = insecure; - this.owningCache = cache; } public Reinforcement(Location loc, ReinforcementType type, Group group, ChunkCache cache) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false, cache); + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + } + + /** + * Sets which cache this reinforcement belongs to. Cache is expected to set this when beginning to track the reinforcement + */ + void setOwningCache(ChunkCache cache) { + this.owningCache = cache; } /** @@ -190,10 +197,14 @@ public long getAge() { } public boolean hasPermission(Player p, String permission) { + return hasPermission(p.getUniqueId(), permission); + } + + public boolean hasPermission(UUID uuid, String permission) { Group g = getGroup(); if (g == null) { return false; } - return NameAPI.getGroupManager().hasAccess(g, p.getUniqueId(), PermissionType.getPermission(permission)); + return NameAPI.getGroupManager().hasAccess(g, uuid, PermissionType.getPermission(permission)); } } diff --git a/src/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java similarity index 68% rename from src/vg/civcraft/mc/citadel/ReinforcementManager.java rename to src/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java index 8e73dd9b..2bd677f8 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java @@ -1,5 +1,8 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.model; +import java.util.Collection; + +import org.bukkit.Chunk; import org.bukkit.Location; import com.google.common.cache.CacheBuilder; @@ -9,24 +12,23 @@ import com.google.common.cache.RemovalNotification; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -public class ReinforcementManager { +public class WorldReinforcementManager { private final int worldID; - private final LoadingCache reinforcements; + private final LoadingCache reinforcements; - public ReinforcementManager(CitadelReinforcementData db, int worldID) { + public WorldReinforcementManager(CitadelReinforcementData db, int worldID) { this.worldID = worldID; - this.reinforcements = CacheBuilder.newBuilder().removalListener(new RemovalListener() { - public void onRemoval(RemovalNotification removal) { + this.reinforcements = CacheBuilder.newBuilder().removalListener(new RemovalListener() { + public void onRemoval(RemovalNotification removal) { ChunkCache chunk = removal.getValue(); if (chunk.isDirty()) { db.saveReinforcements(chunk); } } - }).build(new CacheLoader() { - public ChunkCache load(ChunkPair loc) throws Exception { + }).build(new CacheLoader() { + public ChunkCache load(ChunkCoord loc) throws Exception { if (loc == null) { throw new IllegalArgumentException("Can not load reinforcements for null location"); } @@ -36,7 +38,7 @@ public ChunkCache load(ChunkPair loc) throws Exception { } public void insertReinforcement(Reinforcement reinforcement) { - ChunkPair key = ChunkPair.forLocation(reinforcement.getLocation()); + ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); ChunkCache cache = reinforcements.getIfPresent(key); if (cache == null) { throw new IllegalStateException("Chunk for created reinforcement was not loaded"); @@ -45,7 +47,7 @@ public void insertReinforcement(Reinforcement reinforcement) { } public void removeReinforcement(Reinforcement reinforcement) { - ChunkPair key = ChunkPair.forLocation(reinforcement.getLocation()); + ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); ChunkCache cache = reinforcements.getIfPresent(key); if (cache == null) { throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); @@ -71,7 +73,7 @@ public Reinforcement getReinforcement(Location loc) { if (loc == null) { throw new IllegalArgumentException("Can not get reinforcement for null location"); } - ChunkCache cache = reinforcements.getIfPresent(ChunkPair.forLocation(loc)); + ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forLocation(loc)); if (cache == null) { throw new IllegalStateException( "You can not check reinforcements for unloaded chunks. Load the chunk first"); @@ -100,4 +102,18 @@ public void invalidateAllReinforcements() { public boolean isReinforced(Location loc) { return getReinforcement(loc) != null; } + + /** + * Gets all reinforcements in a chunk. Only use this if you know what you're doing + * @param chunk Chunk to get reinforcements for + * @return All reinforcements within the chunk + */ + public Collection getAllReinforcements(Chunk chunk) { + ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forChunk(chunk)); + if (cache == null) { + throw new IllegalStateException( + "Can not retrieve reinforcements for unloaded chunks"); + } + return cache.getAll(); + } } diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 2efd6937..fdd3d08c 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -8,7 +8,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java index ff49b77c..43486f80 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java @@ -14,7 +14,7 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; public abstract class IPlayerState { diff --git a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java index de756f66..c71d1256 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -9,11 +9,11 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -import vg.civcraft.mc.citadel.AcidManager; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.util.TextUtil; public class InformationState extends IPlayerState { @@ -39,7 +39,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (player.getGameMode() == GameMode.CREATIVE) { e.setCancelled(true); } - if (!rein.hasPermission(player, "REINFORCEMENT_INFO")) { + if (!rein.hasPermission(player, Citadel.infoPerm)) { String msg = String.format("Reinforced %s with %s", formatHealth(rein), rein.getType().getName()); Utility.sendAndLog(player, ChatColor.RED, msg); return; diff --git a/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java index b7c36771..12e435d5 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -8,7 +8,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; public class InsecureState extends IPlayerState { diff --git a/src/vg/civcraft/mc/citadel/PlayerStateManager.java b/src/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java similarity index 87% rename from src/vg/civcraft/mc/citadel/PlayerStateManager.java rename to src/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index 2434c7b3..5ca96188 100644 --- a/src/vg/civcraft/mc/citadel/PlayerStateManager.java +++ b/src/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.playerstate; import java.util.Map; import java.util.TreeMap; @@ -6,9 +6,6 @@ import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; -import vg.civcraft.mc.citadel.playerstate.NormalState; - public class PlayerStateManager { private Map playerStateMap; diff --git a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 4d8bc325..175bec4e 100644 --- a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -11,7 +11,7 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; import vg.civcraft.mc.citadel.events.ReinforcementGroupChangeEvent; -import vg.civcraft.mc.citadel.reinforcement.Reinforcement; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; diff --git a/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java similarity index 89% rename from src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java rename to src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java index d7fdf07b..05582c36 100644 --- a/src/vg/civcraft/mc/citadel/ReinforcementTypeManager.java +++ b/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel; +package vg.civcraft.mc.citadel.reinforcementtypes; import java.util.Collection; import java.util.HashMap; @@ -7,8 +7,6 @@ import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; - public class ReinforcementTypeManager { private Map typesByItem; From 72c9e8329a47b6d993cea084363f68243fe9e380 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 14 Mar 2019 00:50:07 +0100 Subject: [PATCH 112/255] Reformat to be Maven compliant --- .classpath | 20 +++++++++++++++---- pom.xml | 14 ++++++++----- .../java}/vg/civcraft/mc/citadel/Citadel.java | 0 .../mc/citadel/CitadelConfigManager.java | 0 .../mc/citadel/ReinforcementLogic.java | 0 .../java}/vg/civcraft/mc/citadel/Utility.java | 0 .../vg/civcraft/mc/citadel/command/Acid.java | 0 .../mc/citadel/command/AreaReinforce.java | 0 .../civcraft/mc/citadel/command/Bypass.java | 0 .../mc/citadel/command/Fortification.java | 0 .../mc/citadel/command/Information.java | 0 .../civcraft/mc/citadel/command/Insecure.java | 0 .../vg/civcraft/mc/citadel/command/Off.java | 0 .../mc/citadel/command/Reinforce.java | 0 .../mc/citadel/command/ReinforcementsGUI.java | 0 .../database/CitadelReinforcementData.java | 0 .../events/ReinforcementAcidBlockedEvent.java | 0 .../events/ReinforcementBypassEvent.java | 0 .../events/ReinforcementChangeTypeEvent.java | 0 .../events/ReinforcementCreationEvent.java | 0 .../events/ReinforcementDamageEvent.java | 0 .../mc/citadel/events/ReinforcementEvent.java | 0 .../events/ReinforcementGroupChangeEvent.java | 0 .../mc/citadel/listener/BlockListener.java | 0 .../mc/citadel/listener/EntityListener.java | 0 .../citadel/listener/InventoryListener.java | 0 .../mc/citadel/listener/RedstoneListener.java | 0 .../mc/citadel/model/AcidManager.java | 0 .../civcraft/mc/citadel/model/ChunkCache.java | 0 .../civcraft/mc/citadel/model/ChunkCoord.java | 0 .../model/GlobalReinforcementManager.java | 0 .../mc/citadel/model/Reinforcement.java | 0 .../model/WorldReinforcementManager.java | 0 .../playerstate/FortificationState.java | 0 .../mc/citadel/playerstate/IPlayerState.java | 0 .../citadel/playerstate/InformationState.java | 0 .../mc/citadel/playerstate/InsecureState.java | 0 .../mc/citadel/playerstate/NormalState.java | 0 .../playerstate/PlayerStateManager.java | 0 .../citadel/playerstate/ReinforcingState.java | 0 .../ReinforcementEffect.java | 0 .../reinforcementtypes/ReinforcementType.java | 0 .../ReinforcementTypeManager.java | 0 config.yml => src/main/resources/config.yml | 0 plugin.yml => src/main/resources/plugin.yml | 0 45 files changed, 25 insertions(+), 9 deletions(-) rename src/{ => main/java}/vg/civcraft/mc/citadel/Citadel.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/CitadelConfigManager.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/ReinforcementLogic.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/Utility.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Acid.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/AreaReinforce.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Bypass.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Fortification.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Information.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Insecure.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Off.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/Reinforce.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/listener/BlockListener.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/listener/EntityListener.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/listener/InventoryListener.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/listener/RedstoneListener.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/AcidManager.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/ChunkCache.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/ChunkCoord.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/Reinforcement.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/FortificationState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/IPlayerState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/InformationState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/InsecureState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/NormalState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java (100%) rename src/{ => main/java}/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java (100%) rename config.yml => src/main/resources/config.yml (100%) rename plugin.yml => src/main/resources/plugin.yml (100%) diff --git a/.classpath b/.classpath index 149cb3c9..920a0d21 100644 --- a/.classpath +++ b/.classpath @@ -1,20 +1,32 @@ - + - - + - + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index a94a1f30..af743313 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 @@ -23,17 +24,20 @@ - ${basedir}/src - - ${basedir} + ${basedir}/src/main/resources - LICENSE.txt *.yml true + + ${basedir} + + LICENSE.txt + + diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java similarity index 100% rename from src/vg/civcraft/mc/citadel/Citadel.java rename to src/main/java/vg/civcraft/mc/citadel/Citadel.java diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/CitadelConfigManager.java rename to src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java diff --git a/src/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java similarity index 100% rename from src/vg/civcraft/mc/citadel/ReinforcementLogic.java rename to src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java diff --git a/src/vg/civcraft/mc/citadel/Utility.java b/src/main/java/vg/civcraft/mc/citadel/Utility.java similarity index 100% rename from src/vg/civcraft/mc/citadel/Utility.java rename to src/main/java/vg/civcraft/mc/citadel/Utility.java diff --git a/src/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Acid.java rename to src/main/java/vg/civcraft/mc/citadel/command/Acid.java diff --git a/src/vg/civcraft/mc/citadel/command/AreaReinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/AreaReinforce.java rename to src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java diff --git a/src/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Bypass.java rename to src/main/java/vg/civcraft/mc/citadel/command/Bypass.java diff --git a/src/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Fortification.java rename to src/main/java/vg/civcraft/mc/citadel/command/Fortification.java diff --git a/src/vg/civcraft/mc/citadel/command/Information.java b/src/main/java/vg/civcraft/mc/citadel/command/Information.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Information.java rename to src/main/java/vg/civcraft/mc/citadel/command/Information.java diff --git a/src/vg/civcraft/mc/citadel/command/Insecure.java b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Insecure.java rename to src/main/java/vg/civcraft/mc/citadel/command/Insecure.java diff --git a/src/vg/civcraft/mc/citadel/command/Off.java b/src/main/java/vg/civcraft/mc/citadel/command/Off.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Off.java rename to src/main/java/vg/civcraft/mc/citadel/command/Off.java diff --git a/src/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/Reinforce.java rename to src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java diff --git a/src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java similarity index 100% rename from src/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java rename to src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java diff --git a/src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java similarity index 100% rename from src/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java rename to src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java diff --git a/src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java similarity index 100% rename from src/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java rename to src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java diff --git a/src/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java similarity index 100% rename from src/vg/civcraft/mc/citadel/listener/BlockListener.java rename to src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java similarity index 100% rename from src/vg/civcraft/mc/citadel/listener/EntityListener.java rename to src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java diff --git a/src/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java similarity index 100% rename from src/vg/civcraft/mc/citadel/listener/InventoryListener.java rename to src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java diff --git a/src/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java similarity index 100% rename from src/vg/civcraft/mc/citadel/listener/RedstoneListener.java rename to src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java diff --git a/src/vg/civcraft/mc/citadel/model/AcidManager.java b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/AcidManager.java rename to src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java diff --git a/src/vg/civcraft/mc/citadel/model/ChunkCache.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/ChunkCache.java rename to src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java diff --git a/src/vg/civcraft/mc/citadel/model/ChunkCoord.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/ChunkCoord.java rename to src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java diff --git a/src/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java rename to src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java diff --git a/src/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/Reinforcement.java rename to src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java diff --git a/src/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java rename to src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/FortificationState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/IPlayerState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/IPlayerState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/IPlayerState.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/InformationState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/InsecureState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/NormalState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java diff --git a/src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java similarity index 100% rename from src/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java similarity index 100% rename from src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java rename to src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java similarity index 100% rename from src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java rename to src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java diff --git a/src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java similarity index 100% rename from src/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java rename to src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java diff --git a/config.yml b/src/main/resources/config.yml similarity index 100% rename from config.yml rename to src/main/resources/config.yml diff --git a/plugin.yml b/src/main/resources/plugin.yml similarity index 100% rename from plugin.yml rename to src/main/resources/plugin.yml From e7bdc171f3e9287bde8266b45f2bc64b9a7306b3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 14 Mar 2019 00:52:49 +0100 Subject: [PATCH 113/255] Remove eclipse project files, because Orinarri broke the .gitignore with autogenerated bs --- .classpath | 32 ---------------------------- .gitignore | 12 +++++++++++ .project | 23 -------------------- .settings/org.eclipse.jdt.core.prefs | 6 ------ .settings/org.eclipse.m2e.core.prefs | 4 ---- 5 files changed, 12 insertions(+), 65 deletions(-) delete mode 100644 .classpath delete mode 100644 .project delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs diff --git a/.classpath b/.classpath deleted file mode 100644 index 920a0d21..00000000 --- a/.classpath +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore index 85326f70..39180875 100644 --- a/.gitignore +++ b/.gitignore @@ -195,3 +195,15 @@ $RECYCLE.BIN/ *.lnk # End of https://www.gitignore.io/api/java,batch,linux,macos,maven,windows,intellij+all + + +#Eclipse stuff +/target/ +.classpath +.settings/** +.project +/logs/ +dependency-reduced-pom.xml +/target/ + +/bin/ diff --git a/.project b/.project deleted file mode 100644 index c2b2a986..00000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - Citadel - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b8947ec6..00000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,6 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1..00000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 From d551a97e62919a90a5d965d931c70dc1ad58b563 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 14 Mar 2019 01:22:14 +0100 Subject: [PATCH 114/255] Final 12 --- pom.xml | 1 - .../java/vg/civcraft/mc/citadel/Citadel.java | 130 ++++++------ .../mc/citadel/CitadelConfigManager.java | 153 +++++++------- .../mc/citadel/ReinforcementLogic.java | 72 +++---- .../java/vg/civcraft/mc/citadel/Utility.java | 136 ++++++------ .../vg/civcraft/mc/citadel/command/Acid.java | 2 +- .../civcraft/mc/citadel/command/Bypass.java | 4 +- .../mc/citadel/command/Fortification.java | 10 +- .../mc/citadel/command/Information.java | 7 +- .../civcraft/mc/citadel/command/Insecure.java | 7 +- .../mc/citadel/command/Reinforce.java | 10 +- .../database/CitadelReinforcementData.java | 197 +++++++++--------- .../events/ReinforcementAcidBlockedEvent.java | 11 +- .../events/ReinforcementBypassEvent.java | 8 +- .../events/ReinforcementChangeTypeEvent.java | 18 +- .../events/ReinforcementCreationEvent.java | 8 +- .../events/ReinforcementDamageEvent.java | 18 +- .../mc/citadel/events/ReinforcementEvent.java | 6 +- .../events/ReinforcementGroupChangeEvent.java | 17 +- .../mc/citadel/listener/BlockListener.java | 186 ++++++++--------- .../mc/citadel/listener/EntityListener.java | 58 +++--- .../citadel/listener/InventoryListener.java | 5 +- .../mc/citadel/listener/RedstoneListener.java | 172 +++++++-------- .../mc/citadel/model/AcidManager.java | 42 ++-- .../civcraft/mc/citadel/model/ChunkCache.java | 152 +++++++------- .../civcraft/mc/citadel/model/ChunkCoord.java | 54 ++--- .../model/GlobalReinforcementManager.java | 114 +++++----- .../mc/citadel/model/Reinforcement.java | 169 +++++++-------- .../model/WorldReinforcementManager.java | 68 +++--- ...yerState.java => AbstractPlayerState.java} | 15 +- .../playerstate/FortificationState.java | 47 +++-- .../citadel/playerstate/InformationState.java | 39 ++-- .../mc/citadel/playerstate/InsecureState.java | 13 +- .../mc/citadel/playerstate/NormalState.java | 12 +- .../playerstate/PlayerStateManager.java | 29 ++- .../citadel/playerstate/ReinforcingState.java | 20 +- .../ReinforcementEffect.java | 44 ++-- .../reinforcementtypes/ReinforcementType.java | 102 +++++---- .../ReinforcementTypeManager.java | 22 +- 39 files changed, 1115 insertions(+), 1063 deletions(-) rename src/main/java/vg/civcraft/mc/citadel/playerstate/{IPlayerState.java => AbstractPlayerState.java} (92%) diff --git a/pom.xml b/pom.xml index af743313..f7055885 100644 --- a/pom.xml +++ b/pom.xml @@ -71,5 +71,4 @@ https://hub.spigotmc.org/nexus/content/groups/public/ - diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 5610ee95..08b8bc25 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -20,10 +20,9 @@ import vg.civcraft.mc.namelayer.permission.PermissionType; public class Citadel extends ACivMod { - - private static Logger logger; - + public static final String chestPerm = "CHESTS"; + public static final String bypassPerm = "BYPASS_REINFORCEMENT"; public static final String cropsPerm = "CROPS"; public static final String insecurePerm = "INSECURE_REINFORCEMENT"; @@ -31,14 +30,75 @@ public class Citadel extends ACivMod { public static final String doorPerm = "DOORS"; public static final String acidPerm = "ACIDBLOCK"; public static final String infoPerm = "REINFORCEMENT_INFO"; + private static Citadel instance; + public static Citadel getInstance() { + return instance; + } + + private Logger logger; private CitadelReinforcementData db; private GlobalReinforcementManager worldManager; private CitadelConfigManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; + private PlayerStateManager stateManager; - private static Citadel instance; + + /** + * @return Acid block manager + */ + public AcidManager getAcidManager() { + return acidManager; + } + + /** + * @return The Database Manager for Citadel. + */ + public CitadelReinforcementData getCitadelDatabase() { + return db; + } + + public CitadelConfigManager getConfigManager() { + return config; + } + + @Override + public String getPluginName() { + return "Citadel"; + } + + /** + * @return The ReinforcementManager of Citadel. + */ + public GlobalReinforcementManager getReinforcementManager() { + return worldManager; + } + + public ReinforcementTypeManager getReinforcementTypeManager() { + return typeManager; + } + + public PlayerStateManager getStateManager() { + return stateManager; + } + + /** + * Initializes the database. + */ + public boolean initializeDatabase() { + ManagedDatasource mds = config.getDatabase(); + if (mds == null) { + return false; + } + db = new CitadelReinforcementData(mds, this, typeManager); + return db.startUp(); + } + + public void onDisable() { + // Pushes all reinforcements loaded to be saved to db. + worldManager.flushAll(); + } public void onEnable() { super.onEnable(); @@ -74,23 +134,6 @@ public void onEnable() { registerListeners(); } - public void onDisable() { - // Pushes all reinforcements loaded to be saved to db. - worldManager.flushAll(); - } - - /** - * Initializes the database. - */ - public boolean initializeDatabase() { - ManagedDatasource mds = config.getDatabase(); - if (mds == null) { - return false; - } - db = new CitadelReinforcementData(mds, this, typeManager); - return db.startUp(); - } - /** * Registers the listeners for Citadel. */ @@ -121,49 +164,4 @@ private void registerNameLayerPermissions() { PermissionType.registerPermission(cropsPerm, (LinkedList) membersAndAbove.clone()); PermissionType.registerPermission(insecurePerm, (LinkedList) membersAndAbove.clone()); } - - /** - * @return The ReinforcementManager of Citadel. - */ - public GlobalReinforcementManager getReinforcementManager() { - return worldManager; - } - - /** - * @return The instance of Citadel. - */ - public static Citadel getInstance() { - return instance; - } - - /** - * @return The Database Manager for Citadel. - */ - public CitadelReinforcementData getCitadelDatabase() { - return db; - } - - public ReinforcementTypeManager getReinforcementTypeManager() { - return typeManager; - } - - public PlayerStateManager getStateManager() { - return stateManager; - } - - public CitadelConfigManager getConfigManager() { - return config; - } - - /** - * @return Acid block manager - */ - public AcidManager getAcidManager() { - return acidManager; - } - - @Override - public String getPluginName() { - return "Citadel"; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index 80e0eafd..dd04f03d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -22,12 +22,14 @@ public class CitadelConfigManager extends CoreConfigManager { private List reinforcementTypes; private List acidMaterials; + private List globalBlackList; + private boolean logHostileBreaks; private boolean logFriendlyBreaks; private boolean logDamage; private boolean logCreation; private boolean logMessages; - + private double redstoneRange; public CitadelConfigManager(ACivMod plugin) { @@ -38,42 +40,60 @@ public List getAcidMaterials() { return acidMaterials; } - @Override - protected boolean parseInternal(ConfigurationSection config) { - database = (ManagedDatasource) config.get("database"); - parseReinforcementTypes(config.getConfigurationSection("reinforcements")); - parseAcidMaterials(config); - logHostileBreaks = config.getBoolean("logHostileBreaks", true); - logFriendlyBreaks = config.getBoolean("logFriendlyBreaks", true); - logDamage = config.getBoolean("logDamage", false); - logCreation = config.getBoolean("logCreation", true); - logMessages = config.getBoolean("logMessages", true); - redstoneRange = config.getDouble("redstoneDistance", 3); - return true; + public List getBlacklistedMaterials() { + return globalBlackList; + } + + public ManagedDatasource getDatabase() { + return database; } - + public double getMaxRedstoneDistance() { return redstoneRange; } - - public boolean logMessages() { - return logMessages; + + private ReinforcementEffect getReinforcementEffect(ConfigurationSection config) { + if (config == null) { + return null; + } + Particle effect; + try { + String effectName = config.getString("type"); + effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE : Particle.valueOf(effectName); + } catch (IllegalArgumentException e) { + logger.warning("Invalid effect at: " + config.getCurrentPath()); + return null; + } + float offsetX = (float) config.getDouble("offsetX", 0); + float offsetY = (float) config.getDouble("offsetY", 0); + float offsetZ = (float) config.getDouble("offsetZ", 0); + float speed = (float) config.getDouble("speed", 1); + int amount = config.getInt("particleCount", 1); + return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); } - public boolean logHostileBreaks() { - return logHostileBreaks; + public List getReinforcementTypes() { + return reinforcementTypes; } - public boolean logFriendlyBreaks() { - return logFriendlyBreaks; + public boolean logCreation() { + return logCreation; } public boolean logDamage() { return logDamage; } - public boolean logCreation() { - return logCreation; + public boolean logFriendlyBreaks() { + return logFriendlyBreaks; + } + + public boolean logHostileBreaks() { + return logHostileBreaks; + } + + public boolean logMessages() { + return logMessages; } private void parseAcidMaterials(ConfigurationSection config) { @@ -87,22 +107,30 @@ private void parseAcidMaterials(ConfigurationSection config) { } } - private void parseReinforcementTypes(ConfigurationSection config) { - reinforcementTypes = new LinkedList<>(); - if (config == null) { - logger.info("No reinforcement types found in config"); - return; - } - for (String key : config.getKeys(false)) { - if (!config.isConfigurationSection(key)) { - logger.warning("Ignoring invalid entry " + key + " at " + config.getCurrentPath()); - continue; - } - ReinforcementType type = parseReinforcementType(config.getConfigurationSection(key)); - if (type != null) { - reinforcementTypes.add(type); + @Override + protected boolean parseInternal(ConfigurationSection config) { + database = (ManagedDatasource) config.get("database"); + parseReinforcementTypes(config.getConfigurationSection("reinforcements")); + parseAcidMaterials(config); + logHostileBreaks = config.getBoolean("logHostileBreaks", true); + logFriendlyBreaks = config.getBoolean("logFriendlyBreaks", true); + logDamage = config.getBoolean("logDamage", false); + logCreation = config.getBoolean("logCreation", true); + logMessages = config.getBoolean("logMessages", true); + redstoneRange = config.getDouble("redstoneDistance", 3); + globalBlackList = parseMaterialList(config, "non_reinforceables"); + return true; + } + + private List parseMaterialList(ConfigurationSection config, String key) { + return parseList(config, key, s -> { + try { + return Material.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + logger.warning("Failed to parse " + s + " as material at " + config.getCurrentPath()); + return null; } - } + }); } private ReinforcementType parseReinforcementType(ConfigurationSection config) { @@ -137,46 +165,25 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { return null; } return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, - effect, reinforceables, nonReinforceables, id, name); - } - - private List parseMaterialList(ConfigurationSection config, String key) { - return parseList(config, key, s -> { - try { - return Material.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - logger.warning("Failed to parse " + s + " as material at " + config.getCurrentPath()); - return null; - } - }); + effect, reinforceables, nonReinforceables, id, name, globalBlackList); } - private ReinforcementEffect getReinforcementEffect(ConfigurationSection config) { + private void parseReinforcementTypes(ConfigurationSection config) { + reinforcementTypes = new LinkedList<>(); if (config == null) { - return null; + logger.info("No reinforcement types found in config"); + return; } - Particle effect; - try { - String effectName = config.getString("type"); - effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE : Particle.valueOf(effectName); - } catch (IllegalArgumentException e) { - logger.warning("Invalid effect at: " + config.getCurrentPath()); - return null; + for (String key : config.getKeys(false)) { + if (!config.isConfigurationSection(key)) { + logger.warning("Ignoring invalid entry " + key + " at " + config.getCurrentPath()); + continue; + } + ReinforcementType type = parseReinforcementType(config.getConfigurationSection(key)); + if (type != null) { + reinforcementTypes.add(type); + } } - float offsetX = (float) config.getDouble("offsetX", 0); - float offsetY = (float) config.getDouble("offsetY", 0); - float offsetZ = (float) config.getDouble("offsetZ", 0); - float speed = (float) config.getDouble("speed", 1); - int amount = config.getInt("particleCount", 1); - return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); - } - - public ManagedDatasource getDatabase() { - return database; - } - - public List getReinforcementTypes() { - return reinforcementTypes; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index b51031bf..c56e9ab8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -15,6 +15,16 @@ public class ReinforcementLogic { + public static void createReinforcement(Block block, ReinforcementType type, Group group) { + GlobalReinforcementManager worldManager = Citadel.getInstance().getReinforcementManager(); + worldManager.insertReinforcement(new Reinforcement(block.getLocation(), type, group)); + } + + public static void damageReinforcement(Reinforcement rein, double damage) { + rein.setHealth(rein.getHealth() - damage); + rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + } + public static double getDamageApplied(Player player, Reinforcement reinforcement) { double damageAmount = 1.0; if (!reinforcement.isMature()) { @@ -25,17 +35,8 @@ public static double getDamageApplied(Player player, Reinforcement reinforcement } return damageAmount; } - - public static void createReinforcement(Block block, ReinforcementType type, Group group) { - GlobalReinforcementManager worldManager = Citadel.getInstance().getReinforcementManager(); - } - - public static void damageReinforcement(Reinforcement rein, double damage) { - rein.setHealth(rein.getHealth() - damage); - rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); - } - - public static Reinforcement getReinforcementProtecting(Block b) { + + public static Reinforcement getReinforcementProtecting(Block b) { Reinforcement directReinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(b); if (directReinforcement != null) { return directReinforcement; @@ -85,38 +86,17 @@ public static Block getResponsibleBlock(Block block) { case WOODEN_DOOR: case WOOD_DOOR: if (block.getRelative(BlockFace.UP).getType() != block.getType()) { - //block is upper half of a door + // block is upper half of a door return block.getRelative(BlockFace.DOWN); } case BED_BLOCK: if (((Bed) block.getState().getData()).isHeadOfBed()) { - return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); - } - } - return block; - } - - public static Reinforcement resolveDoubleChestReinforcement(Block b) { - Material mat = b.getType(); - GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); - Reinforcement rein = reinMan.getReinforcement(b); - if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { - return rein; - } - for(BlockFace face : BlockListener.planar_sides) { - Block rel = b.getRelative(face); - if (rel.getType() != mat) { - continue; - } - rein = reinMan.getReinforcement(rel); - if (rein != null) { - return rein; + return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); } } - return null; + return block; } - - + /** * Checks if at the given block is a container, which is not insecure and which * the player can not access due to missing perms @@ -141,4 +121,24 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { } return false; } + + public static Reinforcement resolveDoubleChestReinforcement(Block b) { + Material mat = b.getType(); + GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); + Reinforcement rein = reinMan.getReinforcement(b); + if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { + return rein; + } + for (BlockFace face : BlockListener.planar_sides) { + Block rel = b.getRelative(face); + if (rel.getType() != mat) { + continue; + } + rein = reinMan.getReinforcement(rel); + if (rein != null) { + return rein; + } + } + return null; + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/Utility.java b/src/main/java/vg/civcraft/mc/citadel/Utility.java index caa0b39a..1fee71f3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Utility.java +++ b/src/main/java/vg/civcraft/mc/citadel/Utility.java @@ -10,74 +10,40 @@ import org.bukkit.command.CommandSender; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; + /** - * Just a useful class with general and misplaced methods that can be - * called from anywhere. + * Just a useful class with general and misplaced methods that can be called + * from anywhere. * */ public class Utility { - public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { - receiver.sendMessage(color + message); - if (Citadel.getInstance().getConfigManager().logMessages()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", new Object[]{receiver.getName(), message}); - } - } - - private static boolean isSoilPlant(Material mat) { - return Material.WHEAT.equals(mat) - || Material.MELON_STEM.equals(mat) - || Material.PUMPKIN_STEM.equals(mat) - || Material.CARROT.equals(mat) - || Material.POTATO.equals(mat) - || Material.CROPS.equals(mat) - || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat) - || Material.BEETROOT_BLOCK.equals(mat); - } - - private static boolean isDirtPlant(Material mat) { - return Material.SUGAR_CANE_BLOCK.equals(mat) - || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); - } - - private static boolean isGrassPlant(Material mat) { - return Material.SUGAR_CANE_BLOCK.equals(mat) - || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); - } - - private static boolean isSandPlant(Material mat) { - return Material.CACTUS.equals(mat) - || Material.SUGAR_CANE_BLOCK.equals(mat); - } - - private static boolean isSoulSandPlant(Material mat) { - return Material.NETHER_WARTS.equals(mat); - } - - public static boolean isPlant(Block plant) { - return isPlant(plant.getType()); - } - - public static boolean isPlant(Material mat) { - return isSoilPlant(mat) - || isDirtPlant(mat) - || isGrassPlant(mat) - || isSandPlant(mat) - || isSoulSandPlant(mat); - } - + /** + * Overload for dropItemAtLocation(Location l, ItemStack is) that accepts a + * block parameter. + * + * @param b The block to drop it at + * @param is The item to drop + * + * @author GordonFreemanQ + */ + public static void dropItemAtLocation(Block b, ItemStack is) { + if (b == null) { + Citadel.getInstance().getLogger().log(Level.WARNING, "Utility dropItemAtLocation block called with null"); + return; + } + dropItemAtLocation(b.getLocation(), is); + } /** * A better version of dropNaturally that mimics normal drop behavior. * - * The built-in version of Bukkit's dropItem() method places the item at the block - * vertex which can make the item jump around. - * This method places the item in the middle of the block location with a slight - * vertical velocity to mimic how normal broken blocks appear. - * @param l The location to drop the item + * The built-in version of Bukkit's dropItem() method places the item at the + * block vertex which can make the item jump around. This method places the item + * in the middle of the block location with a slight vertical velocity to mimic + * how normal broken blocks appear. + * + * @param l The location to drop the item * @param is The item to drop * * @author GordonFreemanQ @@ -91,26 +57,50 @@ public void run() { l.getWorld().dropItem(l.add(0.5, 0.5, 0.5), is).setVelocity(new Vector(0, 0.05, 0)); } catch (Exception e) { Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility dropItemAtLocation called but errored: ", e); + "Utility dropItemAtLocation called but errored: ", e); } } }, 1); } + private static boolean isDirtPlant(Material mat) { + return Material.SUGAR_CANE_BLOCK.equals(mat) || Material.MELON_BLOCK.equals(mat) + || Material.PUMPKIN.equals(mat); + } - /** - * Overload for dropItemAtLocation(Location l, ItemStack is) that accepts a block parameter. - * @param b The block to drop it at - * @param is The item to drop - * - * @author GordonFreemanQ - */ - public static void dropItemAtLocation(Block b, ItemStack is) { - if (b == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility dropItemAtLocation block called with null"); - return; + private static boolean isGrassPlant(Material mat) { + return Material.SUGAR_CANE_BLOCK.equals(mat) || Material.MELON_BLOCK.equals(mat) + || Material.PUMPKIN.equals(mat); + } + + public static boolean isPlant(Block plant) { + return isPlant(plant.getType()); + } + + public static boolean isPlant(Material mat) { + return isSoilPlant(mat) || isDirtPlant(mat) || isGrassPlant(mat) || isSandPlant(mat) || isSoulSandPlant(mat); + } + + private static boolean isSandPlant(Material mat) { + return Material.CACTUS.equals(mat) || Material.SUGAR_CANE_BLOCK.equals(mat); + } + + private static boolean isSoilPlant(Material mat) { + return Material.WHEAT.equals(mat) || Material.MELON_STEM.equals(mat) || Material.PUMPKIN_STEM.equals(mat) + || Material.CARROT.equals(mat) || Material.POTATO.equals(mat) || Material.CROPS.equals(mat) + || Material.MELON_BLOCK.equals(mat) || Material.PUMPKIN.equals(mat) + || Material.BEETROOT_BLOCK.equals(mat); + } + + private static boolean isSoulSandPlant(Material mat) { + return Material.NETHER_WARTS.equals(mat); + } + + public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { + receiver.sendMessage(color + message); + if (Citadel.getInstance().getConfigManager().logMessages()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", + new Object[] { receiver.getName(), message }); } - dropItemAtLocation(b.getLocation(), is); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 8ae05add..cf9d1f7c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -85,7 +85,7 @@ public boolean execute(CommandSender sender, String[] args) { new Object[] { block.getLocation(), topFace.getType(), topFace.getLocation(), p.getName() }); } reinforcement.setHealth(-1); - //play particles for top block + // play particles for top block ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1); block.breakNaturally(); topFace.breakNaturally(); diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java index b3da2e86..2d6e99b3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -9,7 +9,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; @@ -19,7 +19,7 @@ public class Bypass extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState.isBypassEnabled()) { Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); } else { diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index a3d80e01..5643a345 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -10,8 +10,8 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.FortificationState; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; @@ -61,7 +61,7 @@ public boolean execute(CommandSender sender, String[] args) { stateManager.setState(player, null); return true; } - IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof FortificationState) { FortificationState fortState = (FortificationState) currentState; if (fortState.getGroup() == group && fortState.getType() == type) { @@ -76,9 +76,11 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); + return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); + return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); else { return new ArrayList(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Information.java b/src/main/java/vg/civcraft/mc/citadel/command/Information.java index c81d2a9c..08b64e8a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Information.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Information.java @@ -7,7 +7,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.InformationState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.command.CivCommand; @@ -20,11 +20,10 @@ public class Information extends StandaloneCommand { public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); - IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof InformationState) { stateManager.setState(player, null); - } - else { + } else { stateManager.setState(player, new InformationState(player, currentState.isBypassEnabled())); } return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java index bc43015f..95a5288f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java @@ -7,7 +7,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.InsecureState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.command.CivCommand; @@ -20,11 +20,10 @@ public class Insecure extends StandaloneCommand { public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); - IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof InsecureState) { stateManager.setState(player, null); - } - else { + } else { stateManager.setState(player, new InsecureState(player, currentState.isBypassEnabled())); } return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java index 368bbf90..26cd0154 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -10,7 +10,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.playerstate.IPlayerState; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.ReinforcingState; import vg.civcraft.mc.civmodcore.command.CivCommand; @@ -53,7 +53,7 @@ public boolean execute(CommandSender sender, String[] args) { stateManager.setState(player, null); return true; } - IPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof ReinforcingState) { ReinforcingState reinState = (ReinforcingState) currentState; if (reinState.getGroup() == group) { @@ -71,9 +71,11 @@ public List tabComplete(CommandSender sender, String[] args) { return null; if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), (Player)sender); + return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player)sender); + return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); else { return new ArrayList(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index 84b53108..b620d735 100644 --- a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -40,9 +40,98 @@ public CitadelReinforcementData(ManagedDatasource db, Citadel plugin, Reinforcem this.logger = plugin.getLogger(); } - public boolean startUp() { - registerMigrations(); - return db.updateDatabase(); + private void deleteReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement deleteStatement) + throws SQLException { + deleteStatement.setInt(1, rein.getLocation().getBlockX()); + deleteStatement.setInt(2, rein.getLocation().getBlockY()); + deleteStatement.setInt(3, rein.getLocation().getBlockZ()); + deleteStatement.setInt(4, cache.getWorldID()); + deleteStatement.addBatch(); + } + + public int getOrCreateWorldID(World world) { + try (Connection insertConn = db.getConnection(); + PreparedStatement insertWorld = insertConn + .prepareStatement("select id from reinforcement_worlds where uuid = ?;")) { + insertWorld.setString(1, world.getUID().toString()); + try (ResultSet rs = insertWorld.executeQuery()) { + if (rs.next()) { + return rs.getInt(1); + } + } + } catch (SQLException e) { + logger.severe("Failed to check for existence of world in db: " + e.toString()); + return -1; + } + try (Connection insertConn = db.getConnection(); + PreparedStatement insertWorld = insertConn.prepareStatement( + "insert into reinforcement_worlds (uuid, name) values(?,?);", + Statement.RETURN_GENERATED_KEYS);) { + insertWorld.setString(1, world.getUID().toString()); + insertWorld.setString(2, world.getName()); + try (ResultSet rs = insertWorld.executeQuery()) { + if (!rs.next()) { + logger.info("Failed to insert world"); + return -1; + } + return rs.getInt(1); + } + } catch (SQLException e) { + logger.severe("Failed to insert world into db: " + e.toString()); + return -1; + } + } + + private void insertNewReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement insertStatement) + throws SQLException { + insertStatement.setInt(1, rein.getLocation().getBlockX()); + insertStatement.setInt(2, rein.getLocation().getBlockY()); + insertStatement.setInt(3, rein.getLocation().getBlockZ()); + insertStatement.setInt(4, cache.getChunkPair().getX()); + insertStatement.setInt(5, cache.getChunkPair().getZ()); + insertStatement.setInt(6, cache.getWorldID()); + insertStatement.setInt(7, rein.getType().getID()); + insertStatement.setDouble(8, rein.getHealth()); + insertStatement.setInt(9, rein.getGroupId()); + insertStatement.setBoolean(10, rein.isInsecure()); + insertStatement.addBatch(); + } + + public ChunkCache loadReinforcements(ChunkCoord coords, int worldID) { + List reinforcements = new ArrayList<>(); + World world = null; + try (Connection loadConn = db.getConnection(); + PreparedStatement loadRein = loadConn.prepareStatement( + "select x, y, z, type_id, creation_time, health, group_id, insecure from reinforcements " + + "where chunk_x = ? and chunk_z = ? and world_id = ?;")) { + loadRein.setInt(1, coords.getX()); + loadRein.setInt(2, coords.getZ()); + loadRein.setInt(3, worldID); + try (ResultSet rs = loadRein.executeQuery()) { + while (rs.next()) { + int x = rs.getInt(1); + int y = rs.getInt(2); + int z = rs.getInt(3); + int typeId = rs.getInt(4); + long millisCreation = rs.getTimestamp(5).getTime(); + double health = rs.getDouble(6); + int groupId = rs.getInt(7); + boolean insecure = rs.getBoolean(8); + ReinforcementType type = typeMan.getById(typeId); + Location loc = new Location(world, x, y, z); + if (type == null) { + logger.warning("Ignoring reinforcement at " + loc.toString() + " because of invalid type id " + + typeId); + continue; + } + reinforcements + .add(new Reinforcement(loc, type, groupId, millisCreation, health, false, false, insecure)); + } + } + } catch (SQLException e) { + logger.severe("Failed to load reinforcements: " + e.toString()); + } + return new ChunkCache(coords, reinforcements, worldID); } private void registerMigrations() { @@ -141,9 +230,9 @@ public Boolean call() throws SQLException { String lore = rs.getString(12); int acidTime = rs.getInt(13); long msAcidTime = acidTime; - //old unit was minutes since unix epoch + // old unit was minutes since unix epoch msAcidTime *= 60000; - //some reins don't have a time stamp, gonna have to guess for those + // some reins don't have a time stamp, gonna have to guess for those if (msAcidTime == 0) { msAcidTime = System.currentTimeMillis(); } @@ -211,43 +300,6 @@ public Boolean call() throws SQLException { + "constraint reinforcementUniqueLocation unique (x,y,z,world_id));"); } - public ChunkCache loadReinforcements(ChunkCoord coords, int worldID) { - List reinforcements = new ArrayList<>(); - World world = null; - try (Connection loadConn = db.getConnection(); - PreparedStatement loadRein = loadConn.prepareStatement( - "select x, y, z, type_id, creation_time, health, group_id, insecure from reinforcements " - + "where chunk_x = ? and chunk_z = ? and world_id = ?;")) { - loadRein.setInt(1, coords.getX()); - loadRein.setInt(2, coords.getZ()); - loadRein.setInt(3, worldID); - try (ResultSet rs = loadRein.executeQuery()) { - while (rs.next()) { - int x = rs.getInt(1); - int y = rs.getInt(2); - int z = rs.getInt(3); - int typeId = rs.getInt(4); - long millisCreation = rs.getTimestamp(5).getTime(); - double health = rs.getDouble(6); - int groupId = rs.getInt(7); - boolean insecure = rs.getBoolean(8); - ReinforcementType type = typeMan.getById(typeId); - Location loc = new Location(world, x, y, z); - if (type == null) { - logger.warning("Ignoring reinforcement at " + loc.toString() + " because of invalid type id " - + typeId); - continue; - } - reinforcements - .add(new Reinforcement(loc, type, groupId, millisCreation, health, false, false, insecure)); - } - } - } catch (SQLException e) { - logger.severe("Failed to load reinforcements: " + e.toString()); - } - return new ChunkCache(coords, reinforcements, worldID); - } - public void saveReinforcements(ChunkCache cache) { if (!cache.isDirty()) { return; @@ -277,7 +329,8 @@ public void saveReinforcements(ChunkCache cache) { } rein.setDirty(false); } - //deletes before inserts in case a reinforcement was destroyed and then recreated + // deletes before inserts in case a reinforcement was destroyed and then + // recreated deleteStatement.executeBatch(); insertStatement.executeBatch(); updateStatement.executeBatch(); @@ -287,19 +340,9 @@ public void saveReinforcements(ChunkCache cache) { } } - private void insertNewReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement insertStatement) - throws SQLException { - insertStatement.setInt(1, rein.getLocation().getBlockX()); - insertStatement.setInt(2, rein.getLocation().getBlockY()); - insertStatement.setInt(3, rein.getLocation().getBlockZ()); - insertStatement.setInt(4, cache.getChunkPair().getX()); - insertStatement.setInt(5, cache.getChunkPair().getZ()); - insertStatement.setInt(6, cache.getWorldID()); - insertStatement.setInt(7, rein.getType().getID()); - insertStatement.setDouble(8, rein.getHealth()); - insertStatement.setInt(9, rein.getGroupId()); - insertStatement.setBoolean(10, rein.isInsecure()); - insertStatement.addBatch(); + public boolean startUp() { + registerMigrations(); + return db.updateDatabase(); } private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement updateStatement) @@ -315,46 +358,4 @@ private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedS updateStatement.addBatch(); } - private void deleteReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement deleteStatement) - throws SQLException { - deleteStatement.setInt(1, rein.getLocation().getBlockX()); - deleteStatement.setInt(2, rein.getLocation().getBlockY()); - deleteStatement.setInt(3, rein.getLocation().getBlockZ()); - deleteStatement.setInt(4, cache.getWorldID()); - deleteStatement.addBatch(); - } - - public int getOrCreateWorldID(World world) { - try (Connection insertConn = db.getConnection(); - PreparedStatement insertWorld = insertConn - .prepareStatement("select id from reinforcement_worlds where uuid = ?;")) { - insertWorld.setString(1, world.getUID().toString()); - try (ResultSet rs = insertWorld.executeQuery()) { - if (rs.next()) { - return rs.getInt(1); - } - } - } catch (SQLException e) { - logger.severe("Failed to check for existence of world in db: " + e.toString()); - return -1; - } - try (Connection insertConn = db.getConnection(); - PreparedStatement insertWorld = insertConn.prepareStatement( - "insert into reinforcement_worlds (uuid, name) values(?,?);", - Statement.RETURN_GENERATED_KEYS);) { - insertWorld.setString(1, world.getUID().toString()); - insertWorld.setString(2, world.getName()); - try (ResultSet rs = insertWorld.executeQuery()) { - if (!rs.next()) { - logger.info("Failed to insert world"); - return -1; - } - return rs.getInt(1); - } - } catch (SQLException e) { - logger.severe("Failed to insert world into db: " + e.toString()); - return -1; - } - } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java index 42707605..dae2711d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementAcidBlockedEvent.java @@ -12,15 +12,20 @@ public class ReinforcementAcidBlockedEvent extends ReinforcementEvent { private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { + return handlers; + } + private Reinforcement acidBlock; - public ReinforcementAcidBlockedEvent(Player player, Reinforcement acidBlock,Reinforcement destroyedBlock) { + public ReinforcementAcidBlockedEvent(Player player, Reinforcement acidBlock, Reinforcement destroyedBlock) { super(player, destroyedBlock); this.acidBlock = acidBlock; } /** * Gets the reinforcement of the acid block. + * * @return Acid block reinforcement */ public Reinforcement getAcidBlockReinforcement() { @@ -31,8 +36,4 @@ public Reinforcement getAcidBlockReinforcement() { public HandlerList getHandlers() { return handlers; } - - public static HandlerList getHandlerList() { - return handlers; - } } \ No newline at end of file diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java index 898186e0..d8deda15 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementBypassEvent.java @@ -13,6 +13,10 @@ public class ReinforcementBypassEvent extends ReinforcementEvent { private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { + return handlers; + } + public ReinforcementBypassEvent(Player who, Reinforcement reinforcement) { super(who, reinforcement); } @@ -22,8 +26,4 @@ public HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { - return handlers; - } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java index 58aa3ca5..cf886970 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementChangeTypeEvent.java @@ -14,6 +14,10 @@ public class ReinforcementChangeTypeEvent extends ReinforcementEvent { private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { + return handlers; + } + private ReinforcementType newType; public ReinforcementChangeTypeEvent(Player p, Reinforcement rein, ReinforcementType newType) { @@ -21,6 +25,11 @@ public ReinforcementChangeTypeEvent(Player p, Reinforcement rein, ReinforcementT this.newType = newType; } + @Override + public HandlerList getHandlers() { + return handlers; + } + /** * * @return Future reinforcement type @@ -28,13 +37,4 @@ public ReinforcementChangeTypeEvent(Player p, Reinforcement rein, ReinforcementT public ReinforcementType getNewType() { return newType; } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java index 6ac61c52..41b9ec6f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementCreationEvent.java @@ -13,6 +13,10 @@ public class ReinforcementCreationEvent extends ReinforcementEvent { private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { + return handlers; + } + public ReinforcementCreationEvent(Player p, Reinforcement rein) { super(p, rein); } @@ -21,8 +25,4 @@ public ReinforcementCreationEvent(Player p, Reinforcement rein) { public HandlerList getHandlers() { return handlers; } - - public static HandlerList getHandlerList() { - return handlers; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java index 66fba183..3d534313 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java @@ -13,6 +13,10 @@ public class ReinforcementDamageEvent extends ReinforcementEvent { private static final HandlerList handlers = new HandlerList(); + public static HandlerList getHandlerList() { + return handlers; + } + private double damageDone; public ReinforcementDamageEvent(Player player, Reinforcement rein, double damageDone) { @@ -29,6 +33,11 @@ public double getDamageDone() { return damageDone; } + @Override + public HandlerList getHandlers() { + return handlers; + } + /** * Sets the total damage done * @@ -37,13 +46,4 @@ public double getDamageDone() { public void setDamageDone(double damageDone) { this.damageDone = damageDone; } - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java index 0f108baf..ab67c062 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementEvent.java @@ -10,20 +10,20 @@ public abstract class ReinforcementEvent extends PlayerEvent implements Cancella protected Reinforcement reinforcement; protected boolean isCancelled; - + public ReinforcementEvent(Player who, Reinforcement reinforcement) { super(who); this.reinforcement = reinforcement; isCancelled = false; } - + /** * @return Reinforcement involved in this event */ public Reinforcement getReinforcement() { return reinforcement; } - + @Override public boolean isCancelled() { return isCancelled; diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java index 6ba64e87..fb35ac9a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java @@ -11,9 +11,13 @@ * */ public class ReinforcementGroupChangeEvent extends ReinforcementEvent { - + private static final HandlerList handlers = new HandlerList(); - + + public static HandlerList getHandlerList() { + return handlers; + } + private Group newGroup; public ReinforcementGroupChangeEvent(Player who, Reinforcement reinforcement, Group newGroup) { @@ -21,18 +25,13 @@ public ReinforcementGroupChangeEvent(Player who, Reinforcement reinforcement, Gr this.newGroup = newGroup; } - public Group getNewGroup() { - return newGroup; - } - - @Override public HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { - return handlers; + public Group getNewGroup() { + return newGroup; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 0445ffaf..aae97ae6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -36,72 +36,13 @@ public class BlockListener implements Listener { public static final List planar_sides = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - // Stop comparators from being placed unless the reinforcement is insecure - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void comparatorPlaceCheck(BlockPlaceEvent event) { - // We only care if they are placing a comparator - if (event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) { - return; - } - Comparator comparator = (Comparator) event.getBlockPlaced().getState().getData(); - Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); - // Check if the comparator is placed against something with an inventory - if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), block)) { - event.setCancelled(true); - Utility.sendAndLog(event.getPlayer(), ChatColor.RED, - "You can not place this because it'd allow bypassing a nearby reinforcement"); - return; - } - // Comparators can also read through a single opaque block - if (block.getType().isOccluding()) { - if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), - block.getRelative(comparator.getFacing().getOppositeFace()))) { - event.setCancelled(true); - Utility.sendAndLog(event.getPlayer(), ChatColor.RED, - "You can not place this because it'd allow bypassing a nearby reinforcement"); - return; - } - } - } - - // remove reinforced air - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) - public void removeReinforcedAir(BlockPlaceEvent e) { - if (e.getBlockReplacedState().getType() != Material.AIR) { - return; - } - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); - rein.setHealth(-1); - } - - // prevent players from upgrading a chest into a double chest to bypass the - // single chests reinforcement - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void preventBypassChestAccess(BlockPlaceEvent e) { - Material mat = e.getBlock().getType(); - if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { - return; - } - for (BlockFace face : planar_sides) { - Block rel = e.getBlock().getRelative(face); - if (rel != null && rel.getType() == mat) { - if (ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { - e.setCancelled(true); - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, - "You can not place this because it'd allow bypassing a nearby reinforcement"); - break; - } - } - } - } + private static final Material matfire = Material.FIRE; @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void blockBreakEvent(BlockBreakEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } - private static final Material matfire = Material.FIRE; - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void blockBurn(BlockBurnEvent bbe) { Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(bbe.getBlock()); @@ -132,12 +73,43 @@ public void blockBurn(BlockBurnEvent bbe) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) - public void onBlockFromToEvent(BlockFromToEvent event) { - // prevent water/lava from spilling reinforced blocks away - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getToBlock()); - if (rein != null) { + @EventHandler(priority = EventPriority.HIGHEST) + public void blockPhysEvent(BlockPhysicsEvent event) { + Block block = event.getBlock(); + if (block.getType().hasGravity()) { + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein != null) { + event.setCancelled(true); + } + } + + } + + // Stop comparators from being placed unless the reinforcement is insecure + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void comparatorPlaceCheck(BlockPlaceEvent event) { + // We only care if they are placing a comparator + if (event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) { + return; + } + Comparator comparator = (Comparator) event.getBlockPlaced().getState().getData(); + Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); + // Check if the comparator is placed against something with an inventory + if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), block)) { event.setCancelled(true); + Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + return; + } + // Comparators can also read through a single opaque block + if (block.getType().isOccluding()) { + if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), + block.getRelative(comparator.getFacing().getOppositeFace()))) { + event.setCancelled(true); + Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + return; + } } } @@ -152,6 +124,39 @@ public void interact(PlayerInteractEvent pie) { } } + // prevent placing water inside of reinforced blocks + @EventHandler(priority = EventPriority.HIGHEST) + public void liquidDumpEvent(PlayerBucketEmptyEvent event) { + Block block = event.getBlockClicked().getRelative(event.getBlockFace()); + if (block.getType().equals(Material.AIR) || block.getType().isSolid()) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein != null) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onBlockFromToEvent(BlockFromToEvent event) { + // prevent water/lava from spilling reinforced blocks away + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getToBlock()); + if (rein != null) { + event.setCancelled(true); + } + } + + // prevent breaking reinforced blocks through plant growth + @EventHandler(ignoreCancelled = true) + public void onStructureGrow(StructureGrowEvent event) { + for (BlockState block_state : event.getBlocks()) { + if (ReinforcementLogic.getReinforcementProtecting(block_state.getBlock()) != null) { + event.setCancelled(true); + return; + } + } + } + // prevent opening reinforced things @EventHandler(priority = EventPriority.LOWEST) public void openContainer(PlayerInteractEvent e) { @@ -179,39 +184,34 @@ public void openContainer(PlayerInteractEvent e) { } } - @EventHandler(priority = EventPriority.HIGHEST) - public void blockPhysEvent(BlockPhysicsEvent event) { - Block block = event.getBlock(); - if (block.getType().hasGravity()) { - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); - if (rein != null) { - event.setCancelled(true); - } - } - - } - - // prevent placing water inside of reinforced blocks - @EventHandler(priority = EventPriority.HIGHEST) - public void liquidDumpEvent(PlayerBucketEmptyEvent event) { - Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().equals(Material.AIR) || block.getType().isSolid()) { + // prevent players from upgrading a chest into a double chest to bypass the + // single chests reinforcement + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void preventBypassChestAccess(BlockPlaceEvent e) { + Material mat = e.getBlock().getType(); + if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { return; } - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); - if (rein != null) { - event.setCancelled(true); + for (BlockFace face : planar_sides) { + Block rel = e.getBlock().getRelative(face); + if (rel != null && rel.getType() == mat) { + if (ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { + e.setCancelled(true); + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + break; + } + } } } - //prevent breaking reinforced blocks through plant growth - @EventHandler(ignoreCancelled = true) - public void onStructureGrow(StructureGrowEvent event) { - for (BlockState block_state : event.getBlocks()) { - if (ReinforcementLogic.getReinforcementProtecting(block_state.getBlock()) != null) { - event.setCancelled(true); - return; - } + // remove reinforced air + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void removeReinforcedAir(BlockPlaceEvent e) { + if (e.getBlockReplacedState().getType() != Material.AIR) { + return; } + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); + rein.setHealth(-1); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 4924a92b..230f3a93 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -33,22 +33,7 @@ public class EntityListener implements Listener { protected GroupManager gm = NameAPI.getGroupManager(); - //apply explosion damage to reinforcements - @EventHandler(ignoreCancelled = true) - public void explode(EntityExplodeEvent eee) { - Iterator iterator = eee.blockList().iterator(); - //we can edit the result by removing blocks from the list - while (iterator.hasNext()) { - Block block = iterator.next(); - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); - if (rein != null) { - rein.setHealth(rein.getHealth() - 1); - iterator.remove(); - } - } - } - - //prevent zombies from breaking reinforced doors + // prevent zombies from breaking reinforced doors @EventHandler(ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ebde.getBlock()); @@ -67,19 +52,17 @@ public void changeBlock(EntityChangeBlockEvent ecbe) { } } - // prevent creating golems from reinforced blocks - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) - public void spawn(CreatureSpawnEvent cse) { - GlobalReinforcementManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); - EntityType type = cse.getEntityType(); - if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER - && type != EntityType.SILVERFISH) { - return; - } - for (Block block : getGolemBlocks(type, cse.getLocation().getBlock())) { - Reinforcement reinforcement = reinforcementManager.getReinforcement(block); - if (reinforcement != null) { - cse.setCancelled(true); + // apply explosion damage to reinforcements + @EventHandler(ignoreCancelled = true) + public void explode(EntityExplodeEvent eee) { + Iterator iterator = eee.blockList().iterator(); + // we can edit the result by removing blocks from the list + while (iterator.hasNext()) { + Block block = iterator.next(); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein != null) { + rein.setHealth(rein.getHealth() - 1); + iterator.remove(); } } } @@ -121,4 +104,21 @@ public void run() { } }.runTaskAsynchronously(Citadel.getInstance()); } + + // prevent creating golems from reinforced blocks + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void spawn(CreatureSpawnEvent cse) { + GlobalReinforcementManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); + EntityType type = cse.getEntityType(); + if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER + && type != EntityType.SILVERFISH) { + return; + } + for (Block block : getGolemBlocks(type, cse.getLocation().getBlock())) { + Reinforcement reinforcement = reinforcementManager.getReinforcement(block); + if (reinforcement != null) { + cse.setCancelled(true); + } + } + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 95c650b8..0029b8cf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -11,7 +11,8 @@ public class InventoryListener implements Listener { - //prevent sucking reinforcements out of reinforced containers with hoppers on different groups or filling into them + // prevent sucking reinforcements out of reinforced containers with hoppers on + // different groups or filling into them @EventHandler(ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Inventory SourceInv = event.getSource(); @@ -39,7 +40,7 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { } return; } - //both reinforced at this point + // both reinforced at this point if (sourceRein.getGroup().getGroupId() != destRein.getGroup().getGroupId()) { event.setCancelled(true); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index ca6d5a4a..d8e0b640 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -31,6 +31,37 @@ public class RedstoneListener implements Listener { + private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { + Location reinLocation = reinforcement.getLocation(); + double min_x = reinLocation.getX() - distance; + double min_z = reinLocation.getZ() - distance; + double max_x = reinLocation.getX() + distance; + double max_z = reinLocation.getZ() + distance; + boolean result = false; + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.isDead()) { + continue; + } + Location playerLocation = player.getLocation(); + double player_x = playerLocation.getX(); + double player_z = playerLocation.getZ(); + // Simple bounding box check to quickly rule out Players + // before doing the more expensive playerLocation.distance + if (player_x < min_x || player_x > max_x || player_z < min_z || player_z > max_z) { + continue; + } + if (!reinforcement.hasPermission(player, Citadel.doorPerm)) { + continue; + } + double distanceSquared = playerLocation.distance(reinLocation); + if (distanceSquared <= distance) { + result = true; + break; + } + } + return result; + } + private double maxRedstoneDistance; private Map> authorizations; @@ -42,6 +73,28 @@ public RedstoneListener(double maxRedstoneDistance) { }, 1L, 1L); } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void pistonExtend(BlockPistonExtendEvent bpee) { + for (Block block : bpee.getBlocks()) { + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); + if (reinforcement != null) { + bpee.setCancelled(true); + break; + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void pistonRetract(BlockPistonRetractEvent bpre) { + for (Block block : bpre.getBlocks()) { + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); + if (reinforcement != null) { + bpre.setCancelled(true); + break; + } + } + } + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void pressButton(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { @@ -60,48 +113,6 @@ public void pressButton(PlayerInteractEvent e) { setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getAttachedFace().getOppositeFace()); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) - public void stepPressurePlate(PlayerInteractEvent e) { - if (e.getAction() != Action.PHYSICAL) { - return; - } - if (!(e.getClickedBlock().getState().getData() instanceof PressurePlate)) { - return; - } - setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); - } - - private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { - for (BlockFace face : BlockListener.all_sides) { - if (face == skip) { - continue; - } - Block rel = block.getRelative(face); - MaterialData blockData = rel.getState().getData(); - if (!(blockData instanceof Openable)) { - continue; - } - Location locationToSave; - if (blockData instanceof Door) { - if (block.getRelative(BlockFace.UP).getType() != block.getType()) { - // block is upper half of a door - locationToSave = rel.getRelative(BlockFace.DOWN).getLocation(); - } else { - // already the lower half of the door - locationToSave = rel.getLocation(); - } - } else { - locationToSave = rel.getLocation(); - } - List existingAuths = authorizations.get(locationToSave); - if (existingAuths == null) { - existingAuths = new LinkedList(); - authorizations.put(locationToSave, existingAuths); - } - existingAuths.add(player.getUniqueId()); - } - } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void redstonePower(BlockRedstoneEvent bre) { // prevent doors from being opened by redstone @@ -143,57 +154,46 @@ public void redstonePower(BlockRedstoneEvent bre) { bre.setNewCurrent(bre.getOldCurrent()); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonExtend(BlockPistonExtendEvent bpee) { - for (Block block : bpee.getBlocks()) { - Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); - if (reinforcement != null) { - bpee.setCancelled(true); - break; - } - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) - public void pistonRetract(BlockPistonRetractEvent bpre) { - for (Block block : bpre.getBlocks()) { - Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); - if (reinforcement != null) { - bpre.setCancelled(true); - break; - } - } - } - - private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { - Location reinLocation = reinforcement.getLocation(); - double min_x = reinLocation.getX() - distance; - double min_z = reinLocation.getZ() - distance; - double max_x = reinLocation.getX() + distance; - double max_z = reinLocation.getZ() + distance; - boolean result = false; - for (Player player : Bukkit.getOnlinePlayers()) { - if (player.isDead()) { + private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { + for (BlockFace face : BlockListener.all_sides) { + if (face == skip) { continue; } - Location playerLocation = player.getLocation(); - double player_x = playerLocation.getX(); - double player_z = playerLocation.getZ(); - // Simple bounding box check to quickly rule out Players - // before doing the more expensive playerLocation.distance - if (player_x < min_x || player_x > max_x || player_z < min_z || player_z > max_z) { + Block rel = block.getRelative(face); + MaterialData blockData = rel.getState().getData(); + if (!(blockData instanceof Openable)) { continue; } - if (!reinforcement.hasPermission(player, Citadel.doorPerm)) { - continue; + Location locationToSave; + if (blockData instanceof Door) { + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + // block is upper half of a door + locationToSave = rel.getRelative(BlockFace.DOWN).getLocation(); + } else { + // already the lower half of the door + locationToSave = rel.getLocation(); + } + } else { + locationToSave = rel.getLocation(); } - double distanceSquared = playerLocation.distance(reinLocation); - if (distanceSquared <= distance) { - result = true; - break; + List existingAuths = authorizations.get(locationToSave); + if (existingAuths == null) { + existingAuths = new LinkedList(); + authorizations.put(locationToSave, existingAuths); } + existingAuths.add(player.getUniqueId()); } - return result; + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void stepPressurePlate(PlayerInteractEvent e) { + if (e.getAction() != Action.PHYSICAL) { + return; + } + if (!(e.getClickedBlock().getState().getData() instanceof PressurePlate)) { + return; + } + setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java index 46f47001..b02e0ab6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java @@ -17,33 +17,16 @@ public AcidManager(Collection acidMats) { this.material = new TreeSet<>(acidMats); } - /** - * Checks if the given valid is of a material registered as valid acid material - * - * @param b Block to check for - * @return True if the block material is suited for being an acid block - */ - public boolean isPossibleAcidBlock(Block b) { - if (b == null) { - return false; - } - Material mat = b.getType(); - if (mat == null) { - return false; - } - return material.contains(mat); - } - /** * Checks if acid blocking is enabled for this reinforcement type * * @param rein Reinforcement type to check for - * @return True if the reinforcement type can acid block other reinforcements and has - * an acid timer configured + * @return True if the reinforcement type can acid block other reinforcements + * and has an acid timer configured */ public boolean canAcidBlock(ReinforcementType acidBlock, ReinforcementType victim) { - //TODO - + // TODO + return true; } @@ -58,4 +41,21 @@ public long getRemainingAcidMaturationTime(Reinforcement rein) { long totalTime = rein.getType().getAcidTime(); return Math.max(0, totalTime - rein.getAge()); } + + /** + * Checks if the given valid is of a material registered as valid acid material + * + * @param b Block to check for + * @return True if the block material is suited for being an acid block + */ + public boolean isPossibleAcidBlock(Block b) { + if (b == null) { + return false; + } + Material mat = b.getType(); + if (mat == null) { + return false; + } + return material.contains(mat); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java index 9f3e838a..01ba3b5e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java @@ -11,10 +11,48 @@ public class ChunkCache { + private class Coords implements Comparable { + + private int x; + private int y; + private int z; + + Coords(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + Coords(Location loc) { + this.x = loc.getBlockX(); + this.y = loc.getBlockY(); + this.z = loc.getBlockZ(); + } + + public int compareTo(Coords coords) { + // y first because we have the most variety here + if (coords.y != y) { + return Integer.compare(y, coords.y); + } + if (coords.x != x) { + return Integer.compare(x, coords.x); + } + if (coords.z != z) { + return Integer.compare(z, coords.z); + } + return 0; + } + + public boolean equals(Object o) { + Coords coords = (Coords) o; + return coords.y == y && coords.x == x && coords.z == z; + } + } private final ChunkCoord chunkPair; private Map reinforcements; private List deletedReinforcements; private boolean isDirty; + private final int worldID; public ChunkCache(ChunkCoord chunkPair, Collection reins, int worldID) { @@ -28,38 +66,15 @@ public ChunkCache(ChunkCoord chunkPair, Collection reins, int wor this.isDirty = false; } - public int getWorldID() { - return worldID; - } - - public void insertReinforcement(Reinforcement rein) { - Coords key = new Coords(rein.getLocation()); - if (reinforcements.containsKey(key)) { - throw new IllegalStateException( - "Trying to insert reinforcement at " + rein.getLocation().toString() + ", but one already existed"); - } - rein.setOwningCache(this); - reinforcements.put(key, rein); - } - - public void removeReinforcement(Reinforcement rein) { - Coords key = new Coords(rein.getLocation()); - Reinforcement removed = reinforcements.remove(key); - if (removed != rein) { - throw new IllegalStateException("Removed wrong reinforcement at " + rein.getLocation().toString()); - } - if (deletedReinforcements == null) { - deletedReinforcements = new LinkedList<>(); - } - deletedReinforcements.add(rein); - } - - public ChunkCoord getChunkPair() { - return chunkPair; - } - - public Reinforcement getReinforcement(int x, int y, int z) { - return reinforcements.get(new Coords(x, y, z)); + /** + * Gets all existing reinforcements within this chunk + * + * @return All reinforcements + */ + public Collection getAll() { + List reins = new ArrayList<>(); + reins.addAll(reinforcements.values()); + return reins; } /** @@ -77,60 +92,45 @@ public Collection getAllAndCleanUp() { return reins; } - /** - * Gets all existing reinforcements within this chunk - * - * @return All reinforcements - */ - public Collection getAll() { - List reins = new ArrayList<>(); - reins.addAll(reinforcements.values()); - return reins; + public ChunkCoord getChunkPair() { + return chunkPair; } - public boolean isDirty() { - return isDirty; + public Reinforcement getReinforcement(int x, int y, int z) { + return reinforcements.get(new Coords(x, y, z)); } - public void setDirty(boolean dirty) { - this.isDirty = dirty; + public int getWorldID() { + return worldID; } - private class Coords implements Comparable { - - private int x; - private int y; - private int z; - - Coords(Location loc) { - this.x = loc.getBlockX(); - this.y = loc.getBlockY(); - this.z = loc.getBlockZ(); + public void insertReinforcement(Reinforcement rein) { + Coords key = new Coords(rein.getLocation()); + if (reinforcements.containsKey(key)) { + throw new IllegalStateException( + "Trying to insert reinforcement at " + rein.getLocation().toString() + ", but one already existed"); } + rein.setOwningCache(this); + reinforcements.put(key, rein); + } - Coords(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } + public boolean isDirty() { + return isDirty; + } - public int compareTo(Coords coords) { - // y first because we have the most variety here - if (coords.y != y) { - return Integer.compare(y, coords.y); - } - if (coords.x != x) { - return Integer.compare(x, coords.x); - } - if (coords.z != z) { - return Integer.compare(z, coords.z); - } - return 0; + public void removeReinforcement(Reinforcement rein) { + Coords key = new Coords(rein.getLocation()); + Reinforcement removed = reinforcements.remove(key); + if (removed != rein) { + throw new IllegalStateException("Removed wrong reinforcement at " + rein.getLocation().toString()); } - - public boolean equals(Object o) { - Coords coords = (Coords) o; - return coords.y == y && coords.x == x && coords.z == z; + if (deletedReinforcements == null) { + deletedReinforcements = new LinkedList<>(); } + deletedReinforcements.add(rein); + } + + public void setDirty(boolean dirty) { + this.isDirty = dirty; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java index cfb37d20..9ef06c9f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java @@ -5,7 +5,21 @@ public class ChunkCoord { + public static ChunkCoord forChunk(Chunk chunk) { + return new ChunkCoord(chunk.getX(), chunk.getZ()); + } + public static ChunkCoord forLocation(Location loc) { + return new ChunkCoord(loc.getChunk().getX(), loc.getChunk().getZ()); + } + + public static ChunkCoord fromKey(long key) { + int x = (int) key; + int z = (int) ((key >> 32) & 0x00000000); + return new ChunkCoord(x, z); + } + private int x; + private int z; public ChunkCoord(int x, int z) { @@ -13,12 +27,12 @@ public ChunkCoord(int x, int z) { this.z = z; } - public int getX() { - return x; - } - - public int getZ() { - return z; + public boolean equals(Object o) { + if (o instanceof ChunkCoord) { + ChunkCoord pair = (ChunkCoord) o; + return pair.x == x && pair.z == z; + } + return false; } public long getCombinedKey() { @@ -28,30 +42,16 @@ public long getCombinedKey() { return key; } - public static ChunkCoord fromKey(long key) { - int x = (int) key; - int z = (int) ((key >> 32) & 0x00000000); - return new ChunkCoord(x, z); - } - - public static ChunkCoord forLocation(Location loc) { - return new ChunkCoord(loc.getChunk().getX(), loc.getChunk().getZ()); + public int getX() { + return x; } - - public static ChunkCoord forChunk(Chunk chunk) { - return new ChunkCoord(chunk.getX(), chunk.getZ()); + + public int getZ() { + return z; } - + public int hashCode() { - //might collide + // might collide return x & (z << 16); } - - public boolean equals(Object o) { - if (o instanceof ChunkCoord) { - ChunkCoord pair = (ChunkCoord) o; - return pair.x == x && pair.z == z; - } - return false; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java index 649f98d1..fb91abcf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java @@ -25,26 +25,31 @@ public GlobalReinforcementManager(CitadelReinforcementData dao) { this.dao = dao; } - public boolean setup() { - for (World world : Bukkit.getWorlds()) { - boolean worked = registerWorld(world); - if (!worked) { - return false; - } + /** + * Saves all reinforcements out to the database + */ + public void flushAll() { + for (WorldReinforcementManager man : worldToManager.values()) { + man.invalidateAllReinforcements(); } - return true; } - public boolean registerWorld(World world) { - int id = dao.getOrCreateWorldID(world); - if (id == -1) { - // very bad - return false; + /** + * Gets all reinforcements in a chunk. Only use this if you know what you're + * doing + * + * @param chunk Chunk to get reinforcements for + * @return All reinforcements within the chunk + */ + public Collection getAllReinforcements(Chunk chunk) { + if (chunk == null) { + throw new IllegalArgumentException("Chunk can not be null"); } - uuidToInternalID.put(world.getUID(), id); - WorldReinforcementManager manager = new WorldReinforcementManager(dao, id); - worldToManager.put(world.getUID(), manager); - return true; + WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); + if (worldManager == null) { + throw new IllegalStateException("No world manager for reinforcement in " + chunk.getWorld().toString()); + } + return worldManager.getAllReinforcements(chunk); } /** @@ -57,6 +62,21 @@ public Reinforcement getReinforcement(Block block) { return getReinforcement(block.getLocation()); } + /** + * Returns the Reinforcement for the specified block. World is not checked at + * this stage + * + * @param block Location to get reinforcement for + * @return Reinforcement at the location if one exists, otherwise null + */ + public Reinforcement getReinforcement(Location location) { + WorldReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); + if (worldManager == null) { + return null; + } + return worldManager.getReinforcement(location); + } + /** * Inserts a new reinforcement into the cache. Should only be used for * reinforcements created just now @@ -76,18 +96,13 @@ public void insertReinforcement(Reinforcement rein) { } /** - * Returns the Reinforcement for the specified block. World is not checked at - * this stage + * Checks if the given block is reinforced or not. * - * @param block Location to get reinforcement for - * @return Reinforcement at the location if one exists, otherwise null + * @param b The block of the potential reinforcement. + * @return True if a reinforcement exists for the given block, false otherwise */ - public Reinforcement getReinforcement(Location location) { - WorldReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); - if (worldManager == null) { - return null; - } - return worldManager.getReinforcement(location); + public boolean isReinforced(Block b) { + return isReinforced(b.getLocation()); } /** @@ -102,23 +117,16 @@ public boolean isReinforced(Location loc) { return getReinforcement(loc) != null; } - /** - * Checks if the given block is reinforced or not. - * - * @param b The block of the potential reinforcement. - * @return True if a reinforcement exists for the given block, false otherwise - */ - public boolean isReinforced(Block b) { - return isReinforced(b.getLocation()); - } - - /** - * Saves all reinforcements out to the database - */ - public void flushAll() { - for (WorldReinforcementManager man : worldToManager.values()) { - man.invalidateAllReinforcements(); + public boolean registerWorld(World world) { + int id = dao.getOrCreateWorldID(world); + if (id == -1) { + // very bad + return false; } + uuidToInternalID.put(world.getUID(), id); + WorldReinforcementManager manager = new WorldReinforcementManager(dao, id); + worldToManager.put(world.getUID(), manager); + return true; } /** @@ -133,20 +141,14 @@ public void removeReinforcement(Reinforcement rein) { } worldManager.removeReinforcement(rein); } - - /** - * Gets all reinforcements in a chunk. Only use this if you know what you're doing - * @param chunk Chunk to get reinforcements for - * @return All reinforcements within the chunk - */ - public Collection getAllReinforcements(Chunk chunk) { - if (chunk == null) { - throw new IllegalArgumentException("Chunk can not be null"); - } - WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); - if (worldManager == null) { - throw new IllegalStateException("No world manager for reinforcement in " + chunk.getWorld().toString()); + + public boolean setup() { + for (World world : Bukkit.getWorlds()) { + boolean worked = registerWorld(world); + if (!worked) { + return false; + } } - return worldManager.getAllReinforcements(chunk); + return true; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 65f1d2e6..0dd17e65 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -24,6 +24,10 @@ public class Reinforcement { private boolean insecure; private ChunkCache owningCache; + public Reinforcement(Location loc, ReinforcementType type, Group group) { + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + } + public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, boolean isDirty, boolean isNew, boolean insecure) { if (loc == null) { @@ -42,37 +46,32 @@ public Reinforcement(Location loc, ReinforcementType type, int groupID, long cre this.insecure = insecure; } - public Reinforcement(Location loc, ReinforcementType type, Group group, ChunkCache cache) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + /** + * @return Age of this reinforcement in milli seconds + */ + public long getAge() { + return System.currentTimeMillis() - creationTime; } - + /** - * Sets which cache this reinforcement belongs to. Cache is expected to set this when beginning to track the reinforcement + * @return Unix time in ms when the reinforcement was created */ - void setOwningCache(ChunkCache cache) { - this.owningCache = cache; + public long getCreationTime() { + return creationTime; } /** - * Sets the health of a reinforcement. - * - * @param health new health value + * @return Group this reinforcement is under */ - public void setHealth(double health) { - this.health = health; - setDirty(true); - if (health <= 0) { - Citadel.getInstance().getReinforcementManager().removeReinforcement(this); - } + public Group getGroup() { + return GroupManager.getGroup(groupId); } /** - * @return Whether reinforcement is mature, meaning the maturation time - * configured for this reinforcements type has passed since the - * reinforcements creation + * @return Id of the group this reinforcement is under */ - public boolean isMature() { - return System.currentTimeMillis() - creationTime > type.getMaturationTime(); + public int getGroupId() { + return groupId; } /** @@ -90,18 +89,33 @@ public Location getLocation() { } /** - * @return Unix time in ms when the reinforcement was created + * @return Type of this reinforcement */ - public long getCreationTime() { - return creationTime; + public ReinforcementType getType() { + return type; + } + + public boolean hasPermission(Player p, String permission) { + return hasPermission(p.getUniqueId(), permission); + } + + public boolean hasPermission(UUID uuid, String permission) { + Group g = getGroup(); + if (g == null) { + return false; + } + return NameAPI.getGroupManager().hasAccess(g, uuid, PermissionType.getPermission(permission)); } /** - * @return Whether the reinforcement is insecure, meaning it ignores Citadel - * restrictions on hoppers etc. + * After being broken reinforcements will no longer be accessible via lookup, + * but may still persist in the cache until their deletion is persisted into the + * database + * + * @return True if the reinforcements health is equal to or less than 0 */ - public boolean isInsecure() { - return insecure; + public boolean isBroken() { + return health <= 0; } /** @@ -112,33 +126,20 @@ public boolean isDirty() { } /** - * Sets if this reinforcement needs to be saved to the database or not. Will - * automatically update the dirty flag of the cache holding this reinforcement - * as well - * - * @param dirty + * @return Whether the reinforcement is insecure, meaning it ignores Citadel + * restrictions on hoppers etc. */ - public void setDirty(boolean dirty) { - this.isDirty = dirty; - if (!dirty) { - // we saved to the database, so we are no longer new now - isNew = false; - } else { - owningCache.setDirty(true); - } + public boolean isInsecure() { + return insecure; } /** - * Switches the insecure flag of the reinforcement + * @return Whether reinforcement is mature, meaning the maturation time + * configured for this reinforcements type has passed since the + * reinforcements creation */ - public void toggleInsecure() { - insecure = !insecure; - setDirty(true); - } - - public void setType(ReinforcementType type) { - this.type = type; - setDirty(true); + public boolean isMature() { + return System.currentTimeMillis() - creationTime > type.getMaturationTime(); } /** @@ -150,30 +151,22 @@ public boolean isNew() { } /** - * After being broken reinforcements will no longer be accessible via lookup, - * but may still persist in the cache until their deletion is persisted into the - * database + * Sets if this reinforcement needs to be saved to the database or not. Will + * automatically update the dirty flag of the cache holding this reinforcement + * as well * - * @return True if the reinforcements health is equal to or less than 0 - */ - public boolean isBroken() { - return health <= 0; - } - - /** - * @return Group this reinforcement is under + * @param dirty */ - public Group getGroup() { - return GroupManager.getGroup(groupId); + public void setDirty(boolean dirty) { + this.isDirty = dirty; + if (!dirty) { + // we saved to the database, so we are no longer new now + isNew = false; + } else { + owningCache.setDirty(true); + } } - /** - * @return Id of the group this reinforcement is under - */ - public int getGroupId() { - return groupId; - } - public void setGroup(Group group) { if (group == null) { throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); @@ -183,28 +176,36 @@ public void setGroup(Group group) { } /** - * @return Type of this reinforcement + * Sets the health of a reinforcement. + * + * @param health new health value */ - public ReinforcementType getType() { - return type; + public void setHealth(double health) { + this.health = health; + setDirty(true); + if (health <= 0) { + Citadel.getInstance().getReinforcementManager().removeReinforcement(this); + } } /** - * @return Age of this reinforcement in milli seconds + * Sets which cache this reinforcement belongs to. Cache is expected to set this + * when beginning to track the reinforcement */ - public long getAge() { - return System.currentTimeMillis() - creationTime; + void setOwningCache(ChunkCache cache) { + this.owningCache = cache; } - public boolean hasPermission(Player p, String permission) { - return hasPermission(p.getUniqueId(), permission); + public void setType(ReinforcementType type) { + this.type = type; + setDirty(true); } - - public boolean hasPermission(UUID uuid, String permission) { - Group g = getGroup(); - if (g == null) { - return false; - } - return NameAPI.getGroupManager().hasAccess(g, uuid, PermissionType.getPermission(permission)); + + /** + * Switches the insecure flag of the reinforcement + */ + public void toggleInsecure() { + insecure = !insecure; + setDirty(true); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java index 2bd677f8..b03db1d9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java @@ -36,30 +36,20 @@ public ChunkCache load(ChunkCoord loc) throws Exception { } }); } - - public void insertReinforcement(Reinforcement reinforcement) { - ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); - ChunkCache cache = reinforcements.getIfPresent(key); - if (cache == null) { - throw new IllegalStateException("Chunk for created reinforcement was not loaded"); - } - cache.insertReinforcement(reinforcement); - } - - public void removeReinforcement(Reinforcement reinforcement) { - ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); - ChunkCache cache = reinforcements.getIfPresent(key); - if (cache == null) { - throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); - } - cache.removeReinforcement(reinforcement); - } - + /** - * @return Internal id of the world for which this instance manages reinforcements + * Gets all reinforcements in a chunk. Only use this if you know what you're + * doing + * + * @param chunk Chunk to get reinforcements for + * @return All reinforcements within the chunk */ - public int getWorldID() { - return worldID; + public Collection getAllReinforcements(Chunk chunk) { + ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forChunk(chunk)); + if (cache == null) { + throw new IllegalStateException("Can not retrieve reinforcements for unloaded chunks"); + } + return cache.getAll(); } /** @@ -85,6 +75,23 @@ public Reinforcement getReinforcement(Location loc) { return rein; } + /** + * @return Internal id of the world for which this instance manages + * reinforcements + */ + public int getWorldID() { + return worldID; + } + + public void insertReinforcement(Reinforcement reinforcement) { + ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); + ChunkCache cache = reinforcements.getIfPresent(key); + if (cache == null) { + throw new IllegalStateException("Chunk for created reinforcement was not loaded"); + } + cache.insertReinforcement(reinforcement); + } + /** * Used to flush all the reinforcements to the db on shutdown. Can be called * else where if too a manual flush is wanted. @@ -102,18 +109,13 @@ public void invalidateAllReinforcements() { public boolean isReinforced(Location loc) { return getReinforcement(loc) != null; } - - /** - * Gets all reinforcements in a chunk. Only use this if you know what you're doing - * @param chunk Chunk to get reinforcements for - * @return All reinforcements within the chunk - */ - public Collection getAllReinforcements(Chunk chunk) { - ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forChunk(chunk)); + + public void removeReinforcement(Reinforcement reinforcement) { + ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); + ChunkCache cache = reinforcements.getIfPresent(key); if (cache == null) { - throw new IllegalStateException( - "Can not retrieve reinforcements for unloaded chunks"); + throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); } - return cache.getAll(); + cache.removeReinforcement(reinforcement); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/IPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java similarity index 92% rename from src/main/java/vg/civcraft/mc/citadel/playerstate/IPlayerState.java rename to src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 43486f80..5a39528b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/IPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -16,12 +16,12 @@ import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.model.Reinforcement; -public abstract class IPlayerState { +public abstract class AbstractPlayerState { protected UUID uuid; private boolean bypass; - public IPlayerState(Player p, boolean bypass) { + public AbstractPlayerState(Player p, boolean bypass) { if (p == null) { throw new IllegalArgumentException("Player for player state can not be null"); } @@ -29,9 +29,9 @@ public IPlayerState(Player p, boolean bypass) { this.bypass = bypass; } - public abstract void handleBlockPlace(BlockPlaceEvent e); + public abstract String getName(); - public abstract void handleInteractBlock(PlayerInteractEvent e); + public abstract void handleBlockPlace(BlockPlaceEvent e); public void handleBreakBlock(BlockBreakEvent e) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getBlock()); @@ -51,7 +51,8 @@ public void handleBreakBlock(BlockBreakEvent e) { if (Utility.isPlant(e.getBlock())) { if (rein.hasPermission(e.getPlayer(), Citadel.cropsPerm) && !e.getBlock().getLocation().equals(rein.getLocation())) { - // allow, because player has crop permission and the only reinforcement protecting is in the soil + // allow, because player has crop permission and the only reinforcement + // protecting is in the soil return; } } @@ -69,7 +70,9 @@ public void handleBreakBlock(BlockBreakEvent e) { damage = dre.getDamageDone(); ReinforcementLogic.damageReinforcement(rein, damage); } - + + public abstract void handleInteractBlock(PlayerInteractEvent e); + public boolean isBypassEnabled() { return bypass; } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index fdd3d08c..1c1b9d35 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -15,7 +15,7 @@ import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class FortificationState extends IPlayerState { +public class FortificationState extends AbstractPlayerState { private ReinforcementType type; private Group group; @@ -26,17 +26,32 @@ public FortificationState(Player p, boolean bypass, ReinforcementType type, Grou this.group = group; } + public Group getGroup() { + return group; + } + + public String getName() { + return "Fortifying mode with " + type.getName() + " on " + group.getName(); + } + + public ReinforcementType getType() { + return type; + } + @Override public void handleBlockPlace(BlockPlaceEvent e) { - //check if group still exists + // check if group still exists if (!group.isValid()) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "The group " + group.getName() + " seems to have been deleted in the mean time"); + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "The group " + group.getName() + " seems to have been deleted in the mean time"); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); return; } - //check if player still has permission - if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm))) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); + // check if player still has permission + if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm))) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); return; } @@ -47,14 +62,14 @@ public void handleBlockPlace(BlockPlaceEvent e) { return; } Player player = e.getPlayer(); - //check if reinforcement can reinforce that block + // check if reinforcement can reinforce that block if (!type.canBeReinforced(e.getBlock().getType())) { e.setCancelled(true); Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + e.getBlock().getType()); return; } ItemMap playerItems = new ItemMap(player.getInventory()); - //check inventory + // check inventory int available = playerItems.getAmount(type.getItem()); if (available == 0) { Citadel.getInstance().getStateManager().setState(player, null); @@ -62,7 +77,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); return; } - //remove from inventory + // remove from inventory ItemMap toRemove = new ItemMap(type.getItem()); if (toRemove.removeSafelyFrom(player.getInventory())) { Utility.sendAndLog(player, ChatColor.RED, @@ -70,19 +85,15 @@ public void handleBlockPlace(BlockPlaceEvent e) { Citadel.getInstance().getStateManager().setState(player, null); return; } - //create reinforcement + // create reinforcement + if (Citadel.getInstance().getConfigManager().logCreation()) { + Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() + + " for " + e.getBlock().getType().toString() + " at " + e.getBlock().getLocation().toString()); + } ReinforcementLogic.createReinforcement(e.getBlock(), type, group); } @Override public void handleInteractBlock(PlayerInteractEvent e) { } - - public Group getGroup() { - return group; - } - - public ReinforcementType getType() { - return type; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index c71d1256..1201ddab 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -16,15 +16,32 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.util.TextUtil; -public class InformationState extends IPlayerState { +public class InformationState extends AbstractPlayerState { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); + private static String formatHealth(Reinforcement rein) { + return String.format("%s%% (%s/%s)", commaFormat.format(rein.getHealth() / rein.getType().getHealth() * 100), + roundingFormat.format(rein.getHealth()), rein.getType().getHealth()); + } + + private static String formatProgress(long start, long timeNeeded, String text) { + long timeTaken = System.currentTimeMillis() - start; + timeTaken = Math.max(timeTaken, timeNeeded); + double progress = Math.min(1.0, ((double) timeTaken) / ((double) timeNeeded)); + return String.format("%s%% %s %s left", commaFormat.format(progress * 100), text, + TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); + } + public InformationState(Player p, boolean bypass) { super(p, bypass); } + public String getName() { + return "Information mode"; + } + @Override public void handleBlockPlace(BlockPlaceEvent e) { } @@ -57,30 +74,16 @@ public void handleInteractBlock(PlayerInteractEvent e) { sb.append("(Insecure)"); } AcidManager acidMan = Citadel.getInstance().getAcidManager(); - if(acidMan.isPossibleAcidBlock(e.getClickedBlock())) { + if (acidMan.isPossibleAcidBlock(e.getClickedBlock())) { sb.append(ChatColor.GOLD); long remainingTime = acidMan.getRemainingAcidMaturationTime(rein); if (remainingTime == 0) { sb.append("Acid ready"); - } - else { + } else { sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); - } + } } Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); } - private static String formatProgress(long start, long timeNeeded, String text) { - long timeTaken = System.currentTimeMillis() - start; - timeTaken = Math.max(timeTaken, timeNeeded); - double progress = Math.min(1.0, ((double) timeTaken) / ((double) timeNeeded)); - return String.format("%s%% %s %s left", commaFormat.format(progress * 100), text, - TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); - } - - private static String formatHealth(Reinforcement rein) { - return String.format("%s%% (%s/%s)", commaFormat.format(rein.getHealth() / rein.getType().getHealth() * 100), - roundingFormat.format(rein.getHealth()), rein.getType().getHealth()); - } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index 12e435d5..e82023e1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -10,12 +10,17 @@ import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.Reinforcement; -public class InsecureState extends IPlayerState { +public class InsecureState extends AbstractPlayerState { public InsecureState(Player p, boolean bypass) { super(p, bypass); } + @Override + public String getName() { + return "Insecure mode"; + } + @Override public void handleBlockPlace(BlockPlaceEvent e) { } @@ -30,9 +35,11 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (rein.hasPermission(e.getPlayer(), Citadel.insecurePerm)) { rein.toggleInsecure(); if (rein.isInsecure()) { - Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, e.getClickedBlock().getType().name() + " is now insecure"); + Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, + e.getClickedBlock().getType().name() + " is now insecure"); } else { - Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, e.getClickedBlock().getType().name() + " is now secure"); + Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, + e.getClickedBlock().getType().name() + " is now secure"); } } else { Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "You are not allowed to make this reinforcement insecure"); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 57bef29f..07c655ff 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -4,23 +4,27 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -public class NormalState extends IPlayerState { +public class NormalState extends AbstractPlayerState { public NormalState(Player p, boolean bypass) { super(p, bypass); // TODO Auto-generated constructor stub } + @Override + public String getName() { + return "Normal mode"; + } + @Override public void handleBlockPlace(BlockPlaceEvent e) { // TODO Auto-generated method stub - + } @Override public void handleInteractBlock(PlayerInteractEvent e) { - - + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index 5ca96188..b746eae1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -8,34 +8,41 @@ public class PlayerStateManager { - private Map playerStateMap; + private Map playerStateMap; public PlayerStateManager() { this.playerStateMap = new TreeMap<>(); } - public IPlayerState getState(Player player) { + public AbstractPlayerState getState(Player player) { if (player == null) { throw new IllegalArgumentException("Can not get state for null player"); } - IPlayerState state = playerStateMap.get(player.getUniqueId()); + AbstractPlayerState state = playerStateMap.get(player.getUniqueId()); if (state == null) { state = new NormalState(player, true); playerStateMap.put(player.getUniqueId(), state); } return state; } - - public void setState(Player p, IPlayerState state) { - if (p == null) { + + public void setState(Player player, AbstractPlayerState state) { + if (player == null) { throw new IllegalArgumentException("Can not set state for null player"); } - //null state is allowed, it just resets the state + AbstractPlayerState existingState = playerStateMap.get(player.getUniqueId()); + // null state is allowed, it just resets the state if (state == null) { - playerStateMap.remove(p.getUniqueId()); - } - else { - playerStateMap.put(p.getUniqueId(), state); + if (existingState != null) { + state = new NormalState(player, existingState.isBypassEnabled()); + } else { + state = new NormalState(player, true); + } + playerStateMap.put(player.getUniqueId(), state); + player.sendMessage("Switched Citadel mode to " + state.getName()); + } else { + playerStateMap.put(player.getUniqueId(), state); + player.sendMessage("Switched Citadel mode to " + state.getName() + " from " + existingState.getName()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 175bec4e..016d2555 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -18,7 +18,7 @@ import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class ReinforcingState extends IPlayerState { +public class ReinforcingState extends AbstractPlayerState { private Group group; @@ -27,6 +27,14 @@ public ReinforcingState(Player p, boolean bypass, Group group) { this.group = group; } + public Group getGroup() { + return group; + } + + public String getName() { + return "Reinforcing mode on " + group.getName(); + } + @Override public void handleBlockPlace(BlockPlaceEvent e) { } @@ -90,6 +98,12 @@ public void handleInteractBlock(PlayerInteractEvent e) { } if (rein == null) { + if (Citadel.getInstance().getConfigManager().logCreation()) { + Citadel.getInstance().getLogger() + .info(player.getName() + " created reinforcement with " + type.getName() + " for " + + e.getClickedBlock().getType().toString() + " at " + + e.getClickedBlock().getLocation().toString()); + } // just create new reinforcement ReinforcementLogic.createReinforcement(e.getClickedBlock(), type, group); } else { @@ -119,9 +133,5 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } } - - public Group getGroup() { - return group; - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java index f960db14..27fa4480 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java @@ -9,17 +9,10 @@ public class ReinforcementEffect { private float offsetY; private float offsetZ; private float speed; - private int particleCount; - - public ReinforcementEffect( - Particle particle, - float offsetX, - float offsetY, - float offsetZ, - float speed, - int particleCount - ) - { + private int particleCount; + + public ReinforcementEffect(Particle particle, float offsetX, float offsetY, float offsetZ, float speed, + int particleCount) { this.particle = particle; this.offsetX = offsetX; this.offsetY = offsetY; @@ -28,14 +21,6 @@ public ReinforcementEffect( this.particleCount = particleCount; } - /** - * - * @return the type of particle used in this effect - */ - public Particle getParticle() { - return particle; - } - /** * * @return the amount to be randomly offset by in the X axis @@ -62,28 +47,37 @@ public float getOffsetZ() { /** * - * @return the speed of the particles + * @return the type of particle used in this effect */ - public float getSpeed() { - return speed; + public Particle getParticle() { + return particle; } /** * - * @return the amount of particle to display. + * @return the amount of particle to display. */ public int getParticleCount() { return particleCount; } + /** + * + * @return the speed of the particles + */ + public float getSpeed() { + return speed; + } + /** * Display an effect defined in the config around a reinforcement. + * * @param location the location of the reinforcement. */ - public void playEffect(Location location){ + public void playEffect(Location location) { location.getWorld().spawnParticle(particle, location, particleCount, offsetX, offsetY, offsetZ, speed, null); } - + public String toString() { return String.format( " type: %s \n offsetX: %f \n offsetY: %f \n offsetZ: %f \n speed: %f \n particleCount: %d", diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 250360f9..5bd4f8e6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -19,12 +19,13 @@ public class ReinforcementType { private ReinforcementEffect effect; private Set allowedReinforceables; private Set disallowedReinforceables; + private Set globalBlackList; private int id; private String name; public ReinforcementType(double health, double returnChance, ItemStack item, long maturationTime, long acidTime, double scale, long gracePeriod, ReinforcementEffect effect, Collection allowsReinforceables, - Collection disallowedReinforceables, int id, String name) { + Collection disallowedReinforceables, int id, String name, Collection globalBlackList) { this.health = health; this.name = name; this.returnChance = returnChance; @@ -37,55 +38,67 @@ public ReinforcementType(double health, double returnChance, ItemStack item, lon if (allowsReinforceables != null) { this.allowedReinforceables = new TreeSet<>(allowsReinforceables); } else { - //can only black list OR white list + // can only black list OR white list if (disallowedReinforceables != null) { this.disallowedReinforceables = new TreeSet<>(disallowedReinforceables); } } + this.globalBlackList = new TreeSet<>(); + if (globalBlackList != null) { + this.globalBlackList.addAll(globalBlackList); + } this.id = id; } - /** - * @return Item used to create instance of this item - */ - public ItemStack getItem() { - return item; + public boolean canBeReinforced(Material mat) { + if (globalBlackList.contains(mat)) { + return false; + } + if (allowedReinforceables == null) { + if (disallowedReinforceables == null || !disallowedReinforceables.contains(mat)) { + return true; + } else { + return false; + } + } + return allowedReinforceables.contains(mat); } - + /** - * @return Maximum health + * @return Returns the acid maturation time needed until this acid block is + * ready. */ - public double getHealth() { - return health; + public long getAcidTime() { + return acidTime; } /** - * @return The percent chance that a block will return the reinforcements. - * Scales with damage. 1 means it is 100% and .5 means 50% + * @return the time in milli seconds to "forgive" reinforcements and apply 100% + * return rate. Set to 0 to disable. */ - public double getReturnChance() { - return returnChance; + public long getGracePeriod() { + return this.gracePeriod; } - + /** - * @return Nice name to use for messages + * @return Maximum health */ - public String getName() { - return name; + public double getHealth() { + return health; } /** - * @return Returns the Maturation time needed until this block is mature in milliseconds + * @return The unique id identifying this config */ - public long getMaturationTime() { - return maturationTime; + public int getID() { + return id; } /** - * @return Returns the acid maturation time needed until this acid block is ready. + * @return Item used to create instance of this item */ - public long getAcidTime() { - return acidTime; + public ItemStack getItem() { + return item; } /** @@ -97,36 +110,33 @@ public double getMaturationScale() { } /** - * @return Get the effect to spawn around this type of reinforcement when it is - * created or damaged. + * @return Returns the Maturation time needed until this block is mature in + * milliseconds */ - public ReinforcementEffect getReinforcementEffect() { - return effect; + public long getMaturationTime() { + return maturationTime; } - public boolean canBeReinforced(Material mat) { - if (allowedReinforceables == null) { - if (disallowedReinforceables == null || !disallowedReinforceables.contains(mat)) { - return true; - } else { - return false; - } - } - return allowedReinforceables.contains(mat); + /** + * @return Nice name to use for messages + */ + public String getName() { + return name; } /** - * @return the time in milli seconds to "forgive" reinforcements and apply 100% return - * rate. Set to 0 to disable. + * @return Get the effect to spawn around this type of reinforcement when it is + * created or damaged. */ - public long getGracePeriod() { - return this.gracePeriod; + public ReinforcementEffect getReinforcementEffect() { + return effect; } - + /** - * @return The unique id identifying this config + * @return The percent chance that a block will return the reinforcements. + * Scales with damage. 1 means it is 100% and .5 means 50% */ - public int getID() { - return id; + public double getReturnChance() { + return returnChance; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java index 05582c36..b83ee9c0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java @@ -8,32 +8,32 @@ import org.bukkit.inventory.ItemStack; public class ReinforcementTypeManager { - + private Map typesByItem; private Map typesById; - + public ReinforcementTypeManager() { typesByItem = new HashMap<>(); typesById = new TreeMap<>(); } - - public void register(ReinforcementType type) { - typesByItem.put(type.getItem(), type); - typesById.put(type.getID(), type); + + public Collection getAllTypes() { + return typesById.values(); } - + public ReinforcementType getById(int id) { return typesById.get(id); } - + public ReinforcementType getByItemStack(ItemStack is) { ItemStack copy = is.clone(); copy.setAmount(1); return typesByItem.get(copy); } - - public Collection getAllTypes() { - return typesById.values(); + + public void register(ReinforcementType type) { + typesByItem.put(type.getItem(), type); + typesById.put(type.getID(), type); } } From c7082ba62ca8fc933eef3a5900497ebafdefb387 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 18 Mar 2019 23:50:15 +0100 Subject: [PATCH 115/255] Latest, pretty much working --- pom.xml | 2 +- .../java/vg/civcraft/mc/citadel/Citadel.java | 48 ++-- .../mc/citadel/CitadelConfigManager.java | 25 ++- .../mc/citadel/ReinforcementLogic.java | 88 ++++++-- .../java/vg/civcraft/mc/citadel/Utility.java | 138 +++++++++--- .../command/AdvancedFortification.java | 106 +++++++++ .../civcraft/mc/citadel/command/Bypass.java | 1 + .../mc/citadel/command/Fortification.java | 30 +-- .../mc/citadel/command/PatchMode.java | 37 ++++ .../mc/citadel/command/ReinforcementsGUI.java | 2 +- .../civcraft/mc/citadel/command/Reload.java | 28 +++ .../database/CitadelReinforcementData.java | 173 +-------------- .../mc/citadel/listener/BlockListener.java | 19 +- .../citadel/listener/ChunkLoadListener.java | 35 +++ .../mc/citadel/listener/EntityListener.java | 20 +- .../mc/citadel/listener/RedstoneListener.java | 7 +- .../civcraft/mc/citadel/model/ChunkCache.java | 10 +- .../model/GlobalReinforcementManager.java | 21 +- .../mc/citadel/model/Reinforcement.java | 17 ++ .../model/WorldReinforcementManager.java | 21 +- .../playerstate/AbstractPlayerState.java | 20 +- .../AdvancedFortificationState.java | 95 ++++++++ .../playerstate/FortificationState.java | 60 +---- .../citadel/playerstate/InformationState.java | 37 +++- .../mc/citadel/playerstate/PatchState.java | 76 +++++++ .../playerstate/PlayerStateManager.java | 13 +- .../citadel/playerstate/ReinforcingState.java | 36 +-- .../reinforcementtypes/ReinforcementType.java | 52 ++++- src/main/resources/config.yml | 206 +++++++----------- src/main/resources/plugin.yml | 192 ++++++++++------ 30 files changed, 1059 insertions(+), 556 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/command/Reload.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java diff --git a/pom.xml b/pom.xml index f7055885..896ac812 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,7 @@ org.spigotmc spigot-api - 1.12.2-R0.1-SNAPSHOT + 1.13.2-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 08b8bc25..43f14e09 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -4,9 +4,11 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; +import org.bukkit.event.HandlerList; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; import vg.civcraft.mc.citadel.listener.BlockListener; +import vg.civcraft.mc.citadel.listener.ChunkLoadListener; import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; @@ -30,12 +32,14 @@ public class Citadel extends ACivMod { public static final String doorPerm = "DOORS"; public static final String acidPerm = "ACIDBLOCK"; public static final String infoPerm = "REINFORCEMENT_INFO"; + public static final String repairPerm = "REPAIR_REINFORCEMENT"; + private static Citadel instance; public static Citadel getInstance() { return instance; } - + private Logger logger; private CitadelReinforcementData db; private GlobalReinforcementManager worldManager; @@ -98,6 +102,13 @@ public boolean initializeDatabase() { public void onDisable() { // Pushes all reinforcements loaded to be saved to db. worldManager.flushAll(); + HandlerList.unregisterAll(this); + Bukkit.getScheduler().cancelTasks(this); + } + + public void reload() { + onDisable(); + onEnable(); } public void onEnable() { @@ -106,26 +117,26 @@ public void onEnable() { logger = getLogger(); if (!Bukkit.getPluginManager().isPluginEnabled("NameLayer")) { logger.info("Citadel is shutting down because it could not find NameLayer"); - this.getPluginLoader().disablePlugin(this); + Bukkit.shutdown(); return; } config = new CitadelConfigManager(this); if (!config.parse()) { logger.severe("Errors in config file, shutting down"); - this.getPluginLoader().disablePlugin(this); + Bukkit.shutdown(); return; } typeManager = new ReinforcementTypeManager(); config.getReinforcementTypes().forEach(t -> typeManager.register(t)); if (!initializeDatabase()) { logger.severe("Errors setting up database, shutting down"); - this.getPluginLoader().disablePlugin(this); + Bukkit.shutdown(); return; } worldManager = new GlobalReinforcementManager(db); if (!worldManager.setup()) { logger.severe("Errors setting up world config, shutting down"); - this.getPluginLoader().disablePlugin(this); + Bukkit.shutdown(); return; } stateManager = new PlayerStateManager(); @@ -142,6 +153,7 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); + getServer().getPluginManager().registerEvents(new ChunkLoadListener(), this); } @SuppressWarnings("unchecked") @@ -155,13 +167,23 @@ private void registerNameLayerPermissions() { modsAndAbove.add(PlayerType.MODS); modsAndAbove.add(PlayerType.ADMINS); modsAndAbove.add(PlayerType.OWNER); - PermissionType.registerPermission(reinforcePerm, (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission(acidPerm, (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission(infoPerm, (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone()); - PermissionType.registerPermission(doorPerm, (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission(cropsPerm, (LinkedList) membersAndAbove.clone()); - PermissionType.registerPermission(insecurePerm, (LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission(reinforcePerm, (LinkedList) modsAndAbove.clone(), + "Allows reinforcing blocks on this group"); + PermissionType.registerPermission(acidPerm, (LinkedList) modsAndAbove.clone(), + "Allows activating acid blocks reinforced on this group"); + PermissionType.registerPermission(infoPerm, (LinkedList) membersAndAbove.clone(), + "Allows viewing information on reinforcements reinforced on this group"); + PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone(), + "Allows bypassing reinforcements reinforced on this group"); + PermissionType.registerPermission(repairPerm, (LinkedList) modsAndAbove.clone(), + "Allows repairing reinforcements reinforced on this group"); + PermissionType.registerPermission(doorPerm, (LinkedList) membersAndAbove.clone(), + "Allows opening doors reinforced on this group"); + PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone(), + "Allows opening containers like chests reinforced on this group"); + PermissionType.registerPermission(cropsPerm, (LinkedList) membersAndAbove.clone(), + "Allows harvesting crops growing on soil reinforced on this group"); + PermissionType.registerPermission(insecurePerm, (LinkedList) membersAndAbove.clone(), + "Allows toggling the insecure flag on reinforcements"); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index dd04f03d..da7c1e6c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -15,6 +15,7 @@ import vg.civcraft.mc.civmodcore.CoreConfigManager; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.util.ConfigParsing; +import vg.civcraft.mc.civmodcore.util.TextUtil; public class CitadelConfigManager extends CoreConfigManager { @@ -30,6 +31,9 @@ public class CitadelConfigManager extends CoreConfigManager { private boolean logCreation; private boolean logMessages; + private long globalDecayTimer; + private double globalDecayMultiplier; + private double redstoneRange; public CitadelConfigManager(ACivMod plugin) { @@ -110,7 +114,7 @@ private void parseAcidMaterials(ConfigurationSection config) { @Override protected boolean parseInternal(ConfigurationSection config) { database = (ManagedDatasource) config.get("database"); - parseReinforcementTypes(config.getConfigurationSection("reinforcements")); + globalBlackList = parseMaterialList(config, "non_reinforceables"); parseAcidMaterials(config); logHostileBreaks = config.getBoolean("logHostileBreaks", true); logFriendlyBreaks = config.getBoolean("logFriendlyBreaks", true); @@ -118,7 +122,9 @@ protected boolean parseInternal(ConfigurationSection config) { logCreation = config.getBoolean("logCreation", true); logMessages = config.getBoolean("logMessages", true); redstoneRange = config.getDouble("redstoneDistance", 3); - globalBlackList = parseMaterialList(config, "non_reinforceables"); + globalDecayMultiplier = config.getDouble("global_decay_multiplier", 2.0); + globalDecayTimer = ConfigParsing.parseTime(config.getString("global_decay_timer", "0")); + parseReinforcementTypes(config.getConfigurationSection("reinforcements")); return true; } @@ -140,7 +146,10 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { return null; } ItemStack item = config.getItemStack("item"); - ReinforcementEffect effect = getReinforcementEffect(config.getConfigurationSection("effect")); + ReinforcementEffect creationEffect = getReinforcementEffect(config.getConfigurationSection("creation_effect")); + ReinforcementEffect damageEffect = getReinforcementEffect(config.getConfigurationSection("damage_effect")); + ReinforcementEffect destructionEffect = getReinforcementEffect( + config.getConfigurationSection("destruction_effect")); long gracePeriod = ConfigParsing.parseTime(config.getString("grace_period", "0"), TimeUnit.MILLISECONDS); long maturationTime = ConfigParsing.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), TimeUnit.MILLISECONDS); @@ -151,6 +160,9 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { List reinforceables = parseMaterialList(config, "reinforceables"); List nonReinforceables = parseMaterialList(config, "non_reinforceables"); int id = config.getInt("id", -1); + long decayTimer = ConfigParsing + .parseTime(config.getString("decay_timer", String.valueOf(globalDecayTimer / 1000L) + "s")); + double decayMultiplier = config.getDouble("decay_multiplier", globalDecayMultiplier); if (name == null) { logger.warning("No name specified for reinforcement type at " + config.getCurrentPath()); name = item.getType().name(); @@ -164,8 +176,13 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + ". This does not make sense and the type will be ignored"); return null; } + logger.info("Parsed reinforcement type " + name + " for item " + item.toString() + ", returnChance: " + + returnChance + ", maturationTime: " + TextUtil.formatDuration(maturationTime, TimeUnit.MILLISECONDS) + + ", acidTime: " + TextUtil.formatDuration(acidTime, TimeUnit.MILLISECONDS) + ", gracePeriod: " + + gracePeriod + ", id: " + id); return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, - effect, reinforceables, nonReinforceables, id, name, globalBlackList); + creationEffect, damageEffect, destructionEffect, reinforceables, nonReinforceables, id, name, + globalBlackList, decayTimer, decayMultiplier); } private void parseReinforcementTypes(ConfigurationSection config) { diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index c56e9ab8..c738e71d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -1,11 +1,12 @@ package vg.civcraft.mc.citadel; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Bed; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.material.Bed; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; @@ -18,14 +19,25 @@ public class ReinforcementLogic { public static void createReinforcement(Block block, ReinforcementType type, Group group) { GlobalReinforcementManager worldManager = Citadel.getInstance().getReinforcementManager(); worldManager.insertReinforcement(new Reinforcement(block.getLocation(), type, group)); + if (type.getCreationEffect() != null) { + type.getCreationEffect().playEffect(block.getLocation().clone().add(0.5, 0.5, 0.5)); + } } public static void damageReinforcement(Reinforcement rein, double damage) { rein.setHealth(rein.getHealth() - damage); - rein.getType().getReinforcementEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + if (rein.isBroken()) { + if (rein.getType().getDestructionEffect() != null) { + rein.getType().getDestructionEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + } + } else { + if (rein.getType().getDamageEffect() != null) { + rein.getType().getDamageEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + } + } } - public static double getDamageApplied(Player player, Reinforcement reinforcement) { + public static double getDamageApplied(Reinforcement reinforcement) { double damageAmount = 1.0; if (!reinforcement.isMature()) { double timeExisted = (double) (System.currentTimeMillis() - reinforcement.getCreationTime()); @@ -33,9 +45,16 @@ public static double getDamageApplied(Player player, Reinforcement reinforcement damageAmount /= (1.0 - progress); damageAmount *= reinforcement.getType().getMaturationScale(); } + long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); + damageAmount *= reinforcement.getType().getDecayDamageMultipler(lastRefresh); return damageAmount; } + public static Reinforcement getReinforcementAt(Location loc) { + GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); + return reinMan.getReinforcement(loc); + } + public static Reinforcement getReinforcementProtecting(Block b) { Reinforcement directReinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(b); if (directReinforcement != null) { @@ -57,20 +76,37 @@ public static Reinforcement getReinforcementProtecting(Block b) { */ public static Block getResponsibleBlock(Block block) { switch (block.getType()) { - case NETHER_WARTS: - case YELLOW_FLOWER: - case SAPLING: + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: case WHEAT: - case CARROT: - case POTATO: - case CROPS: - case BEETROOT_BLOCK: + case CARROTS: + case POTATOES: + case BEETROOTS: case MELON_STEM: case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case NETHER_WART_BLOCK: return block.getRelative(BlockFace.DOWN); - case RED_ROSE: - case SUGAR_CANE_BLOCK: + case SUGAR_CANE: case CACTUS: + case SUNFLOWER: + case LILAC: + case PEONY: // scan downwards for first different block Block below = block.getRelative(BlockFace.DOWN); while (below.getType() == block.getType()) { @@ -80,21 +116,37 @@ public static Block getResponsibleBlock(Block block) { case ACACIA_DOOR: case BIRCH_DOOR: case DARK_OAK_DOOR: - case IRON_DOOR_BLOCK: + case IRON_DOOR: case SPRUCE_DOOR: case JUNGLE_DOOR: - case WOODEN_DOOR: - case WOOD_DOOR: + case OAK_DOOR: if (block.getRelative(BlockFace.UP).getType() != block.getType()) { // block is upper half of a door return block.getRelative(BlockFace.DOWN); } - case BED_BLOCK: - if (((Bed) block.getState().getData()).isHeadOfBed()) { + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case MAGENTA_BED: + case LIME_BED: + case ORANGE_BED: + case PURPLE_BED: + case PINK_BED: + case WHITE_BED: + case LIGHT_GRAY_BED: + case LIGHT_BLUE_BED: + case RED_BED: + case YELLOW_BED: + Bed bed = (Bed) block.getBlockData(); + if (bed.getPart() == Bed.Part.HEAD) { return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); } + default: + return block; } - return block; } /** diff --git a/src/main/java/vg/civcraft/mc/citadel/Utility.java b/src/main/java/vg/civcraft/mc/citadel/Utility.java index 1fee71f3..d10af332 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Utility.java +++ b/src/main/java/vg/civcraft/mc/citadel/Utility.java @@ -5,12 +5,19 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; + /** * Just a useful class with general and misplaced methods that can be called * from anywhere. @@ -63,44 +70,115 @@ public void run() { }, 1); } - private static boolean isDirtPlant(Material mat) { - return Material.SUGAR_CANE_BLOCK.equals(mat) || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); - } - - private static boolean isGrassPlant(Material mat) { - return Material.SUGAR_CANE_BLOCK.equals(mat) || Material.MELON_BLOCK.equals(mat) - || Material.PUMPKIN.equals(mat); - } - public static boolean isPlant(Block plant) { - return isPlant(plant.getType()); - } - - public static boolean isPlant(Material mat) { - return isSoilPlant(mat) || isDirtPlant(mat) || isGrassPlant(mat) || isSandPlant(mat) || isSoulSandPlant(mat); + switch (plant.getType()) { + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: + case WHEAT: + case CARROTS: + case POTATOES: + case BEETROOTS: + case MELON_STEM: + case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case NETHER_WART_BLOCK: + case SUGAR_CANE: + case CACTUS: + case SUNFLOWER: + case LILAC: + case PEONY: + return true; + default: + return false; + } } - private static boolean isSandPlant(Material mat) { - return Material.CACTUS.equals(mat) || Material.SUGAR_CANE_BLOCK.equals(mat); + public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { + receiver.sendMessage(color + message); + if (Citadel.getInstance().getConfigManager().logMessages()) { + Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", + new Object[] { receiver.getName(), message }); + } } - private static boolean isSoilPlant(Material mat) { - return Material.WHEAT.equals(mat) || Material.MELON_STEM.equals(mat) || Material.PUMPKIN_STEM.equals(mat) - || Material.CARROT.equals(mat) || Material.POTATO.equals(mat) || Material.CROPS.equals(mat) - || Material.MELON_BLOCK.equals(mat) || Material.PUMPKIN.equals(mat) - || Material.BEETROOT_BLOCK.equals(mat); + public static void debugLog(String msg) { + if (Citadel.getInstance().getConfigManager().isDebugEnabled()) { + Citadel.getInstance().getLogger().info(msg); + } } - private static boolean isSoulSandPlant(Material mat) { - return Material.NETHER_WARTS.equals(mat); + public static boolean consumeReinforcementItems(Player player, ReinforcementType type) { + ItemMap toRemove = new ItemMap(type.getItem()); + if (!toRemove.removeSafelyFrom(player.getInventory())) { + Utility.sendAndLog(player, ChatColor.RED, + "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); + Citadel.getInstance().getStateManager().setState(player, null); + return false; + } + return true; } - public static void sendAndLog(CommandSender receiver, ChatColor color, String message) { - receiver.sendMessage(color + message); - if (Citadel.getInstance().getConfigManager().logMessages()) { - Citadel.getInstance().getLogger().log(Level.INFO, "Sent {0} reply {1}", - new Object[] { receiver.getName(), message }); + public static boolean attemptReinforcementCreation(Block block, ReinforcementType type, Group group, + Player player) { + // check if group still exists + if (!group.isValid()) { + Utility.sendAndLog(player, ChatColor.RED, + "The group " + group.getName() + " seems to have been deleted in the mean time"); + Citadel.getInstance().getStateManager().setState(player, null); + return true; + } + // check if player still has permission + if (!NameAPI.getGroupManager().hasAccess(group, player.getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm))) { + Utility.sendAndLog(player, ChatColor.RED, + "You seem to have lost permission to reinforce on " + group.getName()); + Citadel.getInstance().getStateManager().setState(player, null); + return true; + } + // check if reinforcement already exists + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein != null) { + // something like a slab, we just ignore this + return false; + } + // check if reinforcement can reinforce that block + if (!type.canBeReinforced(block.getType())) { + Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + block.getType()); + return true; + } + ItemMap playerItems = new ItemMap(player.getInventory()); + // check inventory + int available = playerItems.getAmount(type.getItem()); + if (available == 0) { + Citadel.getInstance().getStateManager().setState(player, null); + Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); + return true; + } + // remove from inventory + if (!Utility.consumeReinforcementItems(player, type)) { + return true; + } + // create reinforcement + if (Citadel.getInstance().getConfigManager().logCreation()) { + Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() + + " for " + block.getType().toString() + " at " + block.getLocation().toString()); } + ReinforcementLogic.createReinforcement(block, type, group); + return false; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java new file mode 100644 index 00000000..6c767002 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -0,0 +1,106 @@ +package vg.civcraft.mc.citadel.command; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; +import vg.civcraft.mc.citadel.playerstate.AdvancedFortificationState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; +import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; + +@CivCommand(id = "cta") +public class AdvancedFortification extends StandaloneCommand { + + @Override + public boolean execute(CommandSender sender, String[] args) { + Player player = (Player) sender; + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + AbstractPlayerState currentState = stateManager.getState(player); + AdvancedFortificationState advFortState = null; + if (currentState instanceof AdvancedFortificationState) { + advFortState = (AdvancedFortificationState) currentState; + if (args.length == 0) { + stateManager.setState(player, null); + return true; + } + } + ItemStack mainHand = player.getInventory().getItemInMainHand(); + if (mainHand == null) { + Utility.sendAndLog(player, ChatColor.RED, + "You need to hold an item in your main hand to specify the block type to reinforce"); + return true; + } + ItemStack offHand = player.getInventory().getItemInOffHand(); + if (offHand == null) { + Utility.sendAndLog(player, ChatColor.RED, "You need to hold a reinforcement item in your off hand"); + return true; + } + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(offHand); + if (type == null) { + Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with the item in your off hand"); + return true; + } + if (!type.canBeReinforced(mainHand.getType())) { + Utility.sendAndLog(player, ChatColor.AQUA, + type.getName() + ChatColor.RED + " can not reinforce " + mainHand.getType().name()); + return true; + } + String groupName = null; + if (args.length == 0) { + groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); + if (groupName == null) { + Utility.sendAndLog(player, ChatColor.RED, + "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); + return true; + } + } else { + groupName = args[0]; + } + + Group group = GroupManager.getGroup(groupName); + if (group == null) { + Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + return true; + } + boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), + PermissionType.getPermission(Citadel.reinforcePerm)); + if (!hasAccess) { + Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + return true; + } + if (advFortState == null) { + advFortState = new AdvancedFortificationState(player, currentState.isBypassEnabled()); + stateManager.setState(player, advFortState); + } + advFortState.addSetup(mainHand, type, group); + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + if (args.length == 0) + return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); + else if (args.length == 1) + return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + (Player) sender); + else { + return new ArrayList(); + } + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java index 2d6e99b3..705646d9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -26,6 +26,7 @@ public boolean execute(CommandSender sender, String[] args) { Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } + currentState.toggleBypass(); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index 5643a345..e629f954 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.UUID; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @@ -28,10 +27,23 @@ public class Fortification extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - UUID uuid = NameAPI.getUUID(player.getName()); + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + AbstractPlayerState currentState = stateManager.getState(player); + if (args.length == 0 && currentState instanceof FortificationState) { + stateManager.setState(player, null); + return true; + } + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager() + .getByItemStack(player.getInventory().getItemInMainHand()); + if (type == null) { + Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + stateManager.setState(player, null); + return true; + } + String groupName = null; if (args.length == 0) { - groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); + groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == null) { Utility.sendAndLog(player, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); @@ -40,17 +52,10 @@ public boolean execute(CommandSender sender, String[] args) { } else { groupName = args[0]; } - PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(player, ChatColor.RED, "The group" + groupName + "does not exist."); - stateManager.setState(player, null); - return true; - } - ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager() - .getByItemStack(player.getInventory().getItemInMainHand()); - if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); return true; } @@ -61,7 +66,6 @@ public boolean execute(CommandSender sender, String[] args) { stateManager.setState(player, null); return true; } - AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof FortificationState) { FortificationState fortState = (FortificationState) currentState; if (fortState.getGroup() == group && fortState.getType() == type) { diff --git a/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java b/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java new file mode 100644 index 00000000..24522221 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java @@ -0,0 +1,37 @@ +package vg.civcraft.mc.citadel.command; + +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; +import vg.civcraft.mc.citadel.playerstate.PatchState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; + +@CivCommand(id = "ctp") +public class PatchMode extends StandaloneCommand{ + + @Override + public boolean execute(CommandSender sender, String[] args) { + Player player = (Player) sender; + PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); + AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); + if (currentState instanceof PatchState) { + stateManager.setState(player, null); + } else { + stateManager.setState(player, new PatchState(player, currentState.isBypassEnabled())); + } + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + return new LinkedList<>(); + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java index b581b220..aa76916f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -58,7 +58,7 @@ public int compare(ReinforcementType o1, ReinforcementType o2) { clicks.add(click); } MultiPageView pageView = new MultiPageView((Player) sender, clicks, - org.bukkit.ChatColor.GOLD + "Reinforcements", true); + ChatColor.BLUE + "Reinforcements", true); pageView.showScreen(); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reload.java b/src/main/java/vg/civcraft/mc/citadel/command/Reload.java new file mode 100644 index 00000000..41836fbc --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reload.java @@ -0,0 +1,28 @@ +package vg.civcraft.mc.citadel.command; + +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; + +@CivCommand(id = "citadelreload") +public class Reload extends StandaloneCommand { + + @Override + public boolean execute(CommandSender sender, String[] args) { + Citadel.getInstance().reload(); + sender.sendMessage(ChatColor.GREEN + "Reloaded Citadel"); + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + return new LinkedList<>(); + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index b620d735..cfc269a3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -5,19 +5,12 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.sql.Time; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; import java.util.logging.Logger; -import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.model.ChunkCache; @@ -26,7 +19,6 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; public class CitadelReinforcementData { @@ -69,7 +61,8 @@ public int getOrCreateWorldID(World world) { Statement.RETURN_GENERATED_KEYS);) { insertWorld.setString(1, world.getUID().toString()); insertWorld.setString(2, world.getName()); - try (ResultSet rs = insertWorld.executeQuery()) { + insertWorld.execute(); + try (ResultSet rs = insertWorld.getGeneratedKeys()) { if (!rs.next()) { logger.info("Failed to insert world"); return -1; @@ -135,165 +128,9 @@ public ChunkCache loadReinforcements(ChunkCoord coords, int worldID) { } private void registerMigrations() { - db.registerMigration(7, false, - "create table if not exists reinforcement_id(" + "rein_id int not null auto_increment," - + "x int not null," + "y int not null," + "z int not null," + "chunk_id varchar(255)," - + "world varchar (255) not null," + "primary key rein_id_key (rein_id)," - + "unique key x_y_z_world(x,y,z,world));-- Your mother is a whore and sleeps with banjos", - // I like turtles mother fucker. Never program because then you get turtles. - "insert into reinforcement_id (x, y, z, chunk_id, world) select x, y, z, chunk_id, world from reinforcement;", // populate - // that - // bitch. - "alter table reinforcement add rein_id int not null, drop chunk_id;", - "update reinforcement r inner join reinforcement_id ri on " - + "ri.x = r.x and ri.y = r.y and ri.z = r.z and ri.world = r.world " - + "set r.rein_id = ri.rein_id", - "alter table reinforcement DROP PRIMARY KEY, " + "add primary key rein_id_key(rein_id), " + "drop x," - + "drop y," + "drop z," + "drop world;", - "alter table reinforcement_id add index `chunk_id_index` (chunk_id);"); - db.registerMigration(8, false, - "alter table reinforcement_id drop primary key," + " add primary key (rein_id, x, y, z, world);"); - db.registerMigration(9, false, "alter table reinforcement add acid_time int not null;", - "update reinforcement set acid_time = maturation_time;"); // Might take a minute. - db.registerMigration(10, false, "drop procedure if exists insertReinID;", - "create definer=current_user procedure insertReinID(" + "in x int," + "in y int," + "in z int," - + "in chunk_id varchar(255)," + "in world varchar(255)" + ") sql security invoker begin " - + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" + "end;", - "drop procedure if exists insertCustomReinID;", - "create definer=current_user procedure insertCustomReinID(" + "in rein_id int," + "in x int," - + "in y int," + "in z int," + "in chunk_id varchar(255)," + "in world varchar(255)" - + ") sql security invoker begin " - + "insert into reinforcement_id(rein_id, x, y, z, chunk_id, world) values (rein_id, x, y, z, chunk_id, world);" - + "select LAST_INSERT_ID() as id;" + "end;"); - db.registerMigration(11, false, "drop procedure if exists insertRein;", - "create definer=current_user procedure insertRein(" + "in x int," + "in y int," + "in z int," - + "in chunk_id varchar(255)," + "in world varchar(255)," + "in material_id int," - + "in durability varchar(10)," + "in insecure tinyint(1)," + "in group_id int," - + "in maturation_time int," + "in lore varchar(255)," + "in acid_time int," - + "in rein_type varchar(30)" + ") sql security invoker begin " - + "insert into reinforcement_id(x, y, z, chunk_id, world) values (x, y, z, chunk_id, world);" - + "insert into reinforcement (" - + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, rein_id, acid_time) VALUES (" - + "material_id, durability, insecure, group_id, maturation_time, " - + "(SELECT rt.rein_type_id FROM reinforcement_type rt where rt.rein_type = rein_type LIMIT 1), " - + "lore, (select LAST_INSERT_ID()), acid_time);" + "end;"); - db.registerMigration(12, false, - "CREATE TABLE reinforcement_temp (" + "rein_id int not null auto_increment," + "x int not null," - + "y int not null," + "z int not null," + "chunk_x int not null," + "chunk_z int not null," - + "world varchar(255) not null," + "material_id int not null," - + "durability varchar(10) not null," + "insecure tinyint(1) not null," - + "group_id int not null," + "maturation_time int not null," + "rein_type_id int not null," - + "lore varchar(255)," + "acid_time int not null," + "primary key rid (rein_id)," - + "unique index realcoord (x,y,z,world)," + "index chunkcoord(chunk_x, chunk_z, world)" + ");", - "INSERT IGNORE INTO reinforcement_temp SELECT a.rein_id, x, y, z, floor(x/16), floor(z/16), world, " - + "material_id, durability, insecure, group_id, maturation_time, rein_type_id, lore, acid_time " - + "FROM reinforcement_id a JOIN reinforcement b ON a.rein_id = b.rein_id;", - "RENAME TABLE reinforcement_id TO deprecated_reinforcement_id;", - "RENAME TABLE reinforcement TO deprecated_reinforcement;", - "RENAME TABLE reinforcement_temp TO reinforcement;", "DROP PROCEDURE IF EXISTS insertReinID;", - "DROP PROCEDURE IF EXISTS insertCustomReinID;", "DROP PROCEDURE IF EXISTS insertRein;"); - db.registerMigration(13, false, new Callable() { - - @Override - public Boolean call() throws SQLException { - logger.info("Upgrading to Citadel 4.0. This may take a while."); - int failedUpdates = 0; - int successfulUpdates = 0; - Map worldMapping = new HashMap<>(); - for (World world : Bukkit.getWorlds()) { - int id = getOrCreateWorldID(world); - if (id == -1) { - return false; - } - worldMapping.put(world.getName(), id); - - } - try (Connection connection = db.getConnection(); - PreparedStatement getRein = connection.prepareStatement( - "select rein_id, x, y, z, chunk_x, chunk_z, world, material_id, durability, insecure, group_id, " - + "lore, acid_time from reinforcement;"); - ResultSet rs = getRein.executeQuery()) { - while (rs.next()) { - int id = rs.getInt(1); - int x = rs.getInt(2); - int y = rs.getInt(3); - int z = rs.getInt(4); - int chunk_x = rs.getInt(5); - int chunk_z = rs.getInt(6); - String worldName = rs.getString(7); - int materialID = rs.getInt(8); - String durability = rs.getString(9); - double health = Double.parseDouble(durability); - boolean insecure = rs.getBoolean(10); - int groupId = rs.getInt(11); - String lore = rs.getString(12); - int acidTime = rs.getInt(13); - long msAcidTime = acidTime; - // old unit was minutes since unix epoch - msAcidTime *= 60000; - // some reins don't have a time stamp, gonna have to guess for those - if (msAcidTime == 0) { - msAcidTime = System.currentTimeMillis(); - } - @SuppressWarnings("deprecation") - Material mat = Material.getMaterial(materialID); - if (mat == null) { - failedUpdates++; - continue; - } - ItemStack is = new ItemStack(mat); - if (lore != null) { - ISUtils.addLore(is, lore); - } - ReinforcementType type = typeMan.getByItemStack(is); - if (type == null) { - failedUpdates++; - continue; - } - int typeID = type.getID(); - Integer worldID = worldMapping.get(worldName); - if (worldID == null) { - failedUpdates++; - continue; - } - try (Connection insertConn = db.getConnection(); - PreparedStatement insertRein = insertConn.prepareStatement( - "insert into reinforcements (id,x,y,z,chunk_x,chunk_z,world_id,type_id," - + "creation_time,health,group_id,insecure) values(?,?,?,?,?,?,?,?,?,?,?,?);");) { - insertRein.setInt(1, id); - insertRein.setInt(2, x); - insertRein.setInt(3, y); - insertRein.setInt(4, z); - insertRein.setInt(5, chunk_x); - insertRein.setInt(6, chunk_z); - insertRein.setInt(7, worldID); - insertRein.setInt(8, typeID); - insertRein.setTime(9, new Time(msAcidTime)); - insertRein.setDouble(10, health); - insertRein.setInt(11, groupId); - insertRein.setBoolean(12, insecure); - insertRein.execute(); - } - try (Connection deleteConn = db.getConnection(); - PreparedStatement deleteRein = deleteConn - .prepareStatement("delete from reinforcement where id = ?;");) { - deleteRein.setInt(1, id); - deleteRein.execute(); - } - successfulUpdates++; - } - } - logger.info("Completed Citadel 4.0 update. Successfull: " + successfulUpdates + ", Failed: " - + failedUpdates); - if (failedUpdates > 0) { - logger.severe("Some of your old data could not be transfered, it was left intact in the old table. " - + "Contact Citadel developers if you do not know how to fix this yourself"); - } - return true; - } - }, "create table reinforcement_worlds (id int not null autoincrement, uuid char(36) not null unique, name text not null);", - "create table reinforcements (id int not null auto_increment, x int not null, y int not null, z int not null, " + db.registerMigration(13, false, "create table reinforcement_worlds (id int not null auto_increment primary key, uuid char(36) not null, " + + "name text not null, constraint uniqueUuid unique(uuid));", + "create table reinforcements (id int not null auto_increment primary key, x int not null, y int not null, z int not null, " + "chunk_x int not null, chunk_z int not null, world_id int not null references reinforcement_worlds(id), " + "type_id int not null, creation_time timestamp not null default now(), health double not null, " + "group_id int not null, insecure boolean not null default false, index reinChunkLookUp(chunk_x, chunk_z, world_id)," diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index aae97ae6..def3b78e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -42,6 +42,11 @@ public class BlockListener implements Listener { public void blockBreakEvent(BlockBreakEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void blockPlaceEvent(BlockPlaceEvent event) { + Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBlockPlace(event); + } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void blockBurn(BlockBurnEvent bbe) { @@ -89,7 +94,7 @@ public void blockPhysEvent(BlockPhysicsEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void comparatorPlaceCheck(BlockPlaceEvent event) { // We only care if they are placing a comparator - if (event.getBlockPlaced().getType() != Material.REDSTONE_COMPARATOR_OFF) { + if (event.getBlockPlaced().getType() != Material.COMPARATOR) { return; } Comparator comparator = (Comparator) event.getBlockPlaced().getState().getData(); @@ -118,10 +123,7 @@ public void interact(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; } - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(pie.getClickedBlock()); - if (rein == null) { - return; - } + Citadel.getInstance().getStateManager().getState(pie.getPlayer()).handleInteractBlock(pie); } // prevent placing water inside of reinforced blocks @@ -208,10 +210,15 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { // remove reinforced air @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void removeReinforcedAir(BlockPlaceEvent e) { + if (e.getBlockReplacedState() == null) { + return; + } if (e.getBlockReplacedState().getType() != Material.AIR) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); - rein.setHealth(-1); + if (rein != null) { + rein.setHealth(-1); + } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java new file mode 100644 index 00000000..1cc3b713 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java @@ -0,0 +1,35 @@ +package vg.civcraft.mc.citadel.listener; + +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkUnloadEvent; + +import vg.civcraft.mc.citadel.Citadel; + +public class ChunkLoadListener implements Listener { + + public ChunkLoadListener() { + for(World world : Bukkit.getWorlds()) { + for(Chunk chunk : world.getLoadedChunks()) { + Citadel.getInstance().getReinforcementManager().loadChunkData(chunk); + } + } + } + + @EventHandler + public void chunkLoad(ChunkLoadEvent e) { + Citadel.getInstance().getReinforcementManager().loadChunkData(e.getChunk()); + } + + @EventHandler + public void chunkUnload(ChunkUnloadEvent e) { + Citadel.getInstance().getReinforcementManager().unloadChunkData(e.getChunk()); + } + + + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 230f3a93..9a75ff17 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -38,8 +38,10 @@ public class EntityListener implements Listener { public void breakDoor(EntityBreakDoorEvent ebde) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ebde.getBlock()); if (rein != null) { - ebde.setCancelled(true); - ReinforcementLogic.damageReinforcement(rein, 1.0); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + if (!rein.isBroken()) { + ebde.setCancelled(true); + } } } @@ -47,8 +49,10 @@ public void breakDoor(EntityBreakDoorEvent ebde) { public void changeBlock(EntityChangeBlockEvent ecbe) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ecbe.getBlock()); if (rein != null) { - ecbe.setCancelled(true); - ReinforcementLogic.damageReinforcement(rein, 1.0); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + if (!rein.isBroken()) { + ecbe.setCancelled(true); + } } } @@ -60,8 +64,8 @@ public void explode(EntityExplodeEvent eee) { while (iterator.hasNext()) { Block block = iterator.next(); Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); - if (rein != null) { - rein.setHealth(rein.getHealth() - 1); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + if (!rein.isBroken()) { iterator.remove(); } } @@ -82,7 +86,6 @@ private List getGolemBlocks(EntityType type, Block base) { } base = base.getRelative(BlockFace.UP); blocks.add(base); - return blocks; } @@ -90,6 +93,7 @@ private List getGolemBlocks(EntityType type, Block base) { public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); + new BukkitRunnable() { @Override @@ -98,7 +102,7 @@ public void run() { for (String groupName : db.getGroupNames(uuid)) { if (NameAPI.getGroupManager().hasAccess(groupName, uuid, PermissionType.getPermission("REINFORCE"))) { - db.updateTimestamp(groupName); + GroupManager.getGroup(groupName).updateActivityTimeStamp(); } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index d8e0b640..e82dc3de 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel.listener; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -7,9 +8,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Switch; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -68,6 +69,7 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl public RedstoneListener(double maxRedstoneDistance) { this.maxRedstoneDistance = maxRedstoneDistance; + this.authorizations = new HashMap<>(); Bukkit.getScheduler().scheduleSyncRepeatingTask(Citadel.getInstance(), () -> { authorizations.clear(); }, 1L, 1L); @@ -100,8 +102,7 @@ public void pressButton(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } - if (e.getClickedBlock().getType() != Material.STONE_BUTTON - && e.getClickedBlock().getType() != Material.WOOD_BUTTON) { + if (!(e.getClickedBlock().getBlockData() instanceof Switch)) { return; } Button button = (Button) (e.getClickedBlock().getState().getData()); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java index 01ba3b5e..10d1e2d1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java @@ -48,6 +48,7 @@ public boolean equals(Object o) { return coords.y == y && coords.x == x && coords.z == z; } } + private final ChunkCoord chunkPair; private Map reinforcements; private List deletedReinforcements; @@ -86,9 +87,11 @@ public Collection getAll() { */ public Collection getAllAndCleanUp() { List reins = new ArrayList<>(); - reins.addAll(deletedReinforcements); + if (deletedReinforcements != null) { + reins.addAll(deletedReinforcements); + deletedReinforcements.clear(); + } reins.addAll(reinforcements.values()); - deletedReinforcements.clear(); return reins; } @@ -112,6 +115,9 @@ public void insertReinforcement(Reinforcement rein) { } rein.setOwningCache(this); reinforcements.put(key, rein); + if (rein.isDirty) { + this.isDirty = true; + } } public boolean isDirty() { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java index fb91abcf..2a0efe06 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java @@ -11,6 +11,7 @@ import org.bukkit.World; import org.bukkit.block.Block; +import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.database.CitadelReinforcementData; public class GlobalReinforcementManager { @@ -90,7 +91,7 @@ public void insertReinforcement(Reinforcement rein) { if (!registerWorld(rein.getLocation().getWorld())) { throw new IllegalStateException("Failed to register world"); } - worldToManager.get(rein.getLocation().getWorld().getUID()); + worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); } worldManager.insertReinforcement(rein); } @@ -151,4 +152,22 @@ public boolean setup() { } return true; } + + public void loadChunkData(Chunk chunk) { + Utility.debugLog("Loading reinforcement data for chunk at " + chunk.toString()); + WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); + if (worldManager == null) { + throw new IllegalStateException("No world manager for chunk at " + chunk.toString()); + } + worldManager.loadChunkData(chunk); + } + + public void unloadChunkData(Chunk chunk) { + Utility.debugLog("Unloading reinforcement data for chunk at " + chunk.toString()); + WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); + if (worldManager == null) { + throw new IllegalStateException("No world manager for chunk at " + chunk.toString()); + } + worldManager.unloadChunkData(chunk); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 0dd17e65..138a8e89 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel.model; +import java.util.Random; import java.util.UUID; import org.bukkit.Location; @@ -14,6 +15,8 @@ public class Reinforcement { + private static Random rng = new Random(); + private final long creationTime; private ReinforcementType type; private final Location loc; @@ -208,4 +211,18 @@ public void toggleInsecure() { insecure = !insecure; setDirty(true); } + + /** + * Does a randomness check based on current reinforcement health and + * reinforcement type to decide whether the reinforcement item should be + * returned + * + * @return Whether to return the reinforcement item or not + */ + public boolean rollForItemReturn() { + double baseChance = type.getReturnChance(); + double relativeHealth = health / type.getHealth(); + baseChance *= relativeHealth; + return rng.nextDouble() <= baseChance; + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java index b03db1d9..a3fb6584 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java @@ -28,12 +28,16 @@ public void onRemoval(RemovalNotification removal) { } } }).build(new CacheLoader() { + @Override public ChunkCache load(ChunkCoord loc) throws Exception { - if (loc == null) { - throw new IllegalArgumentException("Can not load reinforcements for null location"); - } return db.loadReinforcements(loc, worldID); } + /* probably not needed + @Override + public ListenableFuture reload(ChunkCoord loc, ChunkCache oldValue) throws Exception { + // this will only be called in super rare race conditions + return Futures.immediateFuture(oldValue); + } */ }); } @@ -69,7 +73,7 @@ public Reinforcement getReinforcement(Location loc) { "You can not check reinforcements for unloaded chunks. Load the chunk first"); } Reinforcement rein = cache.getReinforcement(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if (rein.isBroken()) { + if (rein == null || rein.isBroken()) { return null; } return rein; @@ -98,6 +102,7 @@ public void insertReinforcement(Reinforcement reinforcement) { */ public void invalidateAllReinforcements() { reinforcements.invalidateAll(); + reinforcements.cleanUp(); } /** @@ -118,4 +123,12 @@ public void removeReinforcement(Reinforcement reinforcement) { } cache.removeReinforcement(reinforcement); } + + void loadChunkData(Chunk chunk) { + reinforcements.refresh(ChunkCoord.forChunk(chunk)); + } + + void unloadChunkData(Chunk chunk) { + reinforcements.invalidate(ChunkCoord.forChunk(chunk)); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 5a39528b..e0991a8c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -1,13 +1,16 @@ package vg.civcraft.mc.citadel.playerstate; +import java.util.HashMap; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; @@ -15,6 +18,7 @@ import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; public abstract class AbstractPlayerState { @@ -46,6 +50,9 @@ public void handleBreakBlock(BlockBreakEvent e) { if (bypassEvent.isCancelled()) { e.setCancelled(true); } + if (rein.rollForItemReturn()) { + giveReinforcement(e.getBlock().getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); + } return; } if (Utility.isPlant(e.getBlock())) { @@ -61,7 +68,7 @@ public void handleBreakBlock(BlockBreakEvent e) { "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); } e.setCancelled(true); - double damage = ReinforcementLogic.getDamageApplied(e.getPlayer(), rein); + double damage = ReinforcementLogic.getDamageApplied(rein); ReinforcementDamageEvent dre = new ReinforcementDamageEvent(e.getPlayer(), rein, damage); Bukkit.getPluginManager().callEvent(dre); if (dre.isCancelled()) { @@ -77,4 +84,15 @@ public boolean isBypassEnabled() { return bypass; } + public void toggleBypass() { + bypass = !bypass; + } + + protected static void giveReinforcement(Location location, Player p, ReinforcementType type) { + HashMap notAdded = p.getInventory().addItem(type.getItem().clone()); + if (!notAdded.isEmpty()) { + Utility.dropItemAtLocation(location, type.getItem().clone()); + } + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java new file mode 100644 index 00000000..7b2876cd --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -0,0 +1,95 @@ +package vg.civcraft.mc.citadel.playerstate; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.namelayer.group.Group; + +public class AdvancedFortificationState extends AbstractPlayerState { + + private Map setups; + + public AdvancedFortificationState(Player p, boolean bypass) { + super(p, bypass); + setups = new HashMap(); + } + + @Override + public String getName() { + return "Advanced fortification mode"; + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + ItemStack placed = e.getItemInHand(); + Player player = e.getPlayer(); + if (placed == null) { + // no idea if this can even happen, but let's be safe + Utility.sendAndLog(player, ChatColor.RED, "No block found in your hand?"); + return; + } + // check if we have a setup for this block, weneed a copy for lookup so we can + // set amount to 1 + ItemStack lookUpCopy = placed.clone(); + lookUpCopy.setAmount(1); + ReinforcingSetup setup = setups.get(lookUpCopy); + if (setup == null) { + Utility.sendAndLog(player, ChatColor.RED, + "No setup configured for this block type, no reinforcement was applied"); + return; + } + boolean hadError = Utility.attemptReinforcementCreation(e.getBlock(), setup.type, setup.group, e.getPlayer()); + if (hadError) { + e.setCancelled(true); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + } + } + + public void addSetup(ItemStack forBlock, ReinforcementType type, Group group) { + ItemStack copy = forBlock.clone(); + copy.setAmount(1); + ReinforcingSetup existing = setups.get(copy); + setups.put(copy, new ReinforcingSetup(type, group)); + Player player = Bukkit.getPlayer(uuid); + if (player != null) { + if (existing != null) { + Utility.sendAndLog(player, ChatColor.GOLD, + "Replaced existing setup with " + ChatColor.AQUA + existing.type.getName() + ChatColor.GOLD + + " on " + ChatColor.LIGHT_PURPLE + existing.group.getName() + ChatColor.GOLD + "for " + + copy.getType() + " with " + ChatColor.AQUA + type.getName() + ChatColor.GOLD + " on " + + ChatColor.LIGHT_PURPLE + group.getName()); + } else { + Utility.sendAndLog(player, ChatColor.GOLD, copy.getType() + " will be reinforced with " + ChatColor.AQUA + + type.getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + group.getName()); + } + } + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + + } + + private class ReinforcingSetup { + + ReinforcementType type; + Group group; + + ReinforcingSetup(ReinforcementType type, Group group) { + this.type = type; + this.group = group; + } + + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 1c1b9d35..c2c8fca2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -6,14 +6,9 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; -import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; public class FortificationState extends AbstractPlayerState { @@ -31,7 +26,8 @@ public Group getGroup() { } public String getName() { - return "Fortifying mode with " + type.getName() + " on " + group.getName(); + return "Fortifying mode with " + ChatColor.AQUA + type.getName() + ChatColor.YELLOW + " on " + + ChatColor.LIGHT_PURPLE + group.getName(); } public ReinforcementType getType() { @@ -40,57 +36,11 @@ public ReinforcementType getType() { @Override public void handleBlockPlace(BlockPlaceEvent e) { - // check if group still exists - if (!group.isValid()) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, - "The group " + group.getName() + " seems to have been deleted in the mean time"); - Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); - return; - } - // check if player still has permission - if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm))) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, - "You seem to have lost permission to reinforce on " + group.getName()); - Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); - return; - } - // check if reinforcement already exists - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); - if (rein != null) { - // something like a slab, we just ignore this - return; - } - Player player = e.getPlayer(); - // check if reinforcement can reinforce that block - if (!type.canBeReinforced(e.getBlock().getType())) { + boolean hadError = Utility.attemptReinforcementCreation(e.getBlock(), type, group, e.getPlayer()); + if (hadError) { e.setCancelled(true); - Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + e.getBlock().getType()); - return; - } - ItemMap playerItems = new ItemMap(player.getInventory()); - // check inventory - int available = playerItems.getAmount(type.getItem()); - if (available == 0) { - Citadel.getInstance().getStateManager().setState(player, null); - e.setCancelled(true); - Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); - return; - } - // remove from inventory - ItemMap toRemove = new ItemMap(type.getItem()); - if (toRemove.removeSafelyFrom(player.getInventory())) { - Utility.sendAndLog(player, ChatColor.RED, - "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); - Citadel.getInstance().getStateManager().setState(player, null); - return; - } - // create reinforcement - if (Citadel.getInstance().getConfigManager().logCreation()) { - Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() - + " for " + e.getBlock().getType().toString() + " at " + e.getBlock().getLocation().toString()); + Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); } - ReinforcementLogic.createReinforcement(e.getBlock(), type, group); } @Override diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index 1201ddab..79d851ae 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -21,16 +22,30 @@ public class InformationState extends AbstractPlayerState { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); - private static String formatHealth(Reinforcement rein) { - return String.format("%s%% (%s/%s)", commaFormat.format(rein.getHealth() / rein.getType().getHealth() * 100), - roundingFormat.format(rein.getHealth()), rein.getType().getHealth()); + public static String formatHealth(Reinforcement rein) { + double broken = rein.getHealth() / rein.getType().getHealth(); + ChatColor color; + if (broken >= 1.0) { + color = ChatColor.GREEN; + } else if (broken >= 0.75) { + color = ChatColor.DARK_GREEN; + } else if (broken >= 0.5) { + color = ChatColor.YELLOW; + } else if (broken >= 0.25) { + color = ChatColor.RED; + } else { + color = ChatColor.DARK_RED; + } + return String.format("%s%s%% (%s/%s)", color.toString(), + commaFormat.format(rein.getHealth() / rein.getType().getHealth() * 100), + roundingFormat.format(rein.getHealth()), roundingFormat.format(rein.getType().getHealth())); } private static String formatProgress(long start, long timeNeeded, String text) { long timeTaken = System.currentTimeMillis() - start; - timeTaken = Math.max(timeTaken, timeNeeded); + timeTaken = Math.min(timeTaken, timeNeeded); double progress = Math.min(1.0, ((double) timeTaken) / ((double) timeNeeded)); - return String.format("%s%% %s %s left", commaFormat.format(progress * 100), text, + return String.format("%s%% %s %s", commaFormat.format(progress * 100), text, TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); } @@ -48,8 +63,12 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { + if (e.getAction() != Action.RIGHT_CLICK_BLOCK && e.getAction() != Action.LEFT_CLICK_BLOCK) { + return; + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); if (rein == null) { + Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); return; } Player player = e.getPlayer(); @@ -57,12 +76,14 @@ public void handleInteractBlock(PlayerInteractEvent e) { e.setCancelled(true); } if (!rein.hasPermission(player, Citadel.infoPerm)) { - String msg = String.format("Reinforced %s with %s", formatHealth(rein), rein.getType().getName()); + String msg = String.format("Reinforced at %s%s health with %s%s", formatHealth(rein), ChatColor.RED, + ChatColor.AQUA, rein.getType().getName()); Utility.sendAndLog(player, ChatColor.RED, msg); return; } StringBuilder sb = new StringBuilder(); - sb.append(String.format("Reinforced %s with %s on %s, ", formatHealth(rein), rein.getType().getName(), + sb.append(String.format("Reinforced at %s%s health with %s%s %son %s%s ", formatHealth(rein), ChatColor.GREEN, + ChatColor.AQUA, rein.getType().getName(), ChatColor.GREEN, ChatColor.LIGHT_PURPLE, rein.getGroup().getName())); if (!rein.isMature()) { sb.append(ChatColor.GOLD); @@ -83,7 +104,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); } } - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); + Utility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java new file mode 100644 index 00000000..b5a810f4 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -0,0 +1,76 @@ +package vg.civcraft.mc.citadel.playerstate; + +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; + +public class PatchState extends AbstractPlayerState { + + public PatchState(Player p, boolean bypass) { + super(p, bypass); + } + + @Override + public String getName() { + return "Patch mode"; + } + + @Override + public void handleBlockPlace(BlockPlaceEvent e) { + + } + + @Override + public void handleInteractBlock(PlayerInteractEvent e) { + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + Player player = e.getPlayer(); + if (rein == null) { + Utility.sendAndLog(player, ChatColor.RED, "This block is not reinforced"); + return; + } + if (!rein.hasPermission(player, Citadel.repairPerm)) { + Utility.sendAndLog(player, ChatColor.RED, + "You do not have permission to repair reinforcements on this group"); + return; + } + if (rein.getHealth() >= rein.getType().getHealth()) { + if (rein.hasPermission(player, Citadel.infoPerm)) { + Utility.sendAndLog(player, ChatColor.GOLD, + "Reinforcement is already at " + InformationState.formatHealth(rein) + ChatColor.GOLD + + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " + + ChatColor.LIGHT_PURPLE + rein.getGroup().getName()); + } else { + Utility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + + InformationState.formatHealth(rein) + ChatColor.GOLD + " health"); + } + return; + } + ItemMap playerMap = new ItemMap(player.getInventory()); + if (playerMap.getAmount(rein.getType().getItem()) <= 0) { + Utility.sendAndLog(player, ChatColor.RED, "You don't have the item required to repair " + ChatColor.AQUA + + rein.getType().getName() + ChatColor.GOLD + " reinforcements"); + return; + } + if (!rein.rollForItemReturn()) { + if (!Utility.consumeReinforcementItems(player, rein.getType())) { + return; + } + } + if (Citadel.getInstance().getConfigManager().logCreation()) { + Citadel.getInstance().getLogger() + .info(player.getName() + " recreated reinforcement with " + rein.getType().getName() + " for " + + e.getClickedBlock().getType().toString() + " at " + + e.getClickedBlock().getLocation().toString() + " via repair"); + } + rein.setHealth(-1); + ReinforcementLogic.createReinforcement(rein.getLocation().getBlock(), rein.getType(), rein.getGroup()); + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index b746eae1..a3191855 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -4,8 +4,11 @@ import java.util.TreeMap; import java.util.UUID; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import vg.civcraft.mc.citadel.Utility; + public class PlayerStateManager { private Map playerStateMap; @@ -30,7 +33,7 @@ public void setState(Player player, AbstractPlayerState state) { if (player == null) { throw new IllegalArgumentException("Can not set state for null player"); } - AbstractPlayerState existingState = playerStateMap.get(player.getUniqueId()); + AbstractPlayerState existingState = getState(player); // null state is allowed, it just resets the state if (state == null) { if (existingState != null) { @@ -38,12 +41,10 @@ public void setState(Player player, AbstractPlayerState state) { } else { state = new NormalState(player, true); } - playerStateMap.put(player.getUniqueId(), state); - player.sendMessage("Switched Citadel mode to " + state.getName()); - } else { - playerStateMap.put(player.getUniqueId(), state); - player.sendMessage("Switched Citadel mode to " + state.getName() + " from " + existingState.getName()); } + playerStateMap.put(player.getUniqueId(), state); + Utility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() + + ChatColor.GOLD + " from " + ChatColor.YELLOW + existingState.getName()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 016d2555..9ea6cc1a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -32,7 +32,7 @@ public Group getGroup() { } public String getName() { - return "Reinforcing mode on " + group.getName(); + return "Reinforcing mode on " + ChatColor.LIGHT_PURPLE + group.getName(); } @Override @@ -85,16 +85,19 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } } - // check inventory for reinforcement item - ItemMap toConsume = new ItemMap(type.getItem()); - if (!toConsume.isContainedIn(player.getInventory())) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); - return; - } - // consume item from inventory - if (!toConsume.removeSafelyFrom(player.getInventory())) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "Failed to remove reinforcement item from your inventory"); - return; + if (rein == null || rein.getType() != type) { + // check inventory for reinforcement item + ItemMap toConsume = new ItemMap(type.getItem()); + if (!toConsume.isContainedIn(player.getInventory())) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); + return; + } + // consume item from inventory + if (!toConsume.removeSafelyFrom(player.getInventory())) { + Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + "Failed to remove reinforcement item from your inventory"); + return; + } } if (rein == null) { @@ -124,14 +127,19 @@ public void handleInteractBlock(PlayerInteractEvent e) { ReinforcementChangeTypeEvent rcte = new ReinforcementChangeTypeEvent(player, rein, type); Bukkit.getPluginManager().callEvent(rcte); if (!rcte.isCancelled()) { - rein.setType(type); + giveReinforcement(rein.getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); + rein.setHealth(-1); + ReinforcementLogic.createReinforcement(rein.getLocation().getBlock(), type, group); Utility.sendAndLog(player, ChatColor.GREEN, "Updated reinforcement to " + rein.getType().getName() + " on " + group.getName()); } else if (changedGroup) { - Utility.sendAndLog(player, ChatColor.GREEN, "Updated group to " + group.getName()); + Utility.sendAndLog(player, ChatColor.GREEN, + "Updated group to " + ChatColor.LIGHT_PURPLE + group.getName()); } + } else if (changedGroup) { + Utility.sendAndLog(player, ChatColor.GREEN, + "Updated group to " + ChatColor.LIGHT_PURPLE + group.getName()); } } } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 5bd4f8e6..c8101020 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -16,16 +16,22 @@ public class ReinforcementType { private long acidTime; private double scale; private long gracePeriod; - private ReinforcementEffect effect; + private ReinforcementEffect creationEffect; + private ReinforcementEffect damageEffect; + private ReinforcementEffect destructionEffect; private Set allowedReinforceables; private Set disallowedReinforceables; private Set globalBlackList; private int id; private String name; + private long decayTimer; + private double decayMultiplier; public ReinforcementType(double health, double returnChance, ItemStack item, long maturationTime, long acidTime, - double scale, long gracePeriod, ReinforcementEffect effect, Collection allowsReinforceables, - Collection disallowedReinforceables, int id, String name, Collection globalBlackList) { + double scale, long gracePeriod, ReinforcementEffect creationEffect, ReinforcementEffect damageEffect, + ReinforcementEffect destructionEffect, Collection allowsReinforceables, + Collection disallowedReinforceables, int id, String name, Collection globalBlackList, + long decayTimer, double decayMultiplier) { this.health = health; this.name = name; this.returnChance = returnChance; @@ -33,7 +39,9 @@ public ReinforcementType(double health, double returnChance, ItemStack item, lon this.maturationTime = maturationTime; this.acidTime = acidTime; this.scale = scale; - this.effect = effect; + this.creationEffect = creationEffect; + this.damageEffect = damageEffect; + this.destructionEffect = destructionEffect; this.gracePeriod = gracePeriod; if (allowsReinforceables != null) { this.allowedReinforceables = new TreeSet<>(allowsReinforceables); @@ -48,6 +56,8 @@ public ReinforcementType(double health, double returnChance, ItemStack item, lon this.globalBlackList.addAll(globalBlackList); } this.id = id; + this.decayMultiplier = decayMultiplier; + this.decayTimer = decayTimer; } public boolean canBeReinforced(Material mat) { @@ -126,10 +136,26 @@ public String getName() { /** * @return Get the effect to spawn around this type of reinforcement when it is - * created or damaged. + * created */ - public ReinforcementEffect getReinforcementEffect() { - return effect; + public ReinforcementEffect getCreationEffect() { + return creationEffect; + } + + /** + * @return Get the effect to spawn around this type of reinforcement when it is + * damaged + */ + public ReinforcementEffect getDamageEffect() { + return damageEffect; + } + + /** + * @return Get the effect to spawn around this type of reinforcement when it is + * destroyed + */ + public ReinforcementEffect getDestructionEffect() { + return destructionEffect; } /** @@ -139,4 +165,16 @@ public ReinforcementEffect getReinforcementEffect() { public double getReturnChance() { return returnChance; } + + public double getDecayDamageMultipler(long since) { + if (decayTimer <= 0 || decayMultiplier == 1) { + return 1; + } + long timePassed = System.currentTimeMillis() - since; + if (timePassed <= decayTimer) { + return 1; + } + double timeExponent = ((double) timePassed / (double) decayTimer); + return Math.pow(decayMultiplier, timeExponent); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5077882f..6eb4a878 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,104 +1,72 @@ -# material is the bukkit name for the material. -# requirements is the amount of the material needed to create a reinforcement. -# return is the amount of material to return. -# percent_chance is the chance to return the block. Scales with damage. -# scale_amount is, if maturation is enabled, the amount extra to damage a block if it is not fully matured. The forumla for calculating the extra damage is 1/(1-((time left of maturation) / (default amount of time for maturation))) * scale. So if a block has 5 minutes left of maturation on a 10 minute default period with a scale of 3 we do 1/(5 / 10) * 3 = 6 damage. Setting scale amount to 0 disables this function. -# effect allows to add particles around a reinforced block when it is created or damaged. -# type: The bukkit name of the particle. -# id: the item/block/data id for the effect -# data: the data value of the block/item for the effect -# offsetX: the amount to be randomly offset by in the X axis -# offsetY: the amount to be randomly offset by in the Y axis -# offsetZ: the amount to be randomly offset by in the Z axis -# speed: the speed of the particles -# particleCount: the amount of particle to display. -# view_distance: the distance from which players will be able to see the effect. default is 16. -# internal_logging logs Citadel internal status messages, config notices, and the like. Strongly recommend it be on. -internal_logging: true -# command_logging logs the _response_ that Citadel sends to the player; very useful. -command_logging: true -# break_logging logs all reinforcement breaks that are done in /ctb mode (e.g. friendly breaks). -break_logging: false -# hostile_logging logs all reinforcement breaks that are done without bypass (e.g. hostile breaks). -hostile_logging: true -# damage_logging logs all reinforcement break attempts. Leave off unless you need it. -damage_logging: false -# reinf_logging logs all reinforcement creation and also logs when group lookups fail. Can get super spammy. -reinf_logging: false -# All logging states can be controlled using /ctsl +#Log when a player forcefully breaks reinforcements? +logHostileBreaks: true + +#Log when a player bypasses friendly reinforcements? +logFriendlyBreaks: true + +#Log every time damage is done to a reinforcement? Only recommended for debugging +logDamage: true + +#Log creation of reinforcements? +logCreation: true + +#Log message replies sent to users? Very useful +logMessages: true + + +#General debug messages +debug: true + reinforcements: - stone_tier: - material: STONE - requirements: 1 - return: 1 - percent_chance: 100 - hit_points: 50 -# mature time is in minutes - mature_time: 5 - acid_time: 30 - scale_amount: 1 -# grace period is in minutes, forced 100% return within that time if undamaged. Set to 0 to disable (default) - grace_period: 1 - lore: - effect: - type: ENCHANTMENT_TABLE - speed: 0.5 - particleCount: 50 - iron_tier: - material: IRON_INGOT - requirements: 1 - return: 1 - percent_chance: 100 - hit_points: 300 -# mature time is in minutes - mature_time: 60 - acid_time: 90 - scale_amount: 1 - lore: - effect: - type: FLYING_GLYPH - speed: 0.5 - particleCount: 50 - diamond_tier: - material: DIAMOND - requirements: 1 - return: 1 - percent_chance: 100 - hit_points: 2000 -# mature time is in minutes - mature_time: 1440 - acid_time: 2880 - scale_amount: 1 - lore: - effect: - type: FLYING_GLYPH - speed: 0.5 - particleCount: 50 -# Delete the comment char to use lore. Three spaces are required -# after lore. You can add multiple lines by adding - -# - Some string representation required for this reinforcement. -# -# # Uncomment below to add limits to what blocks this reinforcement can be applied to -# reinforceables: -# - STONE - bedrock: - material: BEDROCK - requirements: 1 - return: 0 - percent_chance: 100 - hit_points: 147483646 - mature_time: 147483646 - acid_time: 147483646 - scale_amount: 1 - lore: - effect: - type: FLYING_GLYPH - speed: 0.5 - particleCount: 50 -#natural_reinforcements: - #diamond_ore: - #material: DIAMOND_ORE - #hit_points: 60 + stone: + item: + ==: org.bukkit.inventory.ItemStack + type: STONE + effect: + type: ENCHANTMENT_TABLE + speed: 0.5 + particleCount: 50 + mature_time: 5m + acid_time: 20m + name: Stone + hit_points: 50 + iron: + item: + ==: org.bukkit.inventory.ItemStack + type: IRON_INGOT + effect: + type: ENCHANTMENT_TABLE + speed: 0.5 + particleCount: 50 + mature_time: 30m + acid_time: 6h + name: Iron + hit_points: 300 + diamond: + item: + ==: org.bukkit.inventory.ItemStack + type: DIAMOND + effect: + type: ENCHANTMENT_TABLE + speed: 0.5 + particleCount: 50 + mature_time: 4h + acid_time: 48h + name: Diamond + hit_points: 2000 + bedrock: + item: + ==: org.bukkit.inventory.ItemStack + type: BEDROCK + effect: + type: ENCHANTMENT_TABLE + speed: 0.5 + particleCount: 50 + mature_time: 1s + acid_time: 1s + name: Bedrock + hit_points: 420420420 + non_reinforceables: - BEDROCK - ENDER_PORTAL_FRAME @@ -125,27 +93,21 @@ non_reinforceables: - VINE - NETHER_WARTS - ENDER_PORTAL -reset_player_state: 300 -enable_maturation: true -# The max amount of reinforcements to keep loaded -max_cache_size: 20000000 -# The amount of minutes to keep a reinforcement loaded -max_cache_load_time: 10 -redstone_distance: 3 -acidblock_material: GOLD_BLOCK -# If set to true then instead of dropping the reinforcement a block with the specified reinforcement value will be dropped. -drop_reinforced_block: false -save_interval_ticks: 600 + +acidblock_material: + - GOLD_BLOCK + # reinforcement_damageMultiplier is m where BlockDamage = 2 ^ (n/m) where n is equal to the number of days the group has been inactive reinforcement_damageMultiplier: 365 -mysql: - hostname: "localhost" - port: 3306 - dbname: "civclassic" - username: "root" - password: "thisisnotourpassword" -# Shows reinforcement information as percentile value -show_health_as_percent: true -# Whether players are automatically put in reinforcement bypass mode on login -default_bypass_mode: true -break_acided_block_naturally: false +#database: +# ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource +# plugin: Citadel +# user: username +# password: squidLover69 +# host: localhost +# port: 3306 +# database: citadel +# poolsize: 5 +# connection_timeout: 10000 +# idle_timeout: 600000 +# max_lifetime: 7200000 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 420697d0..264e89d8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,77 +1,127 @@ name: ${project.name} main: vg.civcraft.mc.citadel.Citadel version: ${project.version} -authors: [Rourke750, Maxopoly] -depend: [NameLayer, CivModCore] -softdepend: [Mercury, BetterShards] +authors: +- Rourke750 +- Maxopoly +depend: +- NameLayer +- CivModCore description: Citadel allows you to make blocks difficult to break. When a block is reinforced, it must be broken many times before it is destroyed. commands: - ctr: - aliases: [ctreinforce, reinforce, protect, cprivate, lwc, private] - usage: /ctr [group] - description: 'Enters reinforcing mode. Interacting with blocks in reinforcing mode will reinforce them or modify their reinforcement' - min-args: 0 - max-args: 1 - player-only: true - ctacid: - usage: /ctacid - description: 'Removes the block above it if used on an acid block' - min-args: 0 - max-args: 0 - player-only: true - ctf: - aliases: [ctfortify, fortify] - usage: /ctf [group] - description: 'Enters fortification mode. All blocks placed in fortification mode will automatically be reinforced. If no group is given, your default group will be used' - min-args: 0 - max-args: 1 - player-only: true - ctb: - aliases: [ctbypass, bypass] - usage: /ctb - description: 'Toggles bypass state. In bypass state you can break blocks reinforced on groups you have access to in a single break' - min-args: 0 - max-args: 0 - player-only: true - cti: - aliases: [ctinformation, info, ctinfo] - usage: /cti - description: 'Enters information mode. Interacting with blocks in information mode will show information on their reinforcement' - min-args: 0 - max-args: 0 - player-only: true - ctin: - aliases: [ctinsecure, insecure] - usage: /ctin - description: 'Enters insecure mode. Interacting with containers in insecure mode will switch their insecure flag. Insecure containers can interact with hoppers reinforced on a different group. All containers are secure by default' - min-args: 0 - max-args: 0 - player-only: true - ctm: - aliases: [ctmaterials, materials] - cto: - aliases: [ctoff, off] - usage: /cto - description: 'Leaves all reinforcement modes' - min-args: 0 - max-args: 0 - player-only: true - ctur: - permission: citadel.admin - ctar: - permission: citadel.admin - aliases: [ctareareinforce] - cte: - aliases: [cteasy,toggleeasymode] - ctdl: - aliases: [reinforcements,rein] - usage: /ctdl - description: 'Opens a GUI displaying all reinforcement materials' - min-args: 0 - max-args: 0 + ctr: + aliases: + - ctreinforce + - reinforce + - protect + - cprivate + - lwc + - private + usage: /ctr [group] + description: Enters reinforcing mode. Interacting with blocks in reinforcing mode will reinforce them or modify their reinforcement + min-args: 0 + max-args: 1 + player-only: true + ctacid: + usage: /ctacid + description: Removes the block above it if used on an acid block + min-args: 0 + max-args: 0 + player-only: true + ctf: + aliases: + - ctfortify + - fortify + usage: /ctf [group] + description: Enters fortification mode. All blocks placed in fortification mode will automatically be reinforced. If no group is given, your default group will be used + min-args: 0 + max-args: 1 + player-only: true + ctb: + aliases: + - ctbypass + - bypass + usage: /ctb + description: Toggles bypass state. In bypass state you can break blocks reinforced on groups you have access to in a single break + min-args: 0 + max-args: 0 + player-only: true + cti: + aliases: + - ctinformation + - info + - ctinfo + usage: /cti + description: Enters information mode. Interacting with blocks in information mode will show information on their reinforcement + min-args: 0 + max-args: 0 + player-only: true + ctin: + aliases: + - ctinsecure + - insecure + usage: /ctin + description: Enters insecure mode. Interacting with containers in insecure mode will switch their insecure flag. Insecure containers can interact with hoppers reinforced on a different group. All containers are secure by default + min-args: 0 + max-args: 0 + player-only: true + cto: + aliases: + - ctoff + - false + usage: /cto + description: Leaves all reinforcement modes + min-args: 0 + max-args: 0 + player-only: true + ctur: + permission: citadel.admin + player-only: true + ctar: + permission: citadel.admin + aliases: + - ctareareinforce + player-only: true + cte: + aliases: + - cteasy + - toggleeasymode + player-only: true + ctdl: + aliases: + - reinforcements + - rein + usage: /ctdl + description: Opens a GUI displaying all reinforcement materials + min-args: 0 + max-args: 0 + player-only: true + citadelreload: + aliases: + - reloadcitadel + usage: /citadelreload + description: Reloads Citadel entirely + min-args: 0 + max-args: 0 + permission: citadel.admin + ctp: + aliases: + - repair + - patch + - ctrepair + - ctpatch + usage: /ctp + min-args: 0 + max-args: 0 + player-only: true + description: Enters patch mode, which allows you to repair reinforcements. Note that repairing reinforcements will also reset their maturation cycle + cta: + usage: /cta [group] + description: Enters advanced fortification mode or adds configurations to it. Advanced configuration mode allows you to place on different groups with different reinforcement types at once + min-args: 0 + max-args: 1 + player-only: true permissions: - citadel.admin: - default: op - citadel.admin.accesssecurable: - default: op -api-version: 1.13 + citadel.admin: + default: op +api-version: 1.13 \ No newline at end of file From 4242b481220592374be177e88572a27e4fa9f52d Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 26 Apr 2019 19:41:41 +0200 Subject: [PATCH 116/255] Holo cti --- pom.xml | 13 +- .../java/vg/civcraft/mc/citadel/Citadel.java | 26 ++- .../mc/citadel/ReinforcementLogic.java | 4 +- .../command/AdvancedFortification.java | 9 +- .../civcraft/mc/citadel/command/Bypass.java | 11 +- .../mc/citadel/command/Fortification.java | 2 +- .../mc/citadel/command/Information.java | 2 +- .../civcraft/mc/citadel/command/Insecure.java | 2 +- .../mc/citadel/command/PatchMode.java | 2 +- .../mc/citadel/command/Reinforce.java | 6 +- .../database/CitadelReinforcementData.java | 7 +- .../mc/citadel/listener/EntityListener.java | 2 +- .../citadel/listener/InventoryListener.java | 8 +- .../mc/citadel/listener/RedstoneListener.java | 6 +- .../mc/citadel/model/AcidManager.java | 6 +- .../civcraft/mc/citadel/model/ChunkCache.java | 2 + .../civcraft/mc/citadel/model/ChunkCoord.java | 2 + .../citadel/model/CitadelSettingManager.java | 89 +++++++++ .../model/GlobalReinforcementManager.java | 2 +- .../mc/citadel/model/HologramManager.java | 176 ++++++++++++++++++ .../mc/citadel/model/Reinforcement.java | 13 ++ .../model/WorldReinforcementManager.java | 15 +- .../playerstate/AbstractPlayerState.java | 20 +- .../AdvancedFortificationState.java | 4 +- .../playerstate/FortificationState.java | 5 +- .../citadel/playerstate/InformationState.java | 33 +++- .../mc/citadel/playerstate/InsecureState.java | 4 +- .../mc/citadel/playerstate/NormalState.java | 4 +- .../mc/citadel/playerstate/PatchState.java | 4 +- .../playerstate/PlayerStateManager.java | 8 +- .../citadel/playerstate/ReinforcingState.java | 5 +- .../ReinforcementEffect.java | 1 + src/main/resources/plugin.yml | 2 + 33 files changed, 409 insertions(+), 86 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java diff --git a/pom.xml b/pom.xml index 896ac812..35094010 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.7.3 + 1.7.4 provided @@ -59,6 +59,13 @@ 2.12.0 provided + + com.gmail.filoghost.holographicdisplays + holographicdisplays-api + 2.3.0 + provided + + @@ -70,5 +77,9 @@ spigot-repo https://hub.spigotmc.org/nexus/content/groups/public/ + + filoghost-repo + https://ci.filoghost.me/plugin/repository/everything/ + diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 43f14e09..6e30539a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -5,7 +5,6 @@ import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; - import vg.civcraft.mc.citadel.database.CitadelReinforcementData; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.ChunkLoadListener; @@ -13,7 +12,9 @@ import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; +import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.ACivMod; @@ -24,7 +25,6 @@ public class Citadel extends ACivMod { public static final String chestPerm = "CHESTS"; - public static final String bypassPerm = "BYPASS_REINFORCEMENT"; public static final String cropsPerm = "CROPS"; public static final String insecurePerm = "INSECURE_REINFORCEMENT"; @@ -46,6 +46,8 @@ public static Citadel getInstance() { private CitadelConfigManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; + private HologramManager holoManager; + private CitadelSettingManager settingManager; private PlayerStateManager stateManager; @@ -72,9 +74,6 @@ public String getPluginName() { return "Citadel"; } - /** - * @return The ReinforcementManager of Citadel. - */ public GlobalReinforcementManager getReinforcementManager() { return worldManager; } @@ -82,14 +81,19 @@ public GlobalReinforcementManager getReinforcementManager() { public ReinforcementTypeManager getReinforcementTypeManager() { return typeManager; } + + public CitadelSettingManager getSettingManager() { + return settingManager; + } public PlayerStateManager getStateManager() { return stateManager; } - /** - * Initializes the database. - */ + public HologramManager getHologramManager() { + return holoManager; + } + public boolean initializeDatabase() { ManagedDatasource mds = config.getDatabase(); if (mds == null) { @@ -99,6 +103,7 @@ public boolean initializeDatabase() { return db.startUp(); } + @Override public void onDisable() { // Pushes all reinforcements loaded to be saved to db. worldManager.flushAll(); @@ -111,6 +116,7 @@ public void reload() { onEnable(); } + @Override public void onEnable() { super.onEnable(); instance = this; @@ -141,6 +147,10 @@ public void onEnable() { } stateManager = new PlayerStateManager(); acidManager = new AcidManager(config.getAcidMaterials()); + settingManager = new CitadelSettingManager(); + if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { + holoManager = new HologramManager(); + } registerNameLayerPermissions(); registerListeners(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index c738e71d..a6620376 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -40,8 +40,8 @@ public static void damageReinforcement(Reinforcement rein, double damage) { public static double getDamageApplied(Reinforcement reinforcement) { double damageAmount = 1.0; if (!reinforcement.isMature()) { - double timeExisted = (double) (System.currentTimeMillis() - reinforcement.getCreationTime()); - double progress = timeExisted / (double) reinforcement.getType().getMaturationTime(); + double timeExisted = System.currentTimeMillis() - reinforcement.getCreationTime(); + double progress = timeExisted / reinforcement.getType().getMaturationTime(); damageAmount /= (1.0 - progress); damageAmount *= reinforcement.getType().getMaturationScale(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java index 6c767002..73968b23 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -4,6 +4,7 @@ import java.util.List; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -39,13 +40,13 @@ public boolean execute(CommandSender sender, String[] args) { } } ItemStack mainHand = player.getInventory().getItemInMainHand(); - if (mainHand == null) { + if (mainHand.getType() == Material.AIR) { Utility.sendAndLog(player, ChatColor.RED, "You need to hold an item in your main hand to specify the block type to reinforce"); return true; } ItemStack offHand = player.getInventory().getItemInOffHand(); - if (offHand == null) { + if (offHand.getType() == Material.AIR) { Utility.sendAndLog(player, ChatColor.RED, "You need to hold a reinforcement item in your off hand"); return true; } @@ -64,7 +65,7 @@ public boolean execute(CommandSender sender, String[] args) { groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == null) { Utility.sendAndLog(player, ChatColor.RED, - "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); + "You don't have a default group and can thus not use this command without specifying a group"); return true; } } else { @@ -83,7 +84,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } if (advFortState == null) { - advFortState = new AdvancedFortificationState(player, currentState.isBypassEnabled()); + advFortState = new AdvancedFortificationState(player); stateManager.setState(player, advFortState); } advFortState.addSetup(mainHand, type, group); diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java index 705646d9..04b2b6b0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -7,11 +7,11 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; @CivCommand(id = "ctb") public class Bypass extends StandaloneCommand { @@ -19,14 +19,15 @@ public class Bypass extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); - if (currentState.isBypassEnabled()) { + BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); + boolean enabled = setting.getValue(player); + if (enabled) { Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); } else { Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } - currentState.toggleBypass(); + setting.toggleValue(player.getUniqueId()); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index e629f954..2efdf35f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -73,7 +73,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } } - stateManager.setState(player, new FortificationState(player, currentState.isBypassEnabled(), type, group)); + stateManager.setState(player, new FortificationState(player, type, group)); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Information.java b/src/main/java/vg/civcraft/mc/citadel/command/Information.java index 08b64e8a..02f345c6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Information.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Information.java @@ -24,7 +24,7 @@ public boolean execute(CommandSender sender, String[] args) { if (currentState instanceof InformationState) { stateManager.setState(player, null); } else { - stateManager.setState(player, new InformationState(player, currentState.isBypassEnabled())); + stateManager.setState(player, new InformationState(player)); } return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java index 95a5288f..fbf850b6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java @@ -24,7 +24,7 @@ public boolean execute(CommandSender sender, String[] args) { if (currentState instanceof InsecureState) { stateManager.setState(player, null); } else { - stateManager.setState(player, new InsecureState(player, currentState.isBypassEnabled())); + stateManager.setState(player, new InsecureState(player)); } return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java b/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java index 24522221..796beea3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java @@ -24,7 +24,7 @@ public boolean execute(CommandSender sender, String[] args) { if (currentState instanceof PatchState) { stateManager.setState(player, null); } else { - stateManager.setState(player, new PatchState(player, currentState.isBypassEnabled())); + stateManager.setState(player, new PatchState(player)); } return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java index 26cd0154..b8935a95 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -33,7 +33,7 @@ public boolean execute(CommandSender sender, String[] args) { groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == null) { Utility.sendAndLog(player, ChatColor.RED, - "You need to reinforced to a group! Try /reinforce groupname. \n Or use /create groupname if you don't have a group yet."); + "You need to reinforce to a group! Try /reinforce groupname. \n Or use /create groupname if you don't have a group yet."); return true; } } else { @@ -42,7 +42,7 @@ public boolean execute(CommandSender sender, String[] args) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(player, ChatColor.RED, "The group" + groupName + "does not exist."); + Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); return true; } @@ -61,7 +61,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } } - stateManager.setState(player, new ReinforcingState(player, currentState.isBypassEnabled(), group)); + stateManager.setState(player, new ReinforcingState(player, group)); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java index cfc269a3..1d401716 100644 --- a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java @@ -5,6 +5,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -87,12 +88,12 @@ private void insertNewReinforcement(ChunkCache cache, Reinforcement rein, Prepar insertStatement.setDouble(8, rein.getHealth()); insertStatement.setInt(9, rein.getGroupId()); insertStatement.setBoolean(10, rein.isInsecure()); + insertStatement.setTimestamp(11, new Timestamp(rein.getCreationTime())); insertStatement.addBatch(); } - public ChunkCache loadReinforcements(ChunkCoord coords, int worldID) { + public ChunkCache loadReinforcements(ChunkCoord coords, int worldID, World world) { List reinforcements = new ArrayList<>(); - World world = null; try (Connection loadConn = db.getConnection(); PreparedStatement loadRein = loadConn.prepareStatement( "select x, y, z, type_id, creation_time, health, group_id, insecure from reinforcements " @@ -144,7 +145,7 @@ public void saveReinforcements(ChunkCache cache) { try (Connection conn = db.getConnection()) { PreparedStatement insertStatement = conn .prepareStatement("insert into reinforcements (x,y,z,chunk_x,chunk_z,world_id,type_id," - + "health,group_id,insecure) values(?,?,?,?,?,?,?,?,?,?);"); + + "health,group_id,insecure,creation_time) values(?,?,?,?,?,?,?,?,?,?,?);"); PreparedStatement deleteStatement = conn .prepareStatement("delete from reinforcements where x = ? and y = ? and z = ? and world_id = ?;"); PreparedStatement updateStatement = conn.prepareStatement("update reinforcements " diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 9a75ff17..0594ed68 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -72,7 +72,7 @@ public void explode(EntityExplodeEvent eee) { } private List getGolemBlocks(EntityType type, Block base) { - ArrayList blocks = new ArrayList(); + ArrayList blocks = new ArrayList<>(); blocks.add(base); base = base.getRelative(BlockFace.UP); blocks.add(base); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 0029b8cf..b51de7fe 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -15,10 +15,10 @@ public class InventoryListener implements Listener { // different groups or filling into them @EventHandler(ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { - Inventory SourceInv = event.getSource(); + Inventory sourceInv = event.getSource(); Reinforcement sourceRein = null; - if (SourceInv.getHolder() instanceof Container) { - sourceRein = ReinforcementLogic.getReinforcementProtecting(((Container) SourceInv.getHolder()).getBlock()); + if (sourceInv.getHolder() instanceof Container) { + sourceRein = ReinforcementLogic.getReinforcementProtecting(((Container) sourceInv.getHolder()).getBlock()); } Inventory destInv = event.getDestination(); Reinforcement destRein = null; @@ -34,7 +34,7 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { } return; } - if (sourceRein == null && destRein != null) { + if (sourceRein == null) { if (!destRein.isInsecure()) { event.setCancelled(true); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index e82dc3de..c44c30f6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -177,11 +177,7 @@ private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { } else { locationToSave = rel.getLocation(); } - List existingAuths = authorizations.get(locationToSave); - if (existingAuths == null) { - existingAuths = new LinkedList(); - authorizations.put(locationToSave, existingAuths); - } + List existingAuths = authorizations.computeIfAbsent(locationToSave, k -> new LinkedList<>()); existingAuths.add(player.getUniqueId()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java index b02e0ab6..e7ceffe4 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java @@ -52,10 +52,6 @@ public boolean isPossibleAcidBlock(Block b) { if (b == null) { return false; } - Material mat = b.getType(); - if (mat == null) { - return false; - } - return material.contains(mat); + return material.contains(b.getType()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java index 10d1e2d1..1e63e68d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java @@ -29,6 +29,7 @@ private class Coords implements Comparable { this.z = loc.getBlockZ(); } + @Override public int compareTo(Coords coords) { // y first because we have the most variety here if (coords.y != y) { @@ -43,6 +44,7 @@ public int compareTo(Coords coords) { return 0; } + @Override public boolean equals(Object o) { Coords coords = (Coords) o; return coords.y == y && coords.x == x && coords.z == z; diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java index 9ef06c9f..8bcc3429 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java @@ -27,6 +27,7 @@ public ChunkCoord(int x, int z) { this.z = z; } + @Override public boolean equals(Object o) { if (o instanceof ChunkCoord) { ChunkCoord pair = (ChunkCoord) o; @@ -50,6 +51,7 @@ public int getZ() { return z; } + @Override public int hashCode() { // might collide return x & (z << 16); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java new file mode 100644 index 00000000..b0d41dda --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -0,0 +1,89 @@ +package vg.civcraft.mc.citadel.model; + +import java.text.DecimalFormat; +import java.util.Map; +import java.util.TreeMap; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.playerstate.InformationState; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.playersettings.impl.CommandReplySetting; +import vg.civcraft.mc.civmodcore.playersettings.impl.DecimalFormatSetting; + +public class CitadelSettingManager { + + private BooleanSetting byPass; + private CommandReplySetting ctiNotReinforced; + //private CommandReplySetting ctiAllied; + private CommandReplySetting ctiEnemy; + //private CommandReplySetting modeSwitch; + private DecimalFormatSetting ctiPercentageHealth; + private DecimalFormatSetting ctiReinforcementHealth; + + public CitadelSettingManager() { + initSettings(); + } + + void initSettings() { + MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", + "Citadel and reinforcement related settings"); + byPass = new BooleanSetting(Citadel.getInstance(), true, "Bypass", "citadelBypass", + new ItemStack(Material.DIAMOND_PICKAXE), + "Allows you to bypass reinforcements you have permission for and break them in a single break"); + PlayerSettingAPI.registerSetting(byPass, menu); + + MenuSection commandSection = menu.createMenuSection("Command replies", + "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); + + ctiNotReinforced = new CommandReplySetting(Citadel.getInstance(), ChatColor.YELLOW + "Not reinforced", + "CTI Message Unreinforced", "citadel_cti_unreinforced", new ItemStack(Material.YELLOW_TERRACOTTA), + "The message received when interacting with an unreinforced block in Information Mode"); + PlayerSettingAPI.registerSetting(ctiNotReinforced, commandSection); + + ctiPercentageHealth = new DecimalFormatSetting(Citadel.getInstance(), new DecimalFormat("#.##"), + "Reinforcement Percentage Health Format", "citadel_cti_percentage_health", + new ItemStack(Material.KNOWLEDGE_BOOK), + "Decimal format used for displaying a percentage value for reinforcement health", 100.0 / 3); + PlayerSettingAPI.registerSetting(ctiPercentageHealth, commandSection); + + ctiReinforcementHealth = new DecimalFormatSetting(Citadel.getInstance(), new DecimalFormat("0"), + "Reinforcement Health Format", "citadel_cti_health", new ItemStack(Material.KNOWLEDGE_BOOK), + "Decimal format used for displaying a reinforcements health", 100.0 / 3); + PlayerSettingAPI.registerSetting(ctiReinforcementHealth, commandSection); + + ctiEnemy = new CommandReplySetting(Citadel.getInstance(), + ChatColor.RED + "Reinforced at %%health_color%%%%perc_health%% (%%health%%/%%max_health%%)" + + ChatColor.RED + " health with " + ChatColor.AQUA + "%%%type%%%", + "CTI Message Enemy", "citadel_cti_enemy", new ItemStack(Material.RED_TERRACOTTA), + "The message received when interacting with enemy reinforcements"); + ctiEnemy.registerArgument("perc_health", "33.33", "the percentage health of the reinforcement"); + ctiEnemy.registerArgument("max_health", "50", "the maximum health of the reinforcement"); + ctiEnemy.registerArgument("health", "25", "the current health of the reinforcement"); + ctiEnemy.registerArgument("type", "Stone", "the type of the reinforcement"); + ctiEnemy.registerArgument("health_color", InformationState.getDamageColor(0.5).toString(), + "a color representing the reinforcement health"); + PlayerSettingAPI.registerSetting(ctiEnemy, commandSection); + } + + public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) { + Map args = new TreeMap<>(); + ReinforcementType type = reinforcement.getType(); + String percFormat = ctiPercentageHealth.getValue(player).format(reinforcement.getHealth() / type.getHealth() * 100); + args.put("perc_health", percFormat); + DecimalFormat reinHealthFormatter = ctiReinforcementHealth.getValue(player); + args.put("health",reinHealthFormatter.format(reinforcement.getHealth())); + args.put("max_health",reinHealthFormatter.format(type.getHealth())); + args.put("type", type.getName()); + args.put("health_color", InformationState.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); + Utility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); + } +} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java index 2a0efe06..bcc4539b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java @@ -125,7 +125,7 @@ public boolean registerWorld(World world) { return false; } uuidToInternalID.put(world.getUID(), id); - WorldReinforcementManager manager = new WorldReinforcementManager(dao, id); + WorldReinforcementManager manager = new WorldReinforcementManager(dao, id, world); worldToManager.put(world.getUID(), manager); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java new file mode 100644 index 00000000..4e4e236f --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -0,0 +1,176 @@ +package vg.civcraft.mc.citadel.model; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import com.gmail.filoghost.holographicdisplays.api.Hologram; +import com.gmail.filoghost.holographicdisplays.api.HologramsAPI; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.playerstate.InformationState; + +public class HologramManager { + + //distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for good measure + private static final double holoOffSet = 0.55 * Math.sqrt(2); + + private Map> holograms; + private Set activeHolos; + + public HologramManager() { + this.holograms = new HashMap<>(); + this.activeHolos = new HashSet<>(); + new BukkitRunnable() { + + @Override + public void run() { + updateHolograms(); + } + + }.runTaskTimer(Citadel.getInstance(), 2L, 2L); + } + + public void showInfoHolo(Reinforcement rein, Player player) { + Map locationSpecificHolos = holograms.get(rein.getLocation()); + if (locationSpecificHolos == null) { + locationSpecificHolos = new TreeMap<>(); + holograms.put(rein.getLocation(), locationSpecificHolos); + } + PlayerHolo holo = locationSpecificHolos.get(player.getUniqueId()); + if (holo == null) { + holo = new PlayerHolo(player, rein); + locationSpecificHolos.put(player.getUniqueId(), holo); + } + activeHolos.add(holo); + holo.show(); + } + + private static Location getHoloLocation(Reinforcement rein, Player player) { + Location baseLoc = rein.getBlockCenter(); + baseLoc = baseLoc.add(0, 0.5, 0); + Vector vector = player.getEyeLocation().toVector(); + vector.subtract(baseLoc.toVector()); + // vector is now the offset from the reinforcement to the player and we now move + // towards the player so the hologram isn't inside the block + vector.normalize(); + // holoOffSet is a good distance to ensure we fully move the hologram out of the + // block + vector.multiply(holoOffSet); + baseLoc.add(vector); + return baseLoc; + } + + private void updateHolograms() { + for (Iterator iter = activeHolos.iterator(); iter.hasNext();) { + PlayerHolo holo = iter.next(); + if (!holo.update(5000)) { + iter.remove(); + } + } + } + + private class PlayerHolo { + + private Player player; + private Hologram hologram; + private Reinforcement reinforcement; + private long timeStamp; + private boolean hasPermission; + private Location cachedPlayerLocation; + private double cachedHealth; + + public PlayerHolo(Player player, Reinforcement reinforcement) { + this.player = player; + this.reinforcement = reinforcement; + this.timeStamp = System.currentTimeMillis(); + // we intentionally cache permission to avoid having to look it up often + // showing a bit too much information if the player gets kicked while a holo is + // already visible does not matter + this.hasPermission = reinforcement.hasPermission(player, Citadel.infoPerm); + } + + void show() { + refreshTimestamp(); + if (hologram != null) { + return; + } + hologram = HologramsAPI.createHologram(Citadel.getInstance(), getHoloLocation(reinforcement, player)); + cachedPlayerLocation = player.getLocation(); + hologram.getVisibilityManager().setVisibleByDefault(false); + hologram.getVisibilityManager().showTo(player); + updateText(); + } + + boolean update(long cullDelay) { + if (System.currentTimeMillis() - timeStamp > cullDelay) { + delete(); + return false; + } + if (reinforcement.isBroken()) { + delete(); + return false; + } + updateLocation(); + updateText(); + return true; + } + + void updateLocation() { + Location current = player.getLocation(); + // Location.equals would also check pitch/yaw + if (current.getX() == cachedPlayerLocation.getX() && current.getY() == cachedPlayerLocation.getY() + && current.getZ() == cachedPlayerLocation.getZ()) { + return; + } + Location updated = getHoloLocation(reinforcement, player); + hologram.teleport(updated); + } + + void refreshTimestamp() { + this.timeStamp = System.currentTimeMillis(); + } + + void updateText() { + if (reinforcement.getHealth() != cachedHealth || hologram.size() == 0) { + if (hologram.size() > 0) { + hologram.removeLine(0); + } + hologram.insertTextLine(0, InformationState.formatHealth(reinforcement)); + cachedHealth = reinforcement.getHealth(); + } + if (!hasPermission) { + return; + } + if (hologram.size() == 1) { + // not initialized yet + hologram.insertTextLine(1, ChatColor.LIGHT_PURPLE + reinforcement.getGroup().getName()); + hologram.insertTextLine(2, ChatColor.AQUA + reinforcement.getType().getName()); + } + if (hologram.size() == 4) { + hologram.removeLine(3); + } + if (!reinforcement.isMature()) { + hologram.insertTextLine(3, InformationState.formatProgress(reinforcement.getCreationTime(), + reinforcement.getType().getMaturationTime(), "")); + } + } + + void delete() { + hologram.delete(); + hologram = null; + } + + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 138a8e89..b49e134a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -91,6 +91,19 @@ public Location getLocation() { return loc; } + /** + * Gets the center of the block at the location of this reinforcement. + * getLocation() will return the integer coordinates of the reinforcement while + * this location is offset by 0.5 to the center + * + * @return Center of the block + */ + public Location getBlockCenter() { + Location copy = loc.clone(); + copy.add(0.5, 0.5, 0.5); + return copy; + } + /** * @return Type of this reinforcement */ diff --git a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java index a3fb6584..0fc5119c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java @@ -4,6 +4,7 @@ import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.World; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -17,10 +18,13 @@ public class WorldReinforcementManager { private final int worldID; private final LoadingCache reinforcements; + private World world; - public WorldReinforcementManager(CitadelReinforcementData db, int worldID) { + public WorldReinforcementManager(CitadelReinforcementData db, int worldID, World world) { this.worldID = worldID; + this.world = world; this.reinforcements = CacheBuilder.newBuilder().removalListener(new RemovalListener() { + @Override public void onRemoval(RemovalNotification removal) { ChunkCache chunk = removal.getValue(); if (chunk.isDirty()) { @@ -30,7 +34,7 @@ public void onRemoval(RemovalNotification removal) { }).build(new CacheLoader() { @Override public ChunkCache load(ChunkCoord loc) throws Exception { - return db.loadReinforcements(loc, worldID); + return db.loadReinforcements(loc, worldID, world); } /* probably not needed @Override @@ -123,6 +127,13 @@ public void removeReinforcement(Reinforcement reinforcement) { } cache.removeReinforcement(reinforcement); } + + /** + * @return World for which this instance is managing reinforcements + */ + public World getWorld() { + return world; + } void loadChunkData(Chunk chunk) { reinforcements.refresh(ChunkCoord.forChunk(chunk)); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index e0991a8c..c4a00d70 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -19,18 +19,18 @@ import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; public abstract class AbstractPlayerState { protected UUID uuid; - private boolean bypass; - public AbstractPlayerState(Player p, boolean bypass) { + public AbstractPlayerState(Player p) { if (p == null) { throw new IllegalArgumentException("Player for player state can not be null"); } this.uuid = p.getUniqueId(); - this.bypass = bypass; } public abstract String getName(); @@ -44,7 +44,9 @@ public void handleBreakBlock(BlockBreakEvent e) { return; } boolean hasAccess = rein.hasPermission(e.getPlayer(), Citadel.bypassPerm); - if (hasAccess && bypass) { + BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); + boolean hasByPass = setting.getValue(e.getPlayer()); + if (hasAccess && hasByPass) { ReinforcementBypassEvent bypassEvent = new ReinforcementBypassEvent(e.getPlayer(), rein); Bukkit.getPluginManager().callEvent(bypassEvent); if (bypassEvent.isCancelled()) { @@ -63,7 +65,7 @@ public void handleBreakBlock(BlockBreakEvent e) { return; } } - if (bypass) { + if (hasAccess) { Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); } @@ -80,14 +82,6 @@ public void handleBreakBlock(BlockBreakEvent e) { public abstract void handleInteractBlock(PlayerInteractEvent e); - public boolean isBypassEnabled() { - return bypass; - } - - public void toggleBypass() { - bypass = !bypass; - } - protected static void giveReinforcement(Location location, Player p, ReinforcementType type) { HashMap notAdded = p.getInventory().addItem(type.getItem().clone()); if (!notAdded.isEmpty()) { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index 7b2876cd..4d426bf9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -19,8 +19,8 @@ public class AdvancedFortificationState extends AbstractPlayerState { private Map setups; - public AdvancedFortificationState(Player p, boolean bypass) { - super(p, bypass); + public AdvancedFortificationState(Player p) { + super(p); setups = new HashMap(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index c2c8fca2..58dec28e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -15,8 +15,8 @@ public class FortificationState extends AbstractPlayerState { private ReinforcementType type; private Group group; - public FortificationState(Player p, boolean bypass, ReinforcementType type, Group group) { - super(p, bypass); + public FortificationState(Player p, ReinforcementType type, Group group) { + super(p); this.type = type; this.group = group; } @@ -25,6 +25,7 @@ public Group getGroup() { return group; } + @Override public String getName() { return "Fortifying mode with " + ChatColor.AQUA + type.getName() + ChatColor.YELLOW + " on " + ChatColor.LIGHT_PURPLE + group.getName(); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index 79d851ae..6fd801f0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -14,6 +14,7 @@ import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.util.TextUtil; @@ -21,6 +22,21 @@ public class InformationState extends AbstractPlayerState { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); + + + public static ChatColor getDamageColor(double relativeHealth) { + if (relativeHealth >= 1.0) { + return ChatColor.GREEN; + } else if (relativeHealth >= 0.75) { + return ChatColor.DARK_GREEN; + } else if (relativeHealth >= 0.5) { + return ChatColor.YELLOW; + } else if (relativeHealth >= 0.25) { + return ChatColor.RED; + } else { + return ChatColor.DARK_RED; + } + } public static String formatHealth(Reinforcement rein) { double broken = rein.getHealth() / rein.getType().getHealth(); @@ -41,7 +57,7 @@ public static String formatHealth(Reinforcement rein) { roundingFormat.format(rein.getHealth()), roundingFormat.format(rein.getType().getHealth())); } - private static String formatProgress(long start, long timeNeeded, String text) { + public static String formatProgress(long start, long timeNeeded, String text) { long timeTaken = System.currentTimeMillis() - start; timeTaken = Math.min(timeTaken, timeNeeded); double progress = Math.min(1.0, ((double) timeTaken) / ((double) timeNeeded)); @@ -49,10 +65,11 @@ private static String formatProgress(long start, long timeNeeded, String text) { TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); } - public InformationState(Player p, boolean bypass) { - super(p, bypass); + public InformationState(Player p) { + super(p); } + @Override public String getName() { return "Information mode"; } @@ -76,9 +93,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { e.setCancelled(true); } if (!rein.hasPermission(player, Citadel.infoPerm)) { - String msg = String.format("Reinforced at %s%s health with %s%s", formatHealth(rein), ChatColor.RED, - ChatColor.AQUA, rein.getType().getName()); - Utility.sendAndLog(player, ChatColor.RED, msg); + Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); return; } StringBuilder sb = new StringBuilder(); @@ -105,6 +120,10 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } Utility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); + HologramManager holoManager = Citadel.getInstance().getHologramManager(); + if (holoManager != null) { + holoManager.showInfoHolo(rein, player); + } + } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index e82023e1..c8cbddc6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -12,8 +12,8 @@ public class InsecureState extends AbstractPlayerState { - public InsecureState(Player p, boolean bypass) { - super(p, bypass); + public InsecureState(Player p) { + super(p); } @Override diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 07c655ff..bbc31148 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -6,8 +6,8 @@ public class NormalState extends AbstractPlayerState { - public NormalState(Player p, boolean bypass) { - super(p, bypass); + public NormalState(Player p) { + super(p); // TODO Auto-generated constructor stub } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index b5a810f4..08e39dee 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -13,8 +13,8 @@ public class PatchState extends AbstractPlayerState { - public PatchState(Player p, boolean bypass) { - super(p, bypass); + public PatchState(Player p) { + super(p); } @Override diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index a3191855..7ba08c52 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -23,7 +23,7 @@ public AbstractPlayerState getState(Player player) { } AbstractPlayerState state = playerStateMap.get(player.getUniqueId()); if (state == null) { - state = new NormalState(player, true); + state = new NormalState(player); playerStateMap.put(player.getUniqueId(), state); } return state; @@ -36,11 +36,7 @@ public void setState(Player player, AbstractPlayerState state) { AbstractPlayerState existingState = getState(player); // null state is allowed, it just resets the state if (state == null) { - if (existingState != null) { - state = new NormalState(player, existingState.isBypassEnabled()); - } else { - state = new NormalState(player, true); - } + state = new NormalState(player); } playerStateMap.put(player.getUniqueId(), state); Utility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 9ea6cc1a..2a3e2f12 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -22,8 +22,8 @@ public class ReinforcingState extends AbstractPlayerState { private Group group; - public ReinforcingState(Player p, boolean bypass, Group group) { - super(p, bypass); + public ReinforcingState(Player p, Group group) { + super(p); this.group = group; } @@ -31,6 +31,7 @@ public Group getGroup() { return group; } + @Override public String getName() { return "Reinforcing mode on " + ChatColor.LIGHT_PURPLE + group.getName(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java index 27fa4480..22c1c793 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java @@ -78,6 +78,7 @@ public void playEffect(Location location) { location.getWorld().spawnParticle(particle, location, particleCount, offsetX, offsetY, offsetZ, speed, null); } + @Override public String toString() { return String.format( " type: %s \n offsetX: %f \n offsetY: %f \n offsetZ: %f \n speed: %f \n particleCount: %d", diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 264e89d8..2b96f5d2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -7,6 +7,8 @@ authors: depend: - NameLayer - CivModCore +softdepend: +- HolographicDisplays description: Citadel allows you to make blocks difficult to break. When a block is reinforced, it must be broken many times before it is destroyed. commands: ctr: From 0e167abe70d9e028603c7e351173a22338cf0d56 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 25 Aug 2019 05:11:12 +0200 Subject: [PATCH 117/255] Switch over to new CMC storage model --- pom.xml | 10 +- .../java/vg/civcraft/mc/citadel/Citadel.java | 54 ++--- .../{Utility.java => CitadelUtility.java} | 36 ++-- .../mc/citadel/ReinforcementLogic.java | 39 ++-- .../vg/civcraft/mc/citadel/command/Acid.java | 20 +- .../command/AdvancedFortification.java | 18 +- .../mc/citadel/command/AreaReinforce.java | 16 +- .../civcraft/mc/citadel/command/Bypass.java | 8 +- .../mc/citadel/command/Fortification.java | 12 +- .../mc/citadel/command/Information.java | 2 +- .../civcraft/mc/citadel/command/Insecure.java | 2 +- .../vg/civcraft/mc/citadel/command/Off.java | 2 +- .../mc/citadel/command/Reinforce.java | 10 +- .../mc/citadel/command/ReinforcementsGUI.java | 28 +-- .../database/CitadelReinforcementData.java | 199 ------------------ .../mc/citadel/listener/BlockListener.java | 46 ++-- .../citadel/listener/ChunkLoadListener.java | 35 --- .../mc/citadel/listener/EntityListener.java | 7 +- .../mc/citadel/listener/RedstoneListener.java | 28 +-- .../civcraft/mc/citadel/model/ChunkCache.java | 144 ------------- .../mc/citadel/model/CitadelChunkData.java | 17 ++ .../citadel/model/CitadelSettingManager.java | 4 +- .../model/GlobalReinforcementManager.java | 173 --------------- .../mc/citadel/model/Reinforcement.java | 104 ++++----- .../model/WorldReinforcementManager.java | 145 ------------- .../playerstate/AbstractPlayerState.java | 8 +- .../AdvancedFortificationState.java | 12 +- .../playerstate/FortificationState.java | 4 +- .../citadel/playerstate/InformationState.java | 6 +- .../mc/citadel/playerstate/InsecureState.java | 8 +- .../mc/citadel/playerstate/PatchState.java | 16 +- .../playerstate/PlayerStateManager.java | 4 +- .../citadel/playerstate/ReinforcingState.java | 28 +-- .../ReinforcementEffect.java | 11 + 34 files changed, 267 insertions(+), 989 deletions(-) rename src/main/java/vg/civcraft/mc/citadel/{Utility.java => CitadelUtility.java} (84%) delete mode 100644 src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java delete mode 100644 src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java delete mode 100644 src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java delete mode 100644 src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java delete mode 100644 src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java diff --git a/pom.xml b/pom.xml index 35094010..551eae6e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ vg.civcraft.mc.citadel Citadel jar - 4.0.0 + 4.0.1 Citadel https://github.com/Devotedmc/Citadel @@ -45,24 +45,24 @@ org.spigotmc spigot-api - 1.13.2-R0.1-SNAPSHOT + 1.14.4-R0.1-SNAPSHOT vg.civcraft.mc.civmodcore CivModCore - 1.7.4 + 1.7.5 provided vg.civcraft.mc.namelayer NameLayer - 2.12.0 + 2.13.0 provided com.gmail.filoghost.holographicdisplays holographicdisplays-api - 2.3.0 + 2.3.2 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 6e30539a..39677648 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -5,20 +5,21 @@ import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; -import vg.civcraft.mc.citadel.database.CitadelReinforcementData; + import vg.civcraft.mc.citadel.listener.BlockListener; -import vg.civcraft.mc.citadel.listener.ChunkLoadListener; import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.CitadelChunkData; import vg.civcraft.mc.citadel.model.CitadelSettingManager; -import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; import vg.civcraft.mc.citadel.model.HologramManager; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.ACivMod; -import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMetaView; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkMetaAPI; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; @@ -41,8 +42,7 @@ public static Citadel getInstance() { } private Logger logger; - private CitadelReinforcementData db; - private GlobalReinforcementManager worldManager; + private BlockBasedChunkMetaView chunkMetaData; private CitadelConfigManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; @@ -58,24 +58,12 @@ public AcidManager getAcidManager() { return acidManager; } - /** - * @return The Database Manager for Citadel. - */ - public CitadelReinforcementData getCitadelDatabase() { - return db; - } - public CitadelConfigManager getConfigManager() { return config; } - @Override - public String getPluginName() { - return "Citadel"; - } - - public GlobalReinforcementManager getReinforcementManager() { - return worldManager; + public BlockBasedChunkMetaView getChunkMetaManager() { + return chunkMetaData; } public ReinforcementTypeManager getReinforcementTypeManager() { @@ -94,19 +82,9 @@ public HologramManager getHologramManager() { return holoManager; } - public boolean initializeDatabase() { - ManagedDatasource mds = config.getDatabase(); - if (mds == null) { - return false; - } - db = new CitadelReinforcementData(mds, this, typeManager); - return db.startUp(); - } - @Override public void onDisable() { - // Pushes all reinforcements loaded to be saved to db. - worldManager.flushAll(); + chunkMetaData.disable(); HandlerList.unregisterAll(this); Bukkit.getScheduler().cancelTasks(this); } @@ -134,17 +112,12 @@ public void onEnable() { } typeManager = new ReinforcementTypeManager(); config.getReinforcementTypes().forEach(t -> typeManager.register(t)); - if (!initializeDatabase()) { + chunkMetaData = ChunkMetaAPI.registerBlockBasedPlugin(this, CitadelChunkData.class, () -> new CitadelChunkData(true)); + if (chunkMetaData == null) { logger.severe("Errors setting up database, shutting down"); Bukkit.shutdown(); return; } - worldManager = new GlobalReinforcementManager(db); - if (!worldManager.setup()) { - logger.severe("Errors setting up world config, shutting down"); - Bukkit.shutdown(); - return; - } stateManager = new PlayerStateManager(); acidManager = new AcidManager(config.getAcidMaterials()); settingManager = new CitadelSettingManager(); @@ -163,17 +136,16 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); - getServer().getPluginManager().registerEvents(new ChunkLoadListener(), this); } @SuppressWarnings("unchecked") private void registerNameLayerPermissions() { - LinkedList membersAndAbove = new LinkedList(); + LinkedList membersAndAbove = new LinkedList<>(); membersAndAbove.add(PlayerType.MEMBERS); membersAndAbove.add(PlayerType.MODS); membersAndAbove.add(PlayerType.ADMINS); membersAndAbove.add(PlayerType.OWNER); - LinkedList modsAndAbove = new LinkedList(); + LinkedList modsAndAbove = new LinkedList<>(); modsAndAbove.add(PlayerType.MODS); modsAndAbove.add(PlayerType.ADMINS); modsAndAbove.add(PlayerType.OWNER); diff --git a/src/main/java/vg/civcraft/mc/citadel/Utility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java similarity index 84% rename from src/main/java/vg/civcraft/mc/citadel/Utility.java rename to src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index d10af332..1f7bffa6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Utility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -23,7 +23,10 @@ * from anywhere. * */ -public class Utility { +public class CitadelUtility { + + private CitadelUtility() { + } /** * Overload for dropItemAtLocation(Location l, ItemStack is) that accepts a @@ -57,15 +60,12 @@ public static void dropItemAtLocation(Block b, ItemStack is) { */ public static void dropItemAtLocation(final Location l, final ItemStack is) { // Schedule the item to drop 1 tick later - Bukkit.getScheduler().scheduleSyncDelayedTask(Citadel.getInstance(), new Runnable() { - @Override - public void run() { - try { - l.getWorld().dropItem(l.add(0.5, 0.5, 0.5), is).setVelocity(new Vector(0, 0.05, 0)); - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, - "Utility dropItemAtLocation called but errored: ", e); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(Citadel.getInstance(), () -> { + try { + l.getWorld().dropItem(l.add(0.5, 0.5, 0.5), is).setVelocity(new Vector(0, 0.05, 0)); + } catch (Exception e) { + Citadel.getInstance().getLogger().log(Level.WARNING, "Utility dropItemAtLocation called but errored: ", + e); } }, 1); } @@ -125,7 +125,7 @@ public static void debugLog(String msg) { public static boolean consumeReinforcementItems(Player player, ReinforcementType type) { ItemMap toRemove = new ItemMap(type.getItem()); if (!toRemove.removeSafelyFrom(player.getInventory())) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); Citadel.getInstance().getStateManager().setState(player, null); return false; @@ -137,7 +137,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp Player player) { // check if group still exists if (!group.isValid()) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + group.getName() + " seems to have been deleted in the mean time"); Citadel.getInstance().getStateManager().setState(player, null); return true; @@ -145,20 +145,20 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp // check if player still has permission if (!NameAPI.getGroupManager().hasAccess(group, player.getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm))) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(player, null); return true; } // check if reinforcement already exists - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(block); if (rein != null) { // something like a slab, we just ignore this return false; } // check if reinforcement can reinforce that block if (!type.canBeReinforced(block.getType())) { - Utility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + block.getType()); + CitadelUtility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + block.getType()); return true; } ItemMap playerItems = new ItemMap(player.getInventory()); @@ -166,11 +166,11 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp int available = playerItems.getAmount(type.getItem()); if (available == 0) { Citadel.getInstance().getStateManager().setState(player, null); - Utility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); return true; } // remove from inventory - if (!Utility.consumeReinforcementItems(player, type)) { + if (!CitadelUtility.consumeReinforcementItems(player, type)) { return true; } // create reinforcement @@ -178,7 +178,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() + " for " + block.getType().toString() + " at " + block.getLocation().toString()); } - ReinforcementLogic.createReinforcement(block, type, group); + ReinforcementLogic.createReinforcement(player, block, type, group); return false; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index a6620376..cb2984a2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -8,32 +9,36 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; +import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.listener.BlockListener; -import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.group.Group; public class ReinforcementLogic { - public static void createReinforcement(Block block, ReinforcementType type, Group group) { - GlobalReinforcementManager worldManager = Citadel.getInstance().getReinforcementManager(); - worldManager.insertReinforcement(new Reinforcement(block.getLocation(), type, group)); + public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { + Reinforcement rein = new Reinforcement(block.getLocation(), type, group); + Citadel.getInstance().getChunkMetaManager().put(rein); if (type.getCreationEffect() != null) { - type.getCreationEffect().playEffect(block.getLocation().clone().add(0.5, 0.5, 0.5)); + type.getCreationEffect().playEffect(rein); } + Bukkit.getPluginManager().callEvent(new ReinforcementCreationEvent(player, rein)); + return rein; } public static void damageReinforcement(Reinforcement rein, double damage) { rein.setHealth(rein.getHealth() - damage); if (rein.isBroken()) { + Citadel.getInstance().getChunkMetaManager().remove(rein); if (rein.getType().getDestructionEffect() != null) { - rein.getType().getDestructionEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + rein.getType().getDestructionEffect().playEffect(rein); } } else { if (rein.getType().getDamageEffect() != null) { - rein.getType().getDamageEffect().playEffect(rein.getLocation().clone().add(0.5, 0.5, 0.5)); + rein.getType().getDamageEffect().playEffect(rein); } + rein.setDirty(true); } } @@ -51,12 +56,11 @@ public static double getDamageApplied(Reinforcement reinforcement) { } public static Reinforcement getReinforcementAt(Location loc) { - GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); - return reinMan.getReinforcement(loc); + return Citadel.getInstance().getChunkMetaManager().get(loc); } public static Reinforcement getReinforcementProtecting(Block b) { - Reinforcement directReinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(b); + Reinforcement directReinforcement = Citadel.getInstance().getChunkMetaManager().get(b.getLocation()); if (directReinforcement != null) { return directReinforcement; } @@ -174,19 +178,18 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { return false; } - public static Reinforcement resolveDoubleChestReinforcement(Block b) { - Material mat = b.getType(); - GlobalReinforcementManager reinMan = Citadel.getInstance().getReinforcementManager(); - Reinforcement rein = reinMan.getReinforcement(b); + public static Reinforcement resolveDoubleChestReinforcement(Block block) { + Material mat = block.getType(); + Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(block); if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { return rein; } - for (BlockFace face : BlockListener.planar_sides) { - Block rel = b.getRelative(face); - if (rel.getType() != mat) { + for (BlockFace face : BlockListener.PLANAR_SIDES) { + Block relative = block.getRelative(face); + if (relative.getType() != mat) { continue; } - rein = reinMan.getReinforcement(rel); + rein = Citadel.getInstance().getChunkMetaManager().get(relative); if (rein != null) { return rein; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index cf9d1f7c..786b558f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -16,8 +16,8 @@ import org.bukkit.util.BlockIterator; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementAcidBlockedEvent; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -36,37 +36,37 @@ public boolean execute(CommandSender sender, String[] args) { while (itr.hasNext()) { Block block = itr.next(); if (!acidMan.isPossibleAcidBlock(block)) { - Utility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); + CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); return true; } - Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + Reinforcement reinforcement = Citadel.getInstance().getChunkMetaManager().get(block); if (reinforcement == null) { - Utility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); + CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } if (!reinforcement.hasPermission(p, Citadel.acidPerm)) { - Utility.sendAndLog(p, ChatColor.RED, + CitadelUtility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); return true; } long neededTime = acidMan.getRemainingAcidMaturationTime(reinforcement); if (neededTime > 0) { - Utility.sendAndLog(p, ChatColor.RED, "That acid block will be mature in " + CitadelUtility.sendAndLog(p, ChatColor.RED, "That acid block will be mature in " + TextUtil.formatDuration(neededTime, TimeUnit.MILLISECONDS)); return true; } Block topFace = block.getRelative(BlockFace.UP); if (Material.AIR.equals(topFace.getType())) { - Utility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); + CitadelUtility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); return true; } Reinforcement topRein = ReinforcementLogic.getReinforcementProtecting(topFace); if (topRein == null) { - Utility.sendAndLog(p, ChatColor.RED, "The block above doesn't have a reinforcement."); + CitadelUtility.sendAndLog(p, ChatColor.RED, "The block above doesn't have a reinforcement."); return true; } if (!acidMan.canAcidBlock(reinforcement.getType(), topRein.getType())) { - Utility.sendAndLog(p, ChatColor.RED, + CitadelUtility.sendAndLog(p, ChatColor.RED, reinforcement.getType().getName() + " can not acid away " + topRein.getType().getName()); return true; } @@ -95,6 +95,6 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java index 73968b23..6b80d53d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -10,7 +10,7 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.AdvancedFortificationState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; @@ -41,22 +41,22 @@ public boolean execute(CommandSender sender, String[] args) { } ItemStack mainHand = player.getInventory().getItemInMainHand(); if (mainHand.getType() == Material.AIR) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to hold an item in your main hand to specify the block type to reinforce"); return true; } ItemStack offHand = player.getInventory().getItemInOffHand(); if (offHand.getType() == Material.AIR) { - Utility.sendAndLog(player, ChatColor.RED, "You need to hold a reinforcement item in your off hand"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to hold a reinforcement item in your off hand"); return true; } ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(offHand); if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with the item in your off hand"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with the item in your off hand"); return true; } if (!type.canBeReinforced(mainHand.getType())) { - Utility.sendAndLog(player, ChatColor.AQUA, + CitadelUtility.sendAndLog(player, ChatColor.AQUA, type.getName() + ChatColor.RED + " can not reinforce " + mainHand.getType().name()); return true; } @@ -64,7 +64,7 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length == 0) { groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == null) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You don't have a default group and can thus not use this command without specifying a group"); return true; } @@ -74,13 +74,13 @@ public boolean execute(CommandSender sender, String[] args) { Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm)); if (!hasAccess) { - Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); return true; } if (advFortState == null) { @@ -100,7 +100,7 @@ else if (args.length == 1) return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); else { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java index a5fe0015..75bc3b29 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -10,8 +10,8 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; @@ -33,14 +33,14 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementType reinType = Citadel.getInstance().getReinforcementTypeManager() .getByItemStack(p.getInventory().getItemInMainHand()); if (reinType == null) { - Utility.sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); + CitadelUtility.sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); return true; } String groupName = null; if (args.length == 6) { groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == null) { - Utility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); + CitadelUtility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); return true; } } else { @@ -48,7 +48,7 @@ public boolean execute(CommandSender sender, String[] args) { } Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(p, ChatColor.RED, "That group does not exist."); + CitadelUtility.sendAndLog(p, ChatColor.RED, "That group does not exist."); return true; } // no additional group permission check here because the player is @@ -69,7 +69,7 @@ public boolean execute(CommandSender sender, String[] args) { yMax = Math.max(y1, y2); zMax = Math.max(z1, z2); } catch (NumberFormatException e) { - Utility.sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); + CitadelUtility.sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); return false; } int count = 0; @@ -85,17 +85,17 @@ public boolean execute(CommandSender sender, String[] args) { continue; } count++; - ReinforcementLogic.createReinforcement(current, reinType, group); + ReinforcementLogic.createReinforcement(p, current, reinType, group); } } } - Utility.sendAndLog(p, ChatColor.GREEN, "Successfully created " + count + "reinforcements"); + CitadelUtility.sendAndLog(p, ChatColor.GREEN, "Successfully created " + count + "reinforcements"); return true; } @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java index 04b2b6b0..a4597c78 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -7,7 +7,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; @@ -22,9 +22,9 @@ public boolean execute(CommandSender sender, String[] args) { BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); boolean enabled = setting.getValue(player); if (enabled) { - Utility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); } else { - Utility.sendAndLog(player, ChatColor.GREEN, + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } setting.toggleValue(player.getUniqueId()); @@ -33,6 +33,6 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index 2efdf35f..81d662d7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -8,7 +8,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.FortificationState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; @@ -36,7 +36,7 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager() .getByItemStack(player.getInventory().getItemInMainHand()); if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); stateManager.setState(player, null); return true; } @@ -45,7 +45,7 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length == 0) { groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == null) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); return true; } @@ -55,14 +55,14 @@ public boolean execute(CommandSender sender, String[] args) { Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm)); if (!hasAccess) { - Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); return true; } @@ -86,7 +86,7 @@ else if (args.length == 1) return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); else { - return new ArrayList(); + return new ArrayList<>(); } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Information.java b/src/main/java/vg/civcraft/mc/citadel/command/Information.java index 02f345c6..1882de94 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Information.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Information.java @@ -31,6 +31,6 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java index fbf850b6..46ab8d4a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java @@ -31,7 +31,7 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Off.java b/src/main/java/vg/civcraft/mc/citadel/command/Off.java index 999eb960..26381980 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Off.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Off.java @@ -21,7 +21,7 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList(); + return new ArrayList<>(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java index b8935a95..ead8962f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -9,7 +9,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.ReinforcingState; @@ -32,7 +32,7 @@ public boolean execute(CommandSender sender, String[] args) { if (args.length == 0) { groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == null) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or use /create groupname if you don't have a group yet."); return true; } @@ -42,14 +42,14 @@ public boolean execute(CommandSender sender, String[] args) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); Group group = GroupManager.getGroup(groupName); if (group == null) { - Utility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm)); if (!hasAccess) { - Utility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); return true; } @@ -77,7 +77,7 @@ else if (args.length == 1) return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), (Player) sender); else { - return new ArrayList(); + return new ArrayList<>(); } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java index aa76916f..6fd611c3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -2,7 +2,6 @@ import java.text.DecimalFormat; import java.util.Collections; -import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; @@ -14,12 +13,12 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.api.ItemAPI; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.civmodcore.inventorygui.DecorationStack; import vg.civcraft.mc.civmodcore.inventorygui.IClickable; import vg.civcraft.mc.civmodcore.inventorygui.MultiPageView; -import vg.civcraft.mc.civmodcore.itemHandling.ISUtils; import vg.civcraft.mc.civmodcore.util.TextUtil; @CivCommand(id = "ctdl") @@ -32,33 +31,26 @@ public boolean execute(CommandSender sender, String[] arg1) { List types = new LinkedList<>( Citadel.getInstance().getReinforcementTypeManager().getAllTypes()); // sort ascending by health - Collections.sort(types, new Comparator() { - - @Override - public int compare(ReinforcementType o1, ReinforcementType o2) { - return Double.compare(o1.getHealth(), o2.getHealth()); - } - }); - List clicks = new LinkedList(); + Collections.sort(types, (o1, o2) -> Double.compare(o1.getHealth(), o2.getHealth())); + List clicks = new LinkedList<>(); for (ReinforcementType type : types) { ItemStack is = type.getItem().clone(); - ISUtils.setName(is, ChatColor.AQUA + type.getName()); - ISUtils.addLore(is, ChatColor.GREEN + "Health: " + format.format(type.getHealth())); - ISUtils.addLore(is, ChatColor.GOLD + "Maturation time: " + ItemAPI.setDisplayName(is, ChatColor.AQUA + type.getName()); + ItemAPI.addLore(is, ChatColor.GREEN + "Health: " + format.format(type.getHealth())); + ItemAPI.addLore(is, ChatColor.GOLD + "Maturation time: " + TextUtil.formatDuration(type.getMaturationTime(), TimeUnit.MILLISECONDS)); if (type.getAcidTime() > 0) { - ISUtils.addLore(is, ChatColor.GOLD + "Acid maturation time: " + ItemAPI.addLore(is, ChatColor.GOLD + "Acid maturation time: " + TextUtil.formatDuration(type.getAcidTime(), TimeUnit.MILLISECONDS)); } else { - ISUtils.addLore(is, ChatColor.GOLD + "Can not be used for acid"); + ItemAPI.addLore(is, ChatColor.GOLD + "Can not be used for acid"); } - ISUtils.addLore(is, + ItemAPI.addLore(is, ChatColor.WHITE + "Return chance: " + format.format(type.getReturnChance() * 100.0) + " %"); IClickable click = new DecorationStack(is); clicks.add(click); } - MultiPageView pageView = new MultiPageView((Player) sender, clicks, - ChatColor.BLUE + "Reinforcements", true); + MultiPageView pageView = new MultiPageView((Player) sender, clicks, ChatColor.BLUE + "Reinforcements", true); pageView.showScreen(); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java b/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java deleted file mode 100644 index 1d401716..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/database/CitadelReinforcementData.java +++ /dev/null @@ -1,199 +0,0 @@ -package vg.civcraft.mc.citadel.database; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -import org.bukkit.Location; -import org.bukkit.World; - -import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.model.ChunkCache; -import vg.civcraft.mc.citadel.model.ChunkCoord; -import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; -import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; - -public class CitadelReinforcementData { - - private ManagedDatasource db; - private Logger logger; - private ReinforcementTypeManager typeMan; - - public CitadelReinforcementData(ManagedDatasource db, Citadel plugin, ReinforcementTypeManager typeMan) { - this.db = db; - this.typeMan = typeMan; - this.logger = plugin.getLogger(); - } - - private void deleteReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement deleteStatement) - throws SQLException { - deleteStatement.setInt(1, rein.getLocation().getBlockX()); - deleteStatement.setInt(2, rein.getLocation().getBlockY()); - deleteStatement.setInt(3, rein.getLocation().getBlockZ()); - deleteStatement.setInt(4, cache.getWorldID()); - deleteStatement.addBatch(); - } - - public int getOrCreateWorldID(World world) { - try (Connection insertConn = db.getConnection(); - PreparedStatement insertWorld = insertConn - .prepareStatement("select id from reinforcement_worlds where uuid = ?;")) { - insertWorld.setString(1, world.getUID().toString()); - try (ResultSet rs = insertWorld.executeQuery()) { - if (rs.next()) { - return rs.getInt(1); - } - } - } catch (SQLException e) { - logger.severe("Failed to check for existence of world in db: " + e.toString()); - return -1; - } - try (Connection insertConn = db.getConnection(); - PreparedStatement insertWorld = insertConn.prepareStatement( - "insert into reinforcement_worlds (uuid, name) values(?,?);", - Statement.RETURN_GENERATED_KEYS);) { - insertWorld.setString(1, world.getUID().toString()); - insertWorld.setString(2, world.getName()); - insertWorld.execute(); - try (ResultSet rs = insertWorld.getGeneratedKeys()) { - if (!rs.next()) { - logger.info("Failed to insert world"); - return -1; - } - return rs.getInt(1); - } - } catch (SQLException e) { - logger.severe("Failed to insert world into db: " + e.toString()); - return -1; - } - } - - private void insertNewReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement insertStatement) - throws SQLException { - insertStatement.setInt(1, rein.getLocation().getBlockX()); - insertStatement.setInt(2, rein.getLocation().getBlockY()); - insertStatement.setInt(3, rein.getLocation().getBlockZ()); - insertStatement.setInt(4, cache.getChunkPair().getX()); - insertStatement.setInt(5, cache.getChunkPair().getZ()); - insertStatement.setInt(6, cache.getWorldID()); - insertStatement.setInt(7, rein.getType().getID()); - insertStatement.setDouble(8, rein.getHealth()); - insertStatement.setInt(9, rein.getGroupId()); - insertStatement.setBoolean(10, rein.isInsecure()); - insertStatement.setTimestamp(11, new Timestamp(rein.getCreationTime())); - insertStatement.addBatch(); - } - - public ChunkCache loadReinforcements(ChunkCoord coords, int worldID, World world) { - List reinforcements = new ArrayList<>(); - try (Connection loadConn = db.getConnection(); - PreparedStatement loadRein = loadConn.prepareStatement( - "select x, y, z, type_id, creation_time, health, group_id, insecure from reinforcements " - + "where chunk_x = ? and chunk_z = ? and world_id = ?;")) { - loadRein.setInt(1, coords.getX()); - loadRein.setInt(2, coords.getZ()); - loadRein.setInt(3, worldID); - try (ResultSet rs = loadRein.executeQuery()) { - while (rs.next()) { - int x = rs.getInt(1); - int y = rs.getInt(2); - int z = rs.getInt(3); - int typeId = rs.getInt(4); - long millisCreation = rs.getTimestamp(5).getTime(); - double health = rs.getDouble(6); - int groupId = rs.getInt(7); - boolean insecure = rs.getBoolean(8); - ReinforcementType type = typeMan.getById(typeId); - Location loc = new Location(world, x, y, z); - if (type == null) { - logger.warning("Ignoring reinforcement at " + loc.toString() + " because of invalid type id " - + typeId); - continue; - } - reinforcements - .add(new Reinforcement(loc, type, groupId, millisCreation, health, false, false, insecure)); - } - } - } catch (SQLException e) { - logger.severe("Failed to load reinforcements: " + e.toString()); - } - return new ChunkCache(coords, reinforcements, worldID); - } - - private void registerMigrations() { - db.registerMigration(13, false, "create table reinforcement_worlds (id int not null auto_increment primary key, uuid char(36) not null, " - + "name text not null, constraint uniqueUuid unique(uuid));", - "create table reinforcements (id int not null auto_increment primary key, x int not null, y int not null, z int not null, " - + "chunk_x int not null, chunk_z int not null, world_id int not null references reinforcement_worlds(id), " - + "type_id int not null, creation_time timestamp not null default now(), health double not null, " - + "group_id int not null, insecure boolean not null default false, index reinChunkLookUp(chunk_x, chunk_z, world_id)," - + "constraint reinforcementUniqueLocation unique (x,y,z,world_id));"); - } - - public void saveReinforcements(ChunkCache cache) { - if (!cache.isDirty()) { - return; - } - try (Connection conn = db.getConnection()) { - PreparedStatement insertStatement = conn - .prepareStatement("insert into reinforcements (x,y,z,chunk_x,chunk_z,world_id,type_id," - + "health,group_id,insecure,creation_time) values(?,?,?,?,?,?,?,?,?,?,?);"); - PreparedStatement deleteStatement = conn - .prepareStatement("delete from reinforcements where x = ? and y = ? and z = ? and world_id = ?;"); - PreparedStatement updateStatement = conn.prepareStatement("update reinforcements " - + "set insecure = ?, health=?, type_id=? group_id=? where x = ? and y = ? and z = ? and world_id = ?;"); - for (Reinforcement rein : cache.getAllAndCleanUp()) { - if (!rein.isDirty()) { - continue; - } - if (rein.isNew()) { - if (!rein.isBroken()) { - insertNewReinforcement(cache, rein, insertStatement); - } - } else { - if (rein.isBroken()) { - deleteReinforcement(cache, rein, deleteStatement); - } else { - updateReinforcement(cache, rein, updateStatement); - } - } - rein.setDirty(false); - } - // deletes before inserts in case a reinforcement was destroyed and then - // recreated - deleteStatement.executeBatch(); - insertStatement.executeBatch(); - updateStatement.executeBatch(); - cache.setDirty(false); - } catch (SQLException e) { - logger.severe("Failed to update reinforcement data: " + e.toString()); - } - } - - public boolean startUp() { - registerMigrations(); - return db.updateDatabase(); - } - - private void updateReinforcement(ChunkCache cache, Reinforcement rein, PreparedStatement updateStatement) - throws SQLException { - updateStatement.setBoolean(1, rein.isInsecure()); - updateStatement.setDouble(2, rein.getHealth()); - updateStatement.setInt(3, rein.getType().getID()); - updateStatement.setInt(4, rein.getGroupId()); - updateStatement.setInt(5, rein.getLocation().getBlockX()); - updateStatement.setInt(6, rein.getLocation().getBlockY()); - updateStatement.setInt(7, rein.getLocation().getBlockZ()); - updateStatement.setInt(8, cache.getWorldID()); - updateStatement.addBatch(); - } - -} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index def3b78e..c151fd5f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -9,6 +9,8 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.Container; +import org.bukkit.block.data.Openable; +import org.bukkit.block.data.type.Comparator; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -20,20 +22,18 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.world.StructureGrowEvent; -import org.bukkit.material.Comparator; -import org.bukkit.material.Openable; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.Reinforcement; public class BlockListener implements Listener { - public static final List all_sides = Arrays.asList(BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, + public static final List ALL_SIDES = Arrays.asList(BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - public static final List planar_sides = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, + public static final List PLANAR_SIDES = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); private static final Material matfire = Material.FIRE; @@ -42,7 +42,7 @@ public class BlockListener implements Listener { public void blockBreakEvent(BlockBreakEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } - + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void blockPlaceEvent(BlockPlaceEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBlockPlace(event); @@ -97,12 +97,12 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { if (event.getBlockPlaced().getType() != Material.COMPARATOR) { return; } - Comparator comparator = (Comparator) event.getBlockPlaced().getState().getData(); + Comparator comparator = (Comparator) event.getBlockPlaced().getBlockData(); Block block = event.getBlockPlaced().getRelative(comparator.getFacing().getOppositeFace()); // Check if the comparator is placed against something with an inventory if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), block)) { event.setCancelled(true); - Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(event.getPlayer(), ChatColor.RED, "You can not place this because it'd allow bypassing a nearby reinforcement"); return; } @@ -111,9 +111,8 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { if (ReinforcementLogic.isPreventingBlockAccess(event.getPlayer(), block.getRelative(comparator.getFacing().getOppositeFace()))) { event.setCancelled(true); - Utility.sendAndLog(event.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(event.getPlayer(), ChatColor.RED, "You can not place this because it'd allow bypassing a nearby reinforcement"); - return; } } } @@ -169,18 +168,18 @@ public void openContainer(PlayerInteractEvent e) { if (rein == null) { return; } - if (e.getClickedBlock().getState() instanceof Container) { + if (e.getClickedBlock().getBlockData() instanceof Container) { if (!rein.hasPermission(e.getPlayer(), Citadel.chestPerm)) { e.setCancelled(true); - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } return; } - if (e.getClickedBlock().getState().getData() instanceof Openable) { + if (e.getClickedBlock().getBlockData() instanceof Openable) { if (!rein.hasPermission(e.getPlayer(), Citadel.doorPerm)) { e.setCancelled(true); - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } } @@ -194,15 +193,13 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { return; } - for (BlockFace face : planar_sides) { + for (BlockFace face : PLANAR_SIDES) { Block rel = e.getBlock().getRelative(face); - if (rel != null && rel.getType() == mat) { - if (ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { - e.setCancelled(true); - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, - "You can not place this because it'd allow bypassing a nearby reinforcement"); - break; - } + if (rel.getType() == mat && ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { + e.setCancelled(true); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, + "You can not place this because it'd allow bypassing a nearby reinforcement"); + break; } } } @@ -210,13 +207,10 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { // remove reinforced air @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void removeReinforcedAir(BlockPlaceEvent e) { - if (e.getBlockReplacedState() == null) { - return; - } if (e.getBlockReplacedState().getType() != Material.AIR) { return; } - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); + Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(e.getBlock()); if (rein != null) { rein.setHealth(-1); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java deleted file mode 100644 index 1cc3b713..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/listener/ChunkLoadListener.java +++ /dev/null @@ -1,35 +0,0 @@ -package vg.civcraft.mc.citadel.listener; - -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.ChunkLoadEvent; -import org.bukkit.event.world.ChunkUnloadEvent; - -import vg.civcraft.mc.citadel.Citadel; - -public class ChunkLoadListener implements Listener { - - public ChunkLoadListener() { - for(World world : Bukkit.getWorlds()) { - for(Chunk chunk : world.getLoadedChunks()) { - Citadel.getInstance().getReinforcementManager().loadChunkData(chunk); - } - } - } - - @EventHandler - public void chunkLoad(ChunkLoadEvent e) { - Citadel.getInstance().getReinforcementManager().loadChunkData(e.getChunk()); - } - - @EventHandler - public void chunkUnload(ChunkUnloadEvent e) { - Citadel.getInstance().getReinforcementManager().unloadChunkData(e.getChunk()); - } - - - -} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 0594ed68..208e07d0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -22,8 +22,9 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.model.GlobalReinforcementManager; +import vg.civcraft.mc.citadel.model.CitadelChunkData; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMetaView; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; @@ -112,14 +113,14 @@ public void run() { // prevent creating golems from reinforced blocks @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void spawn(CreatureSpawnEvent cse) { - GlobalReinforcementManager reinforcementManager = Citadel.getInstance().getReinforcementManager(); + BlockBasedChunkMetaView chunkManager = Citadel.getInstance().getChunkMetaManager(); EntityType type = cse.getEntityType(); if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER && type != EntityType.SILVERFISH) { return; } for (Block block : getGolemBlocks(type, cse.getLocation().getBlock())) { - Reinforcement reinforcement = reinforcementManager.getReinforcement(block); + Reinforcement reinforcement = chunkManager.get(block); if (reinforcement != null) { cse.setCancelled(true); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index c44c30f6..5a4967b6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -8,8 +8,13 @@ import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Openable; +import org.bukkit.block.data.type.Door; import org.bukkit.block.data.type.Switch; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -20,11 +25,6 @@ import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.material.Button; -import org.bukkit.material.Door; -import org.bukkit.material.MaterialData; -import org.bukkit.material.Openable; -import org.bukkit.material.PressurePlate; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; @@ -105,13 +105,13 @@ public void pressButton(PlayerInteractEvent e) { if (!(e.getClickedBlock().getBlockData() instanceof Switch)) { return; } - Button button = (Button) (e.getClickedBlock().getState().getData()); + Switch button = (Switch) (e.getClickedBlock().getBlockData()); Block buttonBlock = e.getClickedBlock(); - Block attachedBlock = e.getClickedBlock().getRelative(button.getAttachedFace().getOppositeFace()); + Block attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); // prepare all sides of button itself - setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getAttachedFace()); + setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getFacing()); // prepare all sides of the block attached to - setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getAttachedFace().getOppositeFace()); + setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getFacing().getOppositeFace()); } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @@ -121,7 +121,7 @@ public void redstonePower(BlockRedstoneEvent bre) { return; } Block block = bre.getBlock(); - MaterialData blockData = block.getState().getData(); + BlockData blockData = block.getBlockData(); if (!(blockData instanceof Openable)) { return; } @@ -156,12 +156,12 @@ public void redstonePower(BlockRedstoneEvent bre) { } private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { - for (BlockFace face : BlockListener.all_sides) { + for (BlockFace face : BlockListener.ALL_SIDES) { if (face == skip) { continue; } Block rel = block.getRelative(face); - MaterialData blockData = rel.getState().getData(); + BlockData blockData = rel.getBlockData(); if (!(blockData instanceof Openable)) { continue; } @@ -187,7 +187,9 @@ public void stepPressurePlate(PlayerInteractEvent e) { if (e.getAction() != Action.PHYSICAL) { return; } - if (!(e.getClickedBlock().getState().getData() instanceof PressurePlate)) { + Material mat = e.getClickedBlock().getType(); + if (mat != Material.STONE_PRESSURE_PLATE && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE + && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java deleted file mode 100644 index 1e63e68d..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCache.java +++ /dev/null @@ -1,144 +0,0 @@ -package vg.civcraft.mc.citadel.model; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.bukkit.Location; - -public class ChunkCache { - - private class Coords implements Comparable { - - private int x; - private int y; - private int z; - - Coords(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - Coords(Location loc) { - this.x = loc.getBlockX(); - this.y = loc.getBlockY(); - this.z = loc.getBlockZ(); - } - - @Override - public int compareTo(Coords coords) { - // y first because we have the most variety here - if (coords.y != y) { - return Integer.compare(y, coords.y); - } - if (coords.x != x) { - return Integer.compare(x, coords.x); - } - if (coords.z != z) { - return Integer.compare(z, coords.z); - } - return 0; - } - - @Override - public boolean equals(Object o) { - Coords coords = (Coords) o; - return coords.y == y && coords.x == x && coords.z == z; - } - } - - private final ChunkCoord chunkPair; - private Map reinforcements; - private List deletedReinforcements; - private boolean isDirty; - - private final int worldID; - - public ChunkCache(ChunkCoord chunkPair, Collection reins, int worldID) { - this.reinforcements = new TreeMap<>(); - for (Reinforcement rein : reins) { - rein.setOwningCache(this); - reinforcements.put(new Coords(rein.getLocation()), rein); - } - this.chunkPair = chunkPair; - this.worldID = worldID; - this.isDirty = false; - } - - /** - * Gets all existing reinforcements within this chunk - * - * @return All reinforcements - */ - public Collection getAll() { - List reins = new ArrayList<>(); - reins.addAll(reinforcements.values()); - return reins; - } - - /** - * Used when dumping all reinforcements to the database. Returns not only the - * existing reinforcements, but also the ones deleted and not yet removed from - * the database - * - * @return All reinforcements possibly needing to be persisted to the database - */ - public Collection getAllAndCleanUp() { - List reins = new ArrayList<>(); - if (deletedReinforcements != null) { - reins.addAll(deletedReinforcements); - deletedReinforcements.clear(); - } - reins.addAll(reinforcements.values()); - return reins; - } - - public ChunkCoord getChunkPair() { - return chunkPair; - } - - public Reinforcement getReinforcement(int x, int y, int z) { - return reinforcements.get(new Coords(x, y, z)); - } - - public int getWorldID() { - return worldID; - } - - public void insertReinforcement(Reinforcement rein) { - Coords key = new Coords(rein.getLocation()); - if (reinforcements.containsKey(key)) { - throw new IllegalStateException( - "Trying to insert reinforcement at " + rein.getLocation().toString() + ", but one already existed"); - } - rein.setOwningCache(this); - reinforcements.put(key, rein); - if (rein.isDirty) { - this.isDirty = true; - } - } - - public boolean isDirty() { - return isDirty; - } - - public void removeReinforcement(Reinforcement rein) { - Coords key = new Coords(rein.getLocation()); - Reinforcement removed = reinforcements.remove(key); - if (removed != rein) { - throw new IllegalStateException("Removed wrong reinforcement at " + rein.getLocation().toString()); - } - if (deletedReinforcements == null) { - deletedReinforcements = new LinkedList<>(); - } - deletedReinforcements.add(rein); - } - - public void setDirty(boolean dirty) { - this.isDirty = dirty; - } -} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java new file mode 100644 index 00000000..a256efb0 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java @@ -0,0 +1,17 @@ +package vg.civcraft.mc.citadel.model; + +import com.google.gson.JsonObject; + +import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMeta; + +public class CitadelChunkData extends BlockBasedChunkMeta { + + public CitadelChunkData(boolean isNew) { + super(isNew); + } + + public static CitadelChunkData deserialize(JsonObject json) { + return (CitadelChunkData) BlockBasedChunkMeta.deserialize(new CitadelChunkData(false), json, Reinforcement.class); + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index b0d41dda..3dbf9cdd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -10,7 +10,7 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.InformationState; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; @@ -84,6 +84,6 @@ public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) { args.put("max_health",reinHealthFormatter.format(type.getHealth())); args.put("type", type.getName()); args.put("health_color", InformationState.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); - Utility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); + CitadelUtility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java deleted file mode 100644 index bcc4539b..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/model/GlobalReinforcementManager.java +++ /dev/null @@ -1,173 +0,0 @@ -package vg.civcraft.mc.citadel.model; - -import java.util.Collection; -import java.util.Map; -import java.util.TreeMap; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.block.Block; - -import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.database.CitadelReinforcementData; - -public class GlobalReinforcementManager { - - private Map uuidToInternalID; - private Map worldToManager; - private CitadelReinforcementData dao; - - public GlobalReinforcementManager(CitadelReinforcementData dao) { - this.uuidToInternalID = new TreeMap<>(); - this.worldToManager = new TreeMap<>(); - this.dao = dao; - } - - /** - * Saves all reinforcements out to the database - */ - public void flushAll() { - for (WorldReinforcementManager man : worldToManager.values()) { - man.invalidateAllReinforcements(); - } - } - - /** - * Gets all reinforcements in a chunk. Only use this if you know what you're - * doing - * - * @param chunk Chunk to get reinforcements for - * @return All reinforcements within the chunk - */ - public Collection getAllReinforcements(Chunk chunk) { - if (chunk == null) { - throw new IllegalArgumentException("Chunk can not be null"); - } - WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); - if (worldManager == null) { - throw new IllegalStateException("No world manager for reinforcement in " + chunk.getWorld().toString()); - } - return worldManager.getAllReinforcements(chunk); - } - - /** - * Returns the Reinforcement for the specified block. - * - * @param block Block to get reinforcement for - * @return Reinforcement of the block if one exists, otherwise null - */ - public Reinforcement getReinforcement(Block block) { - return getReinforcement(block.getLocation()); - } - - /** - * Returns the Reinforcement for the specified block. World is not checked at - * this stage - * - * @param block Location to get reinforcement for - * @return Reinforcement at the location if one exists, otherwise null - */ - public Reinforcement getReinforcement(Location location) { - WorldReinforcementManager worldManager = worldToManager.get(location.getWorld().getUID()); - if (worldManager == null) { - return null; - } - return worldManager.getReinforcement(location); - } - - /** - * Inserts a new reinforcement into the cache. Should only be used for - * reinforcements created just now - * - * @param loc Location of the reinforcement - * @param rein Reinforcement created - */ - public void insertReinforcement(Reinforcement rein) { - WorldReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); - if (worldManager == null) { - if (!registerWorld(rein.getLocation().getWorld())) { - throw new IllegalStateException("Failed to register world"); - } - worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); - } - worldManager.insertReinforcement(rein); - } - - /** - * Checks if the given block is reinforced or not. - * - * @param b The block of the potential reinforcement. - * @return True if a reinforcement exists for the given block, false otherwise - */ - public boolean isReinforced(Block b) { - return isReinforced(b.getLocation()); - } - - /** - * Checks if the block a tthe given location is reinforced or not. Priorize - * using getReinforcement() and doing a null check yourself if you intend to do - * something with the reinforcement to avoid a double lookup - * - * @param loc The location of the potential reinforcement. - * @return True if a reinforcement exists at the given location, false otherwise - */ - public boolean isReinforced(Location loc) { - return getReinforcement(loc) != null; - } - - public boolean registerWorld(World world) { - int id = dao.getOrCreateWorldID(world); - if (id == -1) { - // very bad - return false; - } - uuidToInternalID.put(world.getUID(), id); - WorldReinforcementManager manager = new WorldReinforcementManager(dao, id, world); - worldToManager.put(world.getUID(), manager); - return true; - } - - /** - * Removes a reinforcement from the immediate cache after it was destroyed - * - * @param rein The reinforcement destroyed - */ - public void removeReinforcement(Reinforcement rein) { - WorldReinforcementManager worldManager = worldToManager.get(rein.getLocation().getWorld().getUID()); - if (worldManager == null) { - throw new IllegalStateException("No world manager for reinforcement at " + rein.getLocation().toString()); - } - worldManager.removeReinforcement(rein); - } - - public boolean setup() { - for (World world : Bukkit.getWorlds()) { - boolean worked = registerWorld(world); - if (!worked) { - return false; - } - } - return true; - } - - public void loadChunkData(Chunk chunk) { - Utility.debugLog("Loading reinforcement data for chunk at " + chunk.toString()); - WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); - if (worldManager == null) { - throw new IllegalStateException("No world manager for chunk at " + chunk.toString()); - } - worldManager.loadChunkData(chunk); - } - - public void unloadChunkData(Chunk chunk) { - Utility.debugLog("Unloading reinforcement data for chunk at " + chunk.toString()); - WorldReinforcementManager worldManager = worldToManager.get(chunk.getWorld().getUID()); - if (worldManager == null) { - throw new IllegalStateException("No world manager for chunk at " + chunk.toString()); - } - worldManager.unloadChunkData(chunk); - } -} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index b49e134a..897e80cd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -2,50 +2,47 @@ import java.util.Random; import java.util.UUID; +import java.util.logging.Level; import org.bukkit.Location; import org.bukkit.entity.Player; +import com.google.gson.JsonObject; + import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMeta; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockDataObject; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkMeta; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Reinforcement { +public class Reinforcement extends BlockDataObject { private static Random rng = new Random(); private final long creationTime; private ReinforcementType type; - private final Location loc; private double health; - protected boolean isDirty; - protected boolean isNew; private int groupId; private boolean insecure; - private ChunkCache owningCache; public Reinforcement(Location loc, ReinforcementType type, Group group) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), true, true, false); + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), false); } public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, - boolean isDirty, boolean isNew, boolean insecure) { - if (loc == null) { - throw new IllegalArgumentException("Location for reinforcement can not be null"); - } + boolean insecure) { + super(loc); if (type == null) { throw new IllegalArgumentException("Reinforcement type for reinforcement can not be null"); } - this.loc = loc; this.type = type; this.creationTime = creationTime; this.health = health; - this.isDirty = isDirty; this.groupId = groupID; - this.isNew = isNew; this.insecure = insecure; } @@ -84,13 +81,6 @@ public double getHealth() { return health; } - /** - * @return Location of the Reinforcement. - */ - public Location getLocation() { - return loc; - } - /** * Gets the center of the block at the location of this reinforcement. * getLocation() will return the integer coordinates of the reinforcement while @@ -99,7 +89,7 @@ public Location getLocation() { * @return Center of the block */ public Location getBlockCenter() { - Location copy = loc.clone(); + Location copy = location.clone(); copy.add(0.5, 0.5, 0.5); return copy; } @@ -134,13 +124,6 @@ public boolean isBroken() { return health <= 0; } - /** - * @return Whether this reinforcement needs to be saved to the database - */ - public boolean isDirty() { - return isDirty; - } - /** * @return Whether the reinforcement is insecure, meaning it ignores Citadel * restrictions on hoppers etc. @@ -158,31 +141,6 @@ public boolean isMature() { return System.currentTimeMillis() - creationTime > type.getMaturationTime(); } - /** - * @return True if the reinforcement has not been written to the database since - * its creation - */ - public boolean isNew() { - return isNew; - } - - /** - * Sets if this reinforcement needs to be saved to the database or not. Will - * automatically update the dirty flag of the cache holding this reinforcement - * as well - * - * @param dirty - */ - public void setDirty(boolean dirty) { - this.isDirty = dirty; - if (!dirty) { - // we saved to the database, so we are no longer new now - isNew = false; - } else { - owningCache.setDirty(true); - } - } - public void setGroup(Group group) { if (group == null) { throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); @@ -200,16 +158,15 @@ public void setHealth(double health) { this.health = health; setDirty(true); if (health <= 0) { - Citadel.getInstance().getReinforcementManager().removeReinforcement(this); + getOwningCache().remove(this); } } - - /** - * Sets which cache this reinforcement belongs to. Cache is expected to set this - * when beginning to track the reinforcement - */ - void setOwningCache(ChunkCache cache) { - this.owningCache = cache; + + @Override + @SuppressWarnings("unchecked") + protected BlockBasedChunkMeta getOwningCache() { + //doing this covariant overwrite makes typing easier in other places + return (BlockBasedChunkMeta) super.getOwningCache(); } public void setType(ReinforcementType type) { @@ -238,4 +195,29 @@ public boolean rollForItemReturn() { baseChance *= relativeHealth; return rng.nextDouble() <= baseChance; } + + @Override + public void concreteSerialize(JsonObject json) { + json.addProperty("c", creationTime); + json.addProperty("t", type.getID()); + json.addProperty("h", health); + json.addProperty("g", groupId); + if (insecure) { + json.addProperty("i", ""); + } + } + + public static Reinforcement deserialize(JsonObject json, ChunkMeta meta) { + long creationTime = json.get("c").getAsLong(); + int reinforcementTypeId = json.get("t").getAsInt(); + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getById(reinforcementTypeId); + if (type == null) { + Citadel.getInstance().getLogger().log(Level.SEVERE, "Could not load reinforcement with id " + reinforcementTypeId); + } + double health = json.get("h").getAsDouble(); + int groupId = json.get("g").getAsInt(); + boolean insecure = json.has("i"); + Location loc = parseLocationFromJson(json, meta); + return new Reinforcement(loc, type, groupId, creationTime, health, insecure); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java deleted file mode 100644 index 0fc5119c..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/model/WorldReinforcementManager.java +++ /dev/null @@ -1,145 +0,0 @@ -package vg.civcraft.mc.citadel.model; - -import java.util.Collection; - -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.cache.RemovalListener; -import com.google.common.cache.RemovalNotification; - -import vg.civcraft.mc.citadel.database.CitadelReinforcementData; - -public class WorldReinforcementManager { - - private final int worldID; - private final LoadingCache reinforcements; - private World world; - - public WorldReinforcementManager(CitadelReinforcementData db, int worldID, World world) { - this.worldID = worldID; - this.world = world; - this.reinforcements = CacheBuilder.newBuilder().removalListener(new RemovalListener() { - @Override - public void onRemoval(RemovalNotification removal) { - ChunkCache chunk = removal.getValue(); - if (chunk.isDirty()) { - db.saveReinforcements(chunk); - } - } - }).build(new CacheLoader() { - @Override - public ChunkCache load(ChunkCoord loc) throws Exception { - return db.loadReinforcements(loc, worldID, world); - } - /* probably not needed - @Override - public ListenableFuture reload(ChunkCoord loc, ChunkCache oldValue) throws Exception { - // this will only be called in super rare race conditions - return Futures.immediateFuture(oldValue); - } */ - }); - } - - /** - * Gets all reinforcements in a chunk. Only use this if you know what you're - * doing - * - * @param chunk Chunk to get reinforcements for - * @return All reinforcements within the chunk - */ - public Collection getAllReinforcements(Chunk chunk) { - ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forChunk(chunk)); - if (cache == null) { - throw new IllegalStateException("Can not retrieve reinforcements for unloaded chunks"); - } - return cache.getAll(); - } - - /** - * Returns the Reinforcement for the specified block. World is not checked at - * this stage - * - * @param block Location to get reinforcement for - * @return Reinforcement at the location if one exists, otherwise null - */ - public Reinforcement getReinforcement(Location loc) { - if (loc == null) { - throw new IllegalArgumentException("Can not get reinforcement for null location"); - } - ChunkCache cache = reinforcements.getIfPresent(ChunkCoord.forLocation(loc)); - if (cache == null) { - throw new IllegalStateException( - "You can not check reinforcements for unloaded chunks. Load the chunk first"); - } - Reinforcement rein = cache.getReinforcement(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - if (rein == null || rein.isBroken()) { - return null; - } - return rein; - } - - /** - * @return Internal id of the world for which this instance manages - * reinforcements - */ - public int getWorldID() { - return worldID; - } - - public void insertReinforcement(Reinforcement reinforcement) { - ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); - ChunkCache cache = reinforcements.getIfPresent(key); - if (cache == null) { - throw new IllegalStateException("Chunk for created reinforcement was not loaded"); - } - cache.insertReinforcement(reinforcement); - } - - /** - * Used to flush all the reinforcements to the db on shutdown. Can be called - * else where if too a manual flush is wanted. - */ - public void invalidateAllReinforcements() { - reinforcements.invalidateAll(); - reinforcements.cleanUp(); - } - - /** - * Checks if the location is reinforced or not. - * - * @param loc The location of the potential reinforcement. - * @return True if a reinforcement exists at the given location, false otherwise - */ - public boolean isReinforced(Location loc) { - return getReinforcement(loc) != null; - } - - public void removeReinforcement(Reinforcement reinforcement) { - ChunkCoord key = ChunkCoord.forLocation(reinforcement.getLocation()); - ChunkCache cache = reinforcements.getIfPresent(key); - if (cache == null) { - throw new IllegalStateException("Chunk for deleted reinforcement was not loaded"); - } - cache.removeReinforcement(reinforcement); - } - - /** - * @return World for which this instance is managing reinforcements - */ - public World getWorld() { - return world; - } - - void loadChunkData(Chunk chunk) { - reinforcements.refresh(ChunkCoord.forChunk(chunk)); - } - - void unloadChunkData(Chunk chunk) { - reinforcements.invalidate(ChunkCoord.forChunk(chunk)); - } -} diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index c4a00d70..21020b70 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -13,8 +13,8 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -57,7 +57,7 @@ public void handleBreakBlock(BlockBreakEvent e) { } return; } - if (Utility.isPlant(e.getBlock())) { + if (CitadelUtility.isPlant(e.getBlock())) { if (rein.hasPermission(e.getPlayer(), Citadel.cropsPerm) && !e.getBlock().getLocation().equals(rein.getLocation())) { // allow, because player has crop permission and the only reinforcement @@ -66,7 +66,7 @@ public void handleBreakBlock(BlockBreakEvent e) { } } if (hasAccess) { - Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.GREEN, "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); } e.setCancelled(true); @@ -85,7 +85,7 @@ public void handleBreakBlock(BlockBreakEvent e) { protected static void giveReinforcement(Location location, Player p, ReinforcementType type) { HashMap notAdded = p.getInventory().addItem(type.getItem().clone()); if (!notAdded.isEmpty()) { - Utility.dropItemAtLocation(location, type.getItem().clone()); + CitadelUtility.dropItemAtLocation(location, type.getItem().clone()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index 4d426bf9..f51bd9b1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.group.Group; @@ -35,7 +35,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { Player player = e.getPlayer(); if (placed == null) { // no idea if this can even happen, but let's be safe - Utility.sendAndLog(player, ChatColor.RED, "No block found in your hand?"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "No block found in your hand?"); return; } // check if we have a setup for this block, weneed a copy for lookup so we can @@ -44,11 +44,11 @@ public void handleBlockPlace(BlockPlaceEvent e) { lookUpCopy.setAmount(1); ReinforcingSetup setup = setups.get(lookUpCopy); if (setup == null) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "No setup configured for this block type, no reinforcement was applied"); return; } - boolean hadError = Utility.attemptReinforcementCreation(e.getBlock(), setup.type, setup.group, e.getPlayer()); + boolean hadError = CitadelUtility.attemptReinforcementCreation(e.getBlock(), setup.type, setup.group, e.getPlayer()); if (hadError) { e.setCancelled(true); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); @@ -63,13 +63,13 @@ public void addSetup(ItemStack forBlock, ReinforcementType type, Group group) { Player player = Bukkit.getPlayer(uuid); if (player != null) { if (existing != null) { - Utility.sendAndLog(player, ChatColor.GOLD, + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Replaced existing setup with " + ChatColor.AQUA + existing.type.getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + existing.group.getName() + ChatColor.GOLD + "for " + copy.getType() + " with " + ChatColor.AQUA + type.getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + group.getName()); } else { - Utility.sendAndLog(player, ChatColor.GOLD, copy.getType() + " will be reinforced with " + ChatColor.AQUA + CitadelUtility.sendAndLog(player, ChatColor.GOLD, copy.getType() + " will be reinforced with " + ChatColor.AQUA + type.getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + group.getName()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 58dec28e..95ebeedd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -6,7 +6,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.group.Group; @@ -37,7 +37,7 @@ public ReinforcementType getType() { @Override public void handleBlockPlace(BlockPlaceEvent e) { - boolean hadError = Utility.attemptReinforcementCreation(e.getBlock(), type, group, e.getPlayer()); + boolean hadError = CitadelUtility.attemptReinforcementCreation(e.getBlock(), type, group, e.getPlayer()); if (hadError) { e.setCancelled(true); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index 6fd801f0..abe7a36b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -11,8 +11,8 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -85,7 +85,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); if (rein == null) { - Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); return; } Player player = e.getPlayer(); @@ -119,7 +119,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); } } - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); + CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); HologramManager holoManager = Citadel.getInstance().getHologramManager(); if (holoManager != null) { holoManager.showInfoHolo(rein, player); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index c8cbddc6..5291806b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -6,8 +6,8 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.Reinforcement; public class InsecureState extends AbstractPlayerState { @@ -35,14 +35,14 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (rein.hasPermission(e.getPlayer(), Citadel.insecurePerm)) { rein.toggleInsecure(); if (rein.isInsecure()) { - Utility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, e.getClickedBlock().getType().name() + " is now insecure"); } else { - Utility.sendAndLog(e.getPlayer(), ChatColor.GREEN, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.GREEN, e.getClickedBlock().getType().name() + " is now secure"); } } else { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "You are not allowed to make this reinforcement insecure"); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You are not allowed to make this reinforcement insecure"); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index 08e39dee..b9362da8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -6,8 +6,8 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; @@ -32,34 +32,34 @@ public void handleInteractBlock(PlayerInteractEvent e) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); Player player = e.getPlayer(); if (rein == null) { - Utility.sendAndLog(player, ChatColor.RED, "This block is not reinforced"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "This block is not reinforced"); return; } if (!rein.hasPermission(player, Citadel.repairPerm)) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to repair reinforcements on this group"); return; } if (rein.getHealth() >= rein.getType().getHealth()) { if (rein.hasPermission(player, Citadel.infoPerm)) { - Utility.sendAndLog(player, ChatColor.GOLD, + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + InformationState.formatHealth(rein) + ChatColor.GOLD + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + rein.getGroup().getName()); } else { - Utility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + InformationState.formatHealth(rein) + ChatColor.GOLD + " health"); } return; } ItemMap playerMap = new ItemMap(player.getInventory()); if (playerMap.getAmount(rein.getType().getItem()) <= 0) { - Utility.sendAndLog(player, ChatColor.RED, "You don't have the item required to repair " + ChatColor.AQUA + CitadelUtility.sendAndLog(player, ChatColor.RED, "You don't have the item required to repair " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " reinforcements"); return; } if (!rein.rollForItemReturn()) { - if (!Utility.consumeReinforcementItems(player, rein.getType())) { + if (!CitadelUtility.consumeReinforcementItems(player, rein.getType())) { return; } } @@ -70,7 +70,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { + e.getClickedBlock().getLocation().toString() + " via repair"); } rein.setHealth(-1); - ReinforcementLogic.createReinforcement(rein.getLocation().getBlock(), rein.getType(), rein.getGroup()); + ReinforcementLogic.createReinforcement(player, rein.getLocation().getBlock(), rein.getType(), rein.getGroup()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index 7ba08c52..4f95c461 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -7,7 +7,7 @@ import org.bukkit.ChatColor; import org.bukkit.entity.Player; -import vg.civcraft.mc.citadel.Utility; +import vg.civcraft.mc.citadel.CitadelUtility; public class PlayerStateManager { @@ -39,7 +39,7 @@ public void setState(Player player, AbstractPlayerState state) { state = new NormalState(player); } playerStateMap.put(player.getUniqueId(), state); - Utility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() + ChatColor.GOLD + " from " + ChatColor.YELLOW + existingState.getName()); } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 2a3e2f12..77cb50e6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -7,8 +7,8 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.Utility; import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; import vg.civcraft.mc.citadel.events.ReinforcementGroupChangeEvent; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -46,7 +46,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { e.setCancelled(true); // does group still exist? if (!group.isValid()) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "The group " + group.getName() + " seems to have been deleted in the mean time"); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); return; @@ -54,25 +54,25 @@ public void handleInteractBlock(PlayerInteractEvent e) { Player player = e.getPlayer(); // does the player have an item? if (e.getItem() == null) { - Utility.sendAndLog(player, ChatColor.RED, "You have nothing in your hand to reinforce with"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You have nothing in your hand to reinforce with"); return; } ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(e.getItem()); // is it a valid item to reinforce with if (type == null) { - Utility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); + CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); return; } // can the item reinforce the clicked block if (!type.canBeReinforced(e.getClickedBlock().getType())) { - Utility.sendAndLog(player, ChatColor.RED, + CitadelUtility.sendAndLog(player, ChatColor.RED, type.getName() + " can not reinforce " + e.getClickedBlock().getType()); return; } // does the player have permission to reinforce on that group if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), PermissionType.getPermission(Citadel.reinforcePerm))) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); return; @@ -81,7 +81,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { // if reinforcement exists, check if player has permission to edit it if (rein != null) { if (!rein.hasPermission(e.getPlayer(), Citadel.bypassPerm)) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You do not have permission to bypass reinforcements on " + group.getName()); return; } @@ -90,12 +90,12 @@ public void handleInteractBlock(PlayerInteractEvent e) { // check inventory for reinforcement item ItemMap toConsume = new ItemMap(type.getItem()); if (!toConsume.isContainedIn(player.getInventory())) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); return; } // consume item from inventory if (!toConsume.removeSafelyFrom(player.getInventory())) { - Utility.sendAndLog(e.getPlayer(), ChatColor.RED, + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "Failed to remove reinforcement item from your inventory"); return; } @@ -109,7 +109,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { + e.getClickedBlock().getLocation().toString()); } // just create new reinforcement - ReinforcementLogic.createReinforcement(e.getClickedBlock(), type, group); + ReinforcementLogic.createReinforcement(player, e.getClickedBlock(), type, group); } else { // replace existing one boolean changedGroup = false; @@ -130,15 +130,15 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (!rcte.isCancelled()) { giveReinforcement(rein.getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); rein.setHealth(-1); - ReinforcementLogic.createReinforcement(rein.getLocation().getBlock(), type, group); - Utility.sendAndLog(player, ChatColor.GREEN, + ReinforcementLogic.createReinforcement(player, rein.getLocation().getBlock(), type, group); + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Updated reinforcement to " + rein.getType().getName() + " on " + group.getName()); } else if (changedGroup) { - Utility.sendAndLog(player, ChatColor.GREEN, + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Updated group to " + ChatColor.LIGHT_PURPLE + group.getName()); } } else if (changedGroup) { - Utility.sendAndLog(player, ChatColor.GREEN, + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Updated group to " + ChatColor.LIGHT_PURPLE + group.getName()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java index 22c1c793..e2066c94 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java @@ -3,6 +3,8 @@ import org.bukkit.Location; import org.bukkit.Particle; +import vg.civcraft.mc.citadel.model.Reinforcement; + public class ReinforcementEffect { private Particle particle; private float offsetX; @@ -77,6 +79,15 @@ public float getSpeed() { public void playEffect(Location location) { location.getWorld().spawnParticle(particle, location, particleCount, offsetX, offsetY, offsetZ, speed, null); } + + /** + * Display an effect defined in the config around a reinforcement. + * + * @param Reinforcement to play effect around + */ + public void playEffect(Reinforcement reinforcement) { + playEffect(reinforcement.getBlockCenter()); + } @Override public String toString() { From 1586b67203d79cfa7ac39fd90dc872c89d90724e Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 13:05:13 +0100 Subject: [PATCH 118/255] Moved back to DevotedMC repo --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 04a35b75..7284d7e0 100644 --- a/pom.xml +++ b/pom.xml @@ -58,14 +58,14 @@ - - civ-jenkins - http://test.civclassic.com:8080/plugin/repository/everything/ - spigot-repo https://hub.spigotmc.org/nexus/content/groups/public/ + + devoted-repo + https://build.devotedmc.com/plugin/repository/everything/ + From f971eed3186c81e372f1c3ae486d899a71dec131 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:05:01 +0100 Subject: [PATCH 119/255] Added config option, defaults to true --- config.yml | 1 + src/vg/civcraft/mc/citadel/CitadelConfigManager.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/config.yml b/config.yml index 5077882f..ac0cee6e 100644 --- a/config.yml +++ b/config.yml @@ -149,3 +149,4 @@ show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login default_bypass_mode: true break_acided_block_naturally: false +hangers_inherit_reinforcement: true diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 7b3c35db..c565ae3f 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -257,4 +257,8 @@ public static boolean breakAcidedBlockNaturally() { return config.getBoolean("break_acided_block_naturally", false); } + public static boolean hangersInheritReinforcements() { + return config.getBoolean("hangers_inherit_reinforcement", true); + } + } From 1a81acec0a7c7d84829ae1b275ebdbf50e94091f Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:11:13 +0100 Subject: [PATCH 120/255] Added disable_hanging_reinforcement config option As the hanging entity reinforcement events were non-function, it would be best not to force new behaviour on server owners. This option defaults to true, so by default the events will remain disabled. --- config.yml | 1 + src/vg/civcraft/mc/citadel/CitadelConfigManager.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/config.yml b/config.yml index ac0cee6e..46248551 100644 --- a/config.yml +++ b/config.yml @@ -149,4 +149,5 @@ show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login default_bypass_mode: true break_acided_block_naturally: false +disable_hanging_reinforcement: true hangers_inherit_reinforcement: true diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index c565ae3f..3007644f 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -257,6 +257,10 @@ public static boolean breakAcidedBlockNaturally() { return config.getBoolean("break_acided_block_naturally", false); } + public static boolean disableHangingReinforcement() { + return config.getBoolean("disable_hanging_reinforcement", true); + } + public static boolean hangersInheritReinforcements() { return config.getBoolean("hangers_inherit_reinforcement", true); } From 6dfe1181dd61bc6aaef8119342cb54dd6aab988c Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:12:41 +0100 Subject: [PATCH 121/255] Hanging Entity Placement Event Will disallow players placing Item Frames for example on blocks reinforced to groups they don't have the REINFORCE permission on --- .../mc/citadel/listener/EntityListener.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 08938b03..c7f0d1a2 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -149,9 +149,42 @@ public void playerQuitEvent(PlayerQuitEvent event){ state.reset(); } - - //@EventHandler(priority = EventPriority.HIGHEST) - public void hangingPlaceEvent(HangingPlaceEvent event){ + @EventHandler(priority = EventPriority.HIGHEST) + public void hangingPlaceEvent(HangingPlaceEvent event) { + // If Hanging Entity Reinforcements are disabled, back out + if (CitadelConfigManager.disableHangingReinforcement()) { + return; + } + // If the Hanging entities inherit reinforcements + if (CitadelConfigManager.hangersInheritReinforcements()) { + Reinforcement reinforcement = rm.getReinforcement(event.getBlock()); + // If no player reinforcement is present, do nothing + if (!(reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement doesn't have a group, do nothing + if (group == null) { + return; + } + PermissionType permission = PermissionType.getPermission("REINFORCE"); + // If the REINFORCE permission is not registered, do nothing + if (permission == null) { + Citadel.getInstance().warning("Could not get the REINFORCE permission from NameLayer. Is it loaded?"); + return; + } + Player player = event.getPlayer(); + // If the player is a member of the group and has bypass permissions, do nothing + if (group.isMember(player.getUniqueId()) && gm.hasAccess(group, player.getUniqueId(), permission)) { + return; + } + // Otherwise prevent the player from putting item frames on other people's reinforced blocks + player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have access to."); + event.setCancelled(true); + return; + } + // Previous code which will only run if reinforcement inheritance is disabled. Player p = event.getPlayer(); Block b = event.getBlock().getRelative(event.getBlockFace()); if (rm.getReinforcement(b) != null) { From f7a5a2d01a78575bf39eb8b6c591f7b312f947db Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:15:41 +0100 Subject: [PATCH 122/255] Hanging Entity Break Event Only allows the entity to break if the environment is illsuited, such as the host block breaking. --- .../mc/citadel/listener/EntityListener.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index c7f0d1a2..980b90a9 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -25,6 +25,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Hanging; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -233,8 +234,34 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { } } - //@EventHandler(priority = EventPriority.HIGHEST) - public void hangingEntityBreakEvent(HangingBreakByEntityEvent event){ + @EventHandler(priority = EventPriority.HIGHEST) + public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { + // If Hanging Entity Reinforcements are disabled, back out + if (CitadelConfigManager.disableHangingReinforcement()) { + return; + } + Hanging entity = event.getEntity(); + // If the Hanging entities inherit reinforcements + if (CitadelConfigManager.hangersInheritReinforcements()) { + switch (event.getCause()) { + // Allow it to break if: + // 1) The host block broke + // 2) A block was placed over it + // 3) A plugin broke it + default: + case OBSTRUCTION: + case PHYSICS: + case DEFAULT: + return; + // Otherwise cancel the break + case ENTITY: + event.getRemover().sendMessage(ChatColor.RED + "The host block is protecting this."); + case EXPLOSION: + event.setCancelled(true); + return; + } + } + // Previous code which will only run if reinforcement inheritance is disabled. Reinforcement rein = rm.getReinforcement(event.getEntity().getLocation()); if (rein == null){return;} if (RemoveCause.PHYSICS.equals(event.getCause())){ //Checks if block entity was attached to was broken From 9715f0eaf53064e187268e5b5688e0220aa06c6b Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:41:27 +0100 Subject: [PATCH 123/255] Hanging Entity Interact Event This will prevent players from altering hangable, interactable entities. For example, this will prevent people without the BYPASS permission from placing items in an Item Frame, or rotating it. --- .../mc/citadel/listener/EntityListener.java | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 980b90a9..b2fc5b23 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -370,10 +370,43 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { } } - //@EventHandler(priority = EventPriority.HIGHEST) - public void playerEntityInteractEvent(PlayerInteractEntityEvent event){ - Entity entity = event.getRightClicked(); - if (entity instanceof ItemFrame){ + @EventHandler(priority = EventPriority.HIGHEST) + public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { + // If Hanging Entity Reinforcements are disabled, back out + if (CitadelConfigManager.disableHangingReinforcement()) { + return; + } + // If the entity isn't a Item Frame, Painting, or LeashHitch, back out + if (!(event.getRightClicked() instanceof Hanging)) { + return; + } + Hanging entity = (Hanging) event.getRightClicked(); + // If the Hanging entities inherit reinforcements + if (CitadelConfigManager.hangersInheritReinforcements()) { + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If no player reinforcement is present, do nothing + if (!(reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement doesn't have a group, do nothing + if (group == null) { + return; + } + Player player = event.getPlayer(); + // If the player is a member of the group and has bypass permissions, do nothing + if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + return; + } + // Otherwise prevent interaction and notify the player they do not have perms + player.sendRawMessage(ChatColor.RED + "You do not have permission to alter that."); + event.setCancelled(true); + return; + } + // Previous code which will only run if reinforcement inheritance is disabled. + if (entity instanceof ItemFrame) { Reinforcement rein = rm.getReinforcement(entity.getLocation()); if (rein == null || !(rein instanceof PlayerReinforcement)) return; From cb2c447d66b6d021ed8a86eedd2457635df5b9ce Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:43:19 +0100 Subject: [PATCH 124/255] Fixing bug in the Hanging Entity Break Event Players on the group could not break the hanging entity --- .../mc/citadel/listener/EntityListener.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index b2fc5b23..157a6a69 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -253,9 +253,34 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { case PHYSICS: case DEFAULT: return; - // Otherwise cancel the break - case ENTITY: - event.getRemover().sendMessage(ChatColor.RED + "The host block is protecting this."); + // Prevent break if breaker is player and does not have BYPASS permissions + case ENTITY: { + if (event.getRemover() instanceof Player) { + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out + // and let the entity be broken + if (!(reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement somehow does not have a group, just back out + if (group == null) { + return; + } + Player player = (Player) event.getRemover(); + // If the player is a member of the group and has bypass permissions, do nothing + if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + return; + } + // Otherwise prevent interaction and notify the player they do not have perms + player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + event.setCancelled(true); + return; + } + } + // Prevent break from explosions case EXPLOSION: event.setCancelled(true); return; From edcf6a2c14a9e9034fcbba9cf5991d55c0be7ea8 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 14:59:54 +0100 Subject: [PATCH 125/255] Hanging Entity Damaged Event If the hanging entity is damaged by another entity, cancel the event unless the entity has BYPASS permissions on the host block's reinforcement group. --- .../mc/citadel/listener/EntityListener.java | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 157a6a69..3617761e 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -445,9 +445,48 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { } } - //@EventHandler(priority = EventPriority.HIGHEST) - public void entityDamageEvent(EntityDamageByEntityEvent event){ - Entity entity = event.getEntity(); + @EventHandler(priority = EventPriority.HIGHEST) + public void entityDamageEvent(EntityDamageByEntityEvent event) { + // If Hanging Entity Reinforcements are disabled, back out + if (CitadelConfigManager.disableHangingReinforcement()) { + return; + } + // If the entity isn't a Item Frame, Painting, or LeashHitch, back out + if (!(event.getEntity() instanceof Hanging)) { + return; + } + Hanging entity = (Hanging) event.getEntity(); + // If the Hanging entities inherit reinforcements + if (CitadelConfigManager.hangersInheritReinforcements()) { + // If the damager is not a player, prevent damage regardless + if (!(event.getDamager() instanceof Player)) { + event.setCancelled(true); + return; + } + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out + // and let the entity be broken + if (!(reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement somehow does not have a group, just back out + if (group == null) { + return; + } + Player player = (Player) event.getDamager(); + // If the player is a member of the group and has bypass permissions, do nothing + if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + return; + } + // Otherwise prevent interaction and notify the player they do not have perms + player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + event.setCancelled(true); + return; + } + // Previous code which will only run if reinforcement inheritance is disabled. if (entity instanceof ItemFrame){ Reinforcement rein = rm.getReinforcement(entity.getLocation()); if (rein == null || !(rein instanceof PlayerReinforcement)) From 0e40caa0611dfbe7c2bf0375d7d149a03c1bd54b Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:01:33 +0100 Subject: [PATCH 126/255] Visual bug fix If you placed an Item Frame on an example on a black you did not have the REINFORCE permission for, the placement would be rejected, and while the item would be returned to the player's inventory, it would not appear so, so to fix this, the player's inventory is manually updated a tick after the event is cancelled. --- src/vg/civcraft/mc/citadel/listener/EntityListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 3617761e..b96a5482 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -181,8 +181,9 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { return; } // Otherwise prevent the player from putting item frames on other people's reinforced blocks - player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have access to."); + player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have permissions for."); event.setCancelled(true); + Bukkit.getScheduler().runTaskLater(Citadel.getInstance(), player::updateInventory, 1L); return; } // Previous code which will only run if reinforcement inheritance is disabled. From 704e90ce0cb9d189910529b3dc3bf3250deaf3f8 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:33:10 +0100 Subject: [PATCH 127/255] Suggested changes --- .../civcraft/mc/citadel/listener/EntityListener.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index b96a5482..dc088b16 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -177,7 +177,7 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { } Player player = event.getPlayer(); // If the player is a member of the group and has bypass permissions, do nothing - if (group.isMember(player.getUniqueId()) && gm.hasAccess(group, player.getUniqueId(), permission)) { + if (gm.hasAccess(group, player.getUniqueId(), permission)) { return; } // Otherwise prevent the player from putting item frames on other people's reinforced blocks @@ -272,11 +272,11 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { } Player player = (Player) event.getRemover(); // If the player is a member of the group and has bypass permissions, do nothing - if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + if (playerReinforcement.canBypass(player)) { return; } // Otherwise prevent interaction and notify the player they do not have perms - player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + player.sendMessage(ChatColor.RED + "The host block is protecting this."); event.setCancelled(true); return; } @@ -423,11 +423,11 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { } Player player = event.getPlayer(); // If the player is a member of the group and has bypass permissions, do nothing - if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + if (playerReinforcement.canBypass(player)) { return; } // Otherwise prevent interaction and notify the player they do not have perms - player.sendRawMessage(ChatColor.RED + "You do not have permission to alter that."); + player.sendMessage(ChatColor.RED + "You do not have permission to alter that."); event.setCancelled(true); return; } @@ -479,7 +479,7 @@ public void entityDamageEvent(EntityDamageByEntityEvent event) { } Player player = (Player) event.getDamager(); // If the player is a member of the group and has bypass permissions, do nothing - if (group.isMember(player.getUniqueId()) && playerReinforcement.canBypass(player)) { + if (playerReinforcement.canBypass(player)) { return; } // Otherwise prevent interaction and notify the player they do not have perms From 00fd5e4d75c6f03cf99931f14039e7f22e0bf521 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:33:25 +0100 Subject: [PATCH 128/255] Revert "Added disable_hanging_reinforcement config option" This reverts commit 1a81acec0a7c7d84829ae1b275ebdbf50e94091f. --- config.yml | 1 - src/vg/civcraft/mc/citadel/CitadelConfigManager.java | 4 ---- 2 files changed, 5 deletions(-) diff --git a/config.yml b/config.yml index 46248551..ac0cee6e 100644 --- a/config.yml +++ b/config.yml @@ -149,5 +149,4 @@ show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login default_bypass_mode: true break_acided_block_naturally: false -disable_hanging_reinforcement: true hangers_inherit_reinforcement: true diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index 3007644f..c565ae3f 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -257,10 +257,6 @@ public static boolean breakAcidedBlockNaturally() { return config.getBoolean("break_acided_block_naturally", false); } - public static boolean disableHangingReinforcement() { - return config.getBoolean("disable_hanging_reinforcement", true); - } - public static boolean hangersInheritReinforcements() { return config.getBoolean("hangers_inherit_reinforcement", true); } From 877957ec1f18a4b6abf20e4ab6ed752c87b78bfd Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:38:11 +0100 Subject: [PATCH 129/255] Removed the previous code that allowed for hanging entity reinforcements --- .../mc/citadel/listener/EntityListener.java | 391 +++++------------- 1 file changed, 94 insertions(+), 297 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index dc088b16..10172bb0 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -152,254 +152,87 @@ public void playerQuitEvent(PlayerQuitEvent event){ @EventHandler(priority = EventPriority.HIGHEST) public void hangingPlaceEvent(HangingPlaceEvent event) { - // If Hanging Entity Reinforcements are disabled, back out - if (CitadelConfigManager.disableHangingReinforcement()) { + // If Hanging Entity Reinforcements is not enabled, back out + if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } - // If the Hanging entities inherit reinforcements - if (CitadelConfigManager.hangersInheritReinforcements()) { - Reinforcement reinforcement = rm.getReinforcement(event.getBlock()); - // If no player reinforcement is present, do nothing - if (!(reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; - Group group = playerReinforcement.getGroup(); - // If the player reinforcement doesn't have a group, do nothing - if (group == null) { - return; - } - PermissionType permission = PermissionType.getPermission("REINFORCE"); - // If the REINFORCE permission is not registered, do nothing - if (permission == null) { - Citadel.getInstance().warning("Could not get the REINFORCE permission from NameLayer. Is it loaded?"); - return; - } - Player player = event.getPlayer(); - // If the player is a member of the group and has bypass permissions, do nothing - if (gm.hasAccess(group, player.getUniqueId(), permission)) { - return; - } - // Otherwise prevent the player from putting item frames on other people's reinforced blocks - player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have permissions for."); - event.setCancelled(true); - Bukkit.getScheduler().runTaskLater(Citadel.getInstance(), player::updateInventory, 1L); + Reinforcement reinforcement = rm.getReinforcement(event.getBlock()); + // If no player reinforcement is present, do nothing + if (!(reinforcement instanceof PlayerReinforcement)) { return; } - // Previous code which will only run if reinforcement inheritance is disabled. - Player p = event.getPlayer(); - Block b = event.getBlock().getRelative(event.getBlockFace()); - if (rm.getReinforcement(b) != null) { - //reinforcement already exists in this location from an actual physical block, so we dont want to allow entity reinforcements here. - //We even dont want to allow placement here as otherwise we would have no way to tell whether the actual underlying block or the entitiy - //"owns" the reinforcement - event.setCancelled(true); + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement doesn't have a group, do nothing + if (group == null) { return; } - Inventory inv = p.getInventory(); - PlayerState state = PlayerState.get(p); - if (ReinforcementMode.REINFORCEMENT_FORTIFICATION != state.getMode()) { + PermissionType permission = PermissionType.getPermission("REINFORCE"); + // If the REINFORCE permission is not registered, do nothing + if (permission == null) { + Citadel.getInstance().warning("Could not get the REINFORCE permission from NameLayer. Is it loaded?"); return; } - if (!canPlace(b, p)){ - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, mismatched reinforcement."); - event.setCancelled(true); - return; - } - ReinforcementType type = state.getReinforcementType(); - // Don't allow double reinforcing reinforceable plants - if (wouldPlantDoubleReinforce(b)) { - Utility.sendAndLog(p, ChatColor.RED, "Cancelled block place, crop would already be reinforced."); - event.setCancelled(true); + Player player = event.getPlayer(); + // If the player is a member of the group and has bypass permissions, do nothing + if (gm.hasAccess(group, player.getUniqueId(), permission)) { return; } - int required = type.getRequiredAmount(); - if (type.getItemStack().isSimilar(p.getInventory().getItemInMainHand())){ - required++; - } - if (inv.containsAtLeast(type.getItemStack(), required)) { - try { - if (createPlayerReinforcement(p, state.getGroup(), b, type, p.getInventory().getItemInMainHand()) == null) { - Utility.sendAndLog(p, ChatColor.RED, String.format("%s is not a reinforcible material ", b.getType().name())); - } else { - state.checkResetMode(); - } - } catch(ReinforcemnetFortificationCancelException ex){ - Citadel.getInstance().getLogger().log(Level.WARNING, "ReinforcementFortificationCancelException occured in BlockListener, BlockPlaceEvent ", ex); - } - } else { - Utility.sendAndLog(p, ChatColor.YELLOW, String.format("%s depleted, left fortification mode ", - state.getReinforcementType().getMaterial().name())); - state.reset(); - event.setCancelled(true); - } + // Otherwise prevent the player from putting item frames on other people's reinforced blocks + player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have permissions for."); + event.setCancelled(true); + Bukkit.getScheduler().runTaskLater(Citadel.getInstance(), player::updateInventory, 1L); } @EventHandler(priority = EventPriority.HIGHEST) public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { - // If Hanging Entity Reinforcements are disabled, back out - if (CitadelConfigManager.disableHangingReinforcement()) { + // If Hanging Entity Reinforcements is not enabled, back out + if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } Hanging entity = event.getEntity(); - // If the Hanging entities inherit reinforcements - if (CitadelConfigManager.hangersInheritReinforcements()) { - switch (event.getCause()) { - // Allow it to break if: - // 1) The host block broke - // 2) A block was placed over it - // 3) A plugin broke it - default: - case OBSTRUCTION: - case PHYSICS: - case DEFAULT: - return; - // Prevent break if breaker is player and does not have BYPASS permissions - case ENTITY: { - if (event.getRemover() instanceof Player) { - Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); - Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out - // and let the entity be broken - if (!(reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; - Group group = playerReinforcement.getGroup(); - // If the player reinforcement somehow does not have a group, just back out - if (group == null) { - return; - } - Player player = (Player) event.getRemover(); - // If the player is a member of the group and has bypass permissions, do nothing - if (playerReinforcement.canBypass(player)) { - return; - } - // Otherwise prevent interaction and notify the player they do not have perms - player.sendMessage(ChatColor.RED + "The host block is protecting this."); - event.setCancelled(true); - return; - } - } - // Prevent break from explosions - case EXPLOSION: - event.setCancelled(true); - return; - } - } - // Previous code which will only run if reinforcement inheritance is disabled. - Reinforcement rein = rm.getReinforcement(event.getEntity().getLocation()); if (rein == null){return;} - if (RemoveCause.PHYSICS.equals(event.getCause())){ - //Checks if block entity was attached to was broken - if (event.getEntity().getLocation().getBlock().getRelative( - event.getEntity().getAttachedFace()).getType().equals(Material.AIR)){ - //Comment out these next two lines to keep floating hanging entities if they are reinforced - rm.deleteReinforcement(rein); - return; - } else { - event.setCancelled(true); + switch (event.getCause()) { + // Allow it to break if: + // 1) The host block broke + // 2) A block was placed over it + // 3) A plugin broke it + case OBSTRUCTION: + case PHYSICS: + case DEFAULT: return; - } - } - Entity remover = event.getRemover(); if (!(remover instanceof Player)){event.setCancelled(true);return;} - Player player = (Player)remover; - Block block = event.getEntity().getLocation().getBlock(); - boolean is_cancelled = true; - if (rein instanceof PlayerReinforcement) { - PlayerReinforcement pr = (PlayerReinforcement) rein; - PlayerState state = PlayerState.get(player); - ReinforcementMode mode = state.getMode(); - if (ReinforcementMode.REINFORCEMENT_INFORMATION == mode){ - Group group = pr.getGroup(); - StringBuilder sb; - if (player.hasPermission("citadel.admin.ctinfodetails")) { - Utility.sendAndLog(player, ChatColor.GREEN, String.format( - "Loc[%s]", pr.getLocation().toString())); - String groupName = "!NULL!"; - if (group != null) { - groupName = String.format("[%s]"); - } - sb = new StringBuilder(); - sb.append(String.format(" Group%s Durability[%d/%d]", - groupName, - pr.getDurability(), - ReinforcementType.getReinforcementType - (pr.getStackRepresentation()).getHitPoints())); - int maturationTime = timeUntilMature(pr); - if (maturationTime != 0) { - sb.append(" Immature["); - sb.append(maturationTime); - sb.append("]"); - } - int acidTime = timeUntilAcidMature(pr); - if (CitadelConfigManager.getAcidBlock() == block.getType()) { - sb.append(" Acid "); - if (acidTime != 0) { - sb.append("Immature["); - sb.append(acidTime); - sb.append("]"); - } else { - sb.append("Mature"); - } + // Prevent break if breaker is player and does not have BYPASS permissions + case ENTITY: { + if (event.getRemover() instanceof Player) { + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out + // and let the entity be broken + if (!(reinforcement instanceof PlayerReinforcement)) { + return; } - if (pr.isInsecure()) { - sb.append(" (Insecure)"); + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement somehow does not have a group, just back out + if (group == null) { + return; } - if (group.isDisciplined()) { - sb.append(" (Disciplined)"); + Player player = (Player) event.getRemover(); + // If the player is a member of the group and has bypass permissions, do nothing + if (playerReinforcement.canBypass(player)) { + return; } - sb.append("\nGroup id: " + pr.getGroupId()); - - Utility.sendAndLog(player, ChatColor.GREEN, sb.toString()); - event.setCancelled(is_cancelled); - return; - } - } - boolean admin_bypass = player.hasPermission("citadel.admin.bypassmode"); - if (state.isBypassMode() && (pr.canBypass(player) || admin_bypass) && !pr.getGroup().isDisciplined()) { - reinforcementBroken(player, rein); - is_cancelled = false; - } else { - - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, event.getEntity().getLocation().getBlock()); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = true; + // Otherwise prevent interaction and notify the player they do not have perms + player.sendMessage(ChatColor.RED + "The host block is protecting this."); } - else { - is_cancelled = reinforcementDamaged(player, rein); - } - } - if (!is_cancelled) { - // The player reinforcement broke. Now check for natural - is_cancelled = createNaturalReinforcement(block, player) != null; - } - } else { - ReinforcementDamageEvent dre = new ReinforcementDamageEvent(rein, player, block); - - Bukkit.getPluginManager().callEvent(dre); - - if(dre.isCancelled()) { - is_cancelled = reinforcementDamaged(player, rein); - return; - } - else { - is_cancelled = reinforcementDamaged(player, rein); } } - - if (is_cancelled) { - event.setCancelled(true); - block.getDrops().clear(); - } + event.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { - // If Hanging Entity Reinforcements are disabled, back out - if (CitadelConfigManager.disableHangingReinforcement()) { + // If Hanging Entity Reinforcements is not enabled, back out + if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } // If the entity isn't a Item Frame, Painting, or LeashHitch, back out @@ -407,49 +240,32 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { return; } Hanging entity = (Hanging) event.getRightClicked(); - // If the Hanging entities inherit reinforcements - if (CitadelConfigManager.hangersInheritReinforcements()) { - Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); - Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If no player reinforcement is present, do nothing - if (!(reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; - Group group = playerReinforcement.getGroup(); - // If the player reinforcement doesn't have a group, do nothing - if (group == null) { - return; - } - Player player = event.getPlayer(); - // If the player is a member of the group and has bypass permissions, do nothing - if (playerReinforcement.canBypass(player)) { - return; - } - // Otherwise prevent interaction and notify the player they do not have perms - player.sendMessage(ChatColor.RED + "You do not have permission to alter that."); - event.setCancelled(true); + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If no player reinforcement is present, do nothing + if (!(reinforcement instanceof PlayerReinforcement)) { return; } - // Previous code which will only run if reinforcement inheritance is disabled. - if (entity instanceof ItemFrame) { - Reinforcement rein = rm.getReinforcement(entity.getLocation()); - if (rein == null || !(rein instanceof PlayerReinforcement)) - return; - PlayerReinforcement pr = (PlayerReinforcement)rein; - Group group = pr.getGroup(); if (group == null){return;} - - if (group.isMember(event.getPlayer().getUniqueId()) == false){ - event.setCancelled(true); - return; - } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement doesn't have a group, do nothing + if (group == null) { + return; + } + Player player = event.getPlayer(); + // If the player is a member of the group and has bypass permissions, do nothing + if (playerReinforcement.canBypass(player)) { + return; } + // Otherwise prevent interaction and notify the player they do not have perms + player.sendMessage(ChatColor.RED + "You do not have permission to alter that."); + event.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) public void entityDamageEvent(EntityDamageByEntityEvent event) { - // If Hanging Entity Reinforcements are disabled, back out - if (CitadelConfigManager.disableHangingReinforcement()) { + // If Hanging Entity Reinforcements is not enabled, back out + if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } // If the entity isn't a Item Frame, Painting, or LeashHitch, back out @@ -457,51 +273,32 @@ public void entityDamageEvent(EntityDamageByEntityEvent event) { return; } Hanging entity = (Hanging) event.getEntity(); - // If the Hanging entities inherit reinforcements - if (CitadelConfigManager.hangersInheritReinforcements()) { - // If the damager is not a player, prevent damage regardless - if (!(event.getDamager() instanceof Player)) { - event.setCancelled(true); - return; - } - Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); - Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out - // and let the entity be broken - if (!(reinforcement instanceof PlayerReinforcement)) { - return; - } - PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; - Group group = playerReinforcement.getGroup(); - // If the player reinforcement somehow does not have a group, just back out - if (group == null) { - return; - } - Player player = (Player) event.getDamager(); - // If the player is a member of the group and has bypass permissions, do nothing - if (playerReinforcement.canBypass(player)) { - return; - } - // Otherwise prevent interaction and notify the player they do not have perms - player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + // If the damager is not a player, prevent damage regardless + if (!(event.getDamager() instanceof Player)) { event.setCancelled(true); return; } - // Previous code which will only run if reinforcement inheritance is disabled. - if (entity instanceof ItemFrame){ - Reinforcement rein = rm.getReinforcement(entity.getLocation()); - if (rein == null || !(rein instanceof PlayerReinforcement)) - return; - Entity damager = event.getDamager(); if (!(damager instanceof Player)){event.setCancelled(true);return;} - Player player = (Player)damager; - PlayerReinforcement pr = (PlayerReinforcement)rein; - Group group = pr.getGroup(); if (group == null){return;} - - if (group.isMember(player.getUniqueId()) == false){ - event.setCancelled(true); - return; - } + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); + // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out + // and let the entity be broken + if (!(reinforcement instanceof PlayerReinforcement)) { + return; + } + PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; + Group group = playerReinforcement.getGroup(); + // If the player reinforcement somehow does not have a group, just back out + if (group == null) { + return; + } + Player player = (Player) event.getDamager(); + // If the player is a member of the group and has bypass permissions, do nothing + if (playerReinforcement.canBypass(player)) { + return; } + // Otherwise prevent interaction and notify the player they do not have perms + player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + event.setCancelled(true); } @EventHandler(priority=EventPriority.LOWEST) From 81b9651dd2c5f9228f5787996fe9642fc521cc25 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:41:01 +0100 Subject: [PATCH 130/255] Bump version 3.11.3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7284d7e0..619a5327 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.2 + 3.11.3 Citadel https://github.com/Devoted/Citadel From 06f27fbac7e1d584ed2fd4feb326ea5fb81c8368 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Sun, 25 Aug 2019 15:44:17 +0100 Subject: [PATCH 131/255] The default option for this should be false ...since the disable option is now gone --- config.yml | 2 +- src/vg/civcraft/mc/citadel/CitadelConfigManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config.yml b/config.yml index ac0cee6e..662e8e93 100644 --- a/config.yml +++ b/config.yml @@ -149,4 +149,4 @@ show_health_as_percent: true # Whether players are automatically put in reinforcement bypass mode on login default_bypass_mode: true break_acided_block_naturally: false -hangers_inherit_reinforcement: true +hangers_inherit_reinforcement: false diff --git a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java index c565ae3f..44adffa9 100644 --- a/src/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -258,7 +258,7 @@ public static boolean breakAcidedBlockNaturally() { } public static boolean hangersInheritReinforcements() { - return config.getBoolean("hangers_inherit_reinforcement", true); + return config.getBoolean("hangers_inherit_reinforcement", false); } } From c9cfc36f8d645fdd6e9b334aebcfa9d739a2527c Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 28 Aug 2019 05:01:02 +0200 Subject: [PATCH 132/255] Integrate with new metadata api --- .../java/vg/civcraft/mc/citadel/Citadel.java | 29 ++-- .../mc/citadel/CitadelConfigManager.java | 4 +- .../civcraft/mc/citadel/CitadelUtility.java | 2 +- .../mc/citadel/ReinforcementLogic.java | 14 +- .../mc/citadel/ReinforcementManager.java | 36 +++++ .../vg/civcraft/mc/citadel/command/Acid.java | 2 +- .../mc/citadel/listener/BlockListener.java | 2 +- .../mc/citadel/listener/EntityListener.java | 5 +- .../mc/citadel/model/CitadelChunkData.java | 14 +- .../mc/citadel/model/CitadelStorage.java | 145 ++++++++++++++++++ .../mc/citadel/model/Reinforcement.java | 68 ++------ .../AdvancedFortificationState.java | 7 +- .../reinforcementtypes/ReinforcementType.java | 18 +-- .../ReinforcementTypeManager.java | 4 +- 14 files changed, 244 insertions(+), 106 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 39677648..236b4084 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -13,13 +13,16 @@ import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.CitadelChunkData; import vg.civcraft.mc.citadel.model.CitadelSettingManager; +import vg.civcraft.mc.citadel.model.CitadelStorage; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.ACivMod; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMetaView; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkMetaAPI; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.BlockBasedChunkMetaView; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.ChunkMetaAPI; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; import vg.civcraft.mc.namelayer.GroupManager.PlayerType; import vg.civcraft.mc.namelayer.permission.PermissionType; @@ -42,7 +45,7 @@ public static Citadel getInstance() { } private Logger logger; - private BlockBasedChunkMetaView chunkMetaData; + private ReinforcementManager reinManager; private CitadelConfigManager config; private AcidManager acidManager; private ReinforcementTypeManager typeManager; @@ -62,14 +65,14 @@ public CitadelConfigManager getConfigManager() { return config; } - public BlockBasedChunkMetaView getChunkMetaManager() { - return chunkMetaData; + public ReinforcementManager getReinforcementManager() { + return reinManager; } public ReinforcementTypeManager getReinforcementTypeManager() { return typeManager; } - + public CitadelSettingManager getSettingManager() { return settingManager; } @@ -84,7 +87,7 @@ public HologramManager getHologramManager() { @Override public void onDisable() { - chunkMetaData.disable(); + reinManager.shutDown(); HandlerList.unregisterAll(this); Bukkit.getScheduler().cancelTasks(this); } @@ -112,12 +115,20 @@ public void onEnable() { } typeManager = new ReinforcementTypeManager(); config.getReinforcementTypes().forEach(t -> typeManager.register(t)); - chunkMetaData = ChunkMetaAPI.registerBlockBasedPlugin(this, CitadelChunkData.class, () -> new CitadelChunkData(true)); - if (chunkMetaData == null) { + CitadelStorage storage = new CitadelStorage(this.logger, config.getDatabase()); + if (!storage.updateDatabase()) { logger.severe("Errors setting up database, shutting down"); Bukkit.shutdown(); return; } + BlockBasedChunkMetaView> chunkMetaData = + ChunkMetaAPI.registerBlockBasedPlugin(this, () -> {return new CitadelChunkData(false, storage);}); + if (chunkMetaData == null) { + logger.severe("Errors setting up chunk metadata API, shutting down"); + Bukkit.shutdown(); + return; + } + reinManager = new ReinforcementManager(chunkMetaData); stateManager = new PlayerStateManager(); acidManager = new AcidManager(config.getAcidMaterials()); settingManager = new CitadelSettingManager(); diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index da7c1e6c..5f1ffc2c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -155,11 +155,11 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), TimeUnit.MILLISECONDS); String name = config.getString("name"); double maturationScale = config.getInt("scale_amount", 1); - double health = config.getDouble("hit_points", 100); + float health = (float) config.getDouble("hit_points", 100); double returnChance = config.getDouble("return_chance", 1.0); List reinforceables = parseMaterialList(config, "reinforceables"); List nonReinforceables = parseMaterialList(config, "non_reinforceables"); - int id = config.getInt("id", -1); + short id = (short) config.getInt("id", -1); long decayTimer = ConfigParsing .parseTime(config.getString("decay_timer", String.valueOf(globalDecayTimer / 1000L) + "s")); double decayMultiplier = config.getDouble("decay_multiplier", globalDecayMultiplier); diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 1f7bffa6..044ee0c1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -151,7 +151,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp return true; } // check if reinforcement already exists - Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(block); + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); if (rein != null) { // something like a slab, we just ignore this return false; diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index cb2984a2..6cb74a7e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -19,7 +19,7 @@ public class ReinforcementLogic { public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); - Citadel.getInstance().getChunkMetaManager().put(rein); + Citadel.getInstance().getReinforcementManager().putReinforcement(rein); if (type.getCreationEffect() != null) { type.getCreationEffect().playEffect(rein); } @@ -28,9 +28,8 @@ public static Reinforcement createReinforcement(Player player, Block block, Rein } public static void damageReinforcement(Reinforcement rein, double damage) { - rein.setHealth(rein.getHealth() - damage); + rein.setHealth((float) (rein.getHealth() - damage)); if (rein.isBroken()) { - Citadel.getInstance().getChunkMetaManager().remove(rein); if (rein.getType().getDestructionEffect() != null) { rein.getType().getDestructionEffect().playEffect(rein); } @@ -38,7 +37,6 @@ public static void damageReinforcement(Reinforcement rein, double damage) { if (rein.getType().getDamageEffect() != null) { rein.getType().getDamageEffect().playEffect(rein); } - rein.setDirty(true); } } @@ -56,11 +54,11 @@ public static double getDamageApplied(Reinforcement reinforcement) { } public static Reinforcement getReinforcementAt(Location loc) { - return Citadel.getInstance().getChunkMetaManager().get(loc); + return Citadel.getInstance().getReinforcementManager().getReinforcement(loc); } public static Reinforcement getReinforcementProtecting(Block b) { - Reinforcement directReinforcement = Citadel.getInstance().getChunkMetaManager().get(b.getLocation()); + Reinforcement directReinforcement = getReinforcementAt(b.getLocation()); if (directReinforcement != null) { return directReinforcement; } @@ -180,7 +178,7 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { public static Reinforcement resolveDoubleChestReinforcement(Block block) { Material mat = block.getType(); - Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(block); + Reinforcement rein = getReinforcementAt(block.getLocation()); if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { return rein; } @@ -189,7 +187,7 @@ public static Reinforcement resolveDoubleChestReinforcement(Block block) { if (relative.getType() != mat) { continue; } - rein = Citadel.getInstance().getChunkMetaManager().get(relative); + rein = getReinforcementAt(relative.getLocation()); if (rein != null) { return rein; } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java new file mode 100644 index 00000000..3376e8b8 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -0,0 +1,36 @@ +package vg.civcraft.mc.citadel; + +import org.bukkit.Location; +import org.bukkit.block.Block; + +import vg.civcraft.mc.citadel.model.CitadelChunkData; +import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.BlockBasedChunkMetaView; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; + +public class ReinforcementManager { + + private BlockBasedChunkMetaView> chunkMetaData; + + ReinforcementManager( + BlockBasedChunkMetaView> chunkMetaData) { + this.chunkMetaData = chunkMetaData; + } + + public Reinforcement getReinforcement(Location location) { + return (Reinforcement) chunkMetaData.get(location); + } + + public Reinforcement getReinforcement(Block block) { + return getReinforcement(block.getLocation()); + } + + public void putReinforcement(Reinforcement reinforcement) { + chunkMetaData.put(reinforcement); + } + + void shutDown() { + chunkMetaData.disable(); + } +} diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 786b558f..57ba0ad9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -39,7 +39,7 @@ public boolean execute(CommandSender sender, String[] args) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); return true; } - Reinforcement reinforcement = Citadel.getInstance().getChunkMetaManager().get(block); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementAt(block.getLocation()); if (reinforcement == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index c151fd5f..3a4a46f2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -210,7 +210,7 @@ public void removeReinforcedAir(BlockPlaceEvent e) { if (e.getBlockReplacedState().getType() != Material.AIR) { return; } - Reinforcement rein = Citadel.getInstance().getChunkMetaManager().get(e.getBlock()); + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); if (rein != null) { rein.setHealth(-1); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 208e07d0..9b34c2ab 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -22,9 +22,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.ReinforcementLogic; -import vg.civcraft.mc.citadel.model.CitadelChunkData; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMetaView; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; @@ -113,14 +111,13 @@ public void run() { // prevent creating golems from reinforced blocks @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void spawn(CreatureSpawnEvent cse) { - BlockBasedChunkMetaView chunkManager = Citadel.getInstance().getChunkMetaManager(); EntityType type = cse.getEntityType(); if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER && type != EntityType.SILVERFISH) { return; } for (Block block : getGolemBlocks(type, cse.getLocation().getBlock())) { - Reinforcement reinforcement = chunkManager.get(block); + Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(block); if (reinforcement != null) { cse.setCancelled(true); } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java index a256efb0..a26ba689 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java @@ -1,17 +1,11 @@ package vg.civcraft.mc.citadel.model; -import com.google.gson.JsonObject; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMeta; +public class CitadelChunkData extends TableBasedBlockChunkMeta { -public class CitadelChunkData extends BlockBasedChunkMeta { - - public CitadelChunkData(boolean isNew) { - super(isNew); - } - - public static CitadelChunkData deserialize(JsonObject json) { - return (CitadelChunkData) BlockBasedChunkMeta.deserialize(new CitadelChunkData(false), json, Reinforcement.class); + public CitadelChunkData(boolean isNew, CitadelStorage storage) { + super(isNew, storage); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java new file mode 100644 index 00000000..91e80d8c --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -0,0 +1,145 @@ +package vg.civcraft.mc.citadel.model; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.bukkit.Location; +import org.bukkit.World; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; +import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkCoord; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.BlockBasedChunkMeta; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; + +public class CitadelStorage extends TableStorageEngine { + + public CitadelStorage(Logger logger, ManagedDatasource db) { + super(logger, db); + } + + @Override + public void registerMigrations() { + db.registerMigration(15, false, + "create table ctdl_reinforcements (chunk_x int not null, chunk_z int not null, world_id smallint unsigned not null, " + + "x_offset tinyint unsigned not null, y tinyint unsigned not null, z_offset tinyint unsigned not null, " + + "type_id smallint unsigned not null, health float not null, group_id int not null, insecure boolean not null default false," + + "creation_time timestamp not null default now(), index reinChunkLookUp(chunk_x, chunk_z, world_id), primary key " + + "(chunk_x, chunk_z, world_id, x_offset, y ,z_offset))"); + } + + @Override + public void insert(Reinforcement data, ChunkCoord coord) { + try (Connection insertConn = db.getConnection(); + PreparedStatement insertRein = insertConn.prepareStatement( + "insert into ctdl_reinforcements (chunk_x, chunk_z, world_id, x_offset, y, z_offset, type_id, " + + "health, group_id, insecure, creation_time) values(?,?,?, ?,?,?, ?,?,?,?,?);");) { + insertRein.setInt(1, coord.getX()); + insertRein.setInt(2, coord.getZ()); + insertRein.setShort(3, (short) coord.getWorldID()); + insertRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + insertRein.setByte(5, (byte) data.getLocation().getBlockY()); + insertRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + insertRein.setShort(7, data.getType().getID()); + insertRein.setFloat(8, data.getHealth()); + insertRein.setInt(9, data.getGroupId()); + insertRein.setBoolean(10, data.isInsecure()); + insertRein.setTimestamp(11, new Timestamp(data.getCreationTime())); + insertRein.execute(); + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to insert reinforcement into db: ", e); + } + } + + @Override + public void update(Reinforcement data, ChunkCoord coord) { + try (Connection insertConn = db.getConnection(); + PreparedStatement updateRein = insertConn.prepareStatement( + "update ctdl_reinforcements set type_id = ?, health = ?, group_id = ?, insecure = ? where " + + "chunk_x = ? and chunk_z = ? and world_id = ? and x_offset = ? and y = ? and z_offset = ?;");) { + updateRein.setShort(1, data.getType().getID()); + updateRein.setFloat(2, data.getHealth()); + updateRein.setInt(3, data.getGroupId()); + updateRein.setBoolean(4, data.isInsecure()); + updateRein.setInt(5, coord.getX()); + updateRein.setInt(6, coord.getZ()); + updateRein.setShort(7, (short) coord.getWorldID()); + updateRein.setByte(8, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + updateRein.setByte(9, (byte) data.getLocation().getBlockY()); + updateRein.setByte(10,(byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + updateRein.execute(); + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to update reinforcement in db: ", e); + } + } + + @Override + public void delete(Reinforcement data, ChunkCoord coord) { + try (Connection insertConn = db.getConnection(); + PreparedStatement deleteRein = insertConn.prepareStatement( + "delete from ctdl_reinforcements where chunk_x = ? and chunk_z = ? and world_id = ? and " + + "x_offset = ? and y = ? and z_offset = ?;");) { + deleteRein.setInt(1, coord.getX()); + deleteRein.setInt(2, coord.getZ()); + deleteRein.setShort(3, (short) coord.getWorldID()); + deleteRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + deleteRein.setByte(5, (byte) data.getLocation().getBlockY()); + deleteRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + deleteRein.execute(); + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to delete reinforcement from db: ", e); + } + } + + @Override + public void fill(TableBasedBlockChunkMeta chunkData, Consumer insertFunction) { + int preMultipliedX = chunkData.getChunkCoord().getX() * 16; + int preMultipliedZ = chunkData.getChunkCoord().getZ() * 16; + ReinforcementTypeManager typeMan = Citadel.getInstance().getReinforcementTypeManager(); + World world = chunkData.getChunkCoord().getWorld(); + try (Connection insertConn = db.getConnection(); + PreparedStatement selectRein = insertConn.prepareStatement( + "select x_offset, y, z_offset, type_id, group_id, creation_time, health, insecure " + + "from ctdl_reinforcements where chunk_x = ? and chunk_z = ? and world_id = ?;");) { + selectRein.setInt(1, chunkData.getChunkCoord().getX()); + selectRein.setInt(2, chunkData.getChunkCoord().getZ()); + selectRein.setShort(3, (short) chunkData.getChunkCoord().getWorldID()); + try (ResultSet rs = selectRein.executeQuery()) { + while (rs.next()) { + int xOffset = rs.getByte(1); + int x = xOffset + preMultipliedX; + int y = rs.getByte(2) & 0xFF; + int zOffset = rs.getByte(3); + int z = zOffset + preMultipliedZ; + Location location = new Location(world, x, y, z); + short typeID = rs.getShort(4); + ReinforcementType type = typeMan.getById(typeID); + if (type == null) { + logger.log(Level.SEVERE, "Failed to load reinforcement with type id " + typeID); + continue; + } + int groupID = rs.getInt(5); + long creationTime = rs.getTimestamp(6).getTime(); + float health = rs.getFloat(7); + boolean insecure = rs.getBoolean(8); + Reinforcement rein = new Reinforcement(location, type, groupID, creationTime, health, insecure, + false); + System.out.println("Loading at " + location.toString()); + insertFunction.accept(rein); + } + } + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to load reinforcement from db: ", e); + } + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 897e80cd..2b55c14c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -2,40 +2,35 @@ import java.util.Random; import java.util.UUID; -import java.util.logging.Level; import org.bukkit.Location; import org.bukkit.entity.Player; -import com.google.gson.JsonObject; - -import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockBasedChunkMeta; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.BlockDataObject; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkMeta; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.CacheState; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; import vg.civcraft.mc.namelayer.permission.PermissionType; -public class Reinforcement extends BlockDataObject { +public class Reinforcement extends TableBasedDataObject { private static Random rng = new Random(); private final long creationTime; private ReinforcementType type; - private double health; + private float health; private int groupId; private boolean insecure; public Reinforcement(Location loc, ReinforcementType type, Group group) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), false); + this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), false, true); } - public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, double health, - boolean insecure) { - super(loc); + public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, float health, + boolean insecure, boolean isNew) { + super(loc, isNew); if (type == null) { throw new IllegalArgumentException("Reinforcement type for reinforcement can not be null"); } @@ -77,7 +72,7 @@ public int getGroupId() { /** * @return Current health */ - public double getHealth() { + public float getHealth() { return health; } @@ -146,7 +141,7 @@ public void setGroup(Group group) { throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); } this.groupId = group.getGroupId(); - setDirty(true); + setCacheState(CacheState.MODIFIED); } /** @@ -154,24 +149,20 @@ public void setGroup(Group group) { * * @param health new health value */ - public void setHealth(double health) { + public void setHealth(float health) { this.health = health; - setDirty(true); if (health <= 0) { getOwningCache().remove(this); + setCacheState(CacheState.DELETED); + } + else { + setCacheState(CacheState.MODIFIED); } - } - - @Override - @SuppressWarnings("unchecked") - protected BlockBasedChunkMeta getOwningCache() { - //doing this covariant overwrite makes typing easier in other places - return (BlockBasedChunkMeta) super.getOwningCache(); } public void setType(ReinforcementType type) { this.type = type; - setDirty(true); + setCacheState(CacheState.MODIFIED); } /** @@ -179,7 +170,7 @@ public void setType(ReinforcementType type) { */ public void toggleInsecure() { insecure = !insecure; - setDirty(true); + setCacheState(CacheState.MODIFIED); } /** @@ -195,29 +186,4 @@ public boolean rollForItemReturn() { baseChance *= relativeHealth; return rng.nextDouble() <= baseChance; } - - @Override - public void concreteSerialize(JsonObject json) { - json.addProperty("c", creationTime); - json.addProperty("t", type.getID()); - json.addProperty("h", health); - json.addProperty("g", groupId); - if (insecure) { - json.addProperty("i", ""); - } - } - - public static Reinforcement deserialize(JsonObject json, ChunkMeta meta) { - long creationTime = json.get("c").getAsLong(); - int reinforcementTypeId = json.get("t").getAsInt(); - ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getById(reinforcementTypeId); - if (type == null) { - Citadel.getInstance().getLogger().log(Level.SEVERE, "Could not load reinforcement with id " + reinforcementTypeId); - } - double health = json.get("h").getAsDouble(); - int groupId = json.get("g").getAsInt(); - boolean insecure = json.has("i"); - Location loc = parseLocationFromJson(json, meta); - return new Reinforcement(loc, type, groupId, creationTime, health, insecure); - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index f51bd9b1..250cb720 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -21,7 +21,7 @@ public class AdvancedFortificationState extends AbstractPlayerState { public AdvancedFortificationState(Player p) { super(p); - setups = new HashMap(); + setups = new HashMap<>(); } @Override @@ -33,11 +33,6 @@ public String getName() { public void handleBlockPlace(BlockPlaceEvent e) { ItemStack placed = e.getItemInHand(); Player player = e.getPlayer(); - if (placed == null) { - // no idea if this can even happen, but let's be safe - CitadelUtility.sendAndLog(player, ChatColor.RED, "No block found in your hand?"); - return; - } // check if we have a setup for this block, weneed a copy for lookup so we can // set amount to 1 ItemStack lookUpCopy = placed.clone(); diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index c8101020..66f01182 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -9,7 +9,7 @@ public class ReinforcementType { - private double health; + private float health; private double returnChance; private ItemStack item; private long maturationTime; @@ -22,15 +22,15 @@ public class ReinforcementType { private Set allowedReinforceables; private Set disallowedReinforceables; private Set globalBlackList; - private int id; + private short id; private String name; private long decayTimer; private double decayMultiplier; - public ReinforcementType(double health, double returnChance, ItemStack item, long maturationTime, long acidTime, + public ReinforcementType(float health, double returnChance, ItemStack item, long maturationTime, long acidTime, double scale, long gracePeriod, ReinforcementEffect creationEffect, ReinforcementEffect damageEffect, ReinforcementEffect destructionEffect, Collection allowsReinforceables, - Collection disallowedReinforceables, int id, String name, Collection globalBlackList, + Collection disallowedReinforceables, short id, String name, Collection globalBlackList, long decayTimer, double decayMultiplier) { this.health = health; this.name = name; @@ -65,11 +65,7 @@ public boolean canBeReinforced(Material mat) { return false; } if (allowedReinforceables == null) { - if (disallowedReinforceables == null || !disallowedReinforceables.contains(mat)) { - return true; - } else { - return false; - } + return disallowedReinforceables == null || !disallowedReinforceables.contains(mat); } return allowedReinforceables.contains(mat); } @@ -93,14 +89,14 @@ public long getGracePeriod() { /** * @return Maximum health */ - public double getHealth() { + public float getHealth() { return health; } /** * @return The unique id identifying this config */ - public int getID() { + public short getID() { return id; } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java index b83ee9c0..6031a8e7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementTypeManager.java @@ -10,7 +10,7 @@ public class ReinforcementTypeManager { private Map typesByItem; - private Map typesById; + private Map typesById; public ReinforcementTypeManager() { typesByItem = new HashMap<>(); @@ -21,7 +21,7 @@ public Collection getAllTypes() { return typesById.values(); } - public ReinforcementType getById(int id) { + public ReinforcementType getById(short id) { return typesById.get(id); } From 6e0ba104e425062366baa34605fc476ffc7f16b8 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 28 Aug 2019 18:24:18 +0200 Subject: [PATCH 133/255] Working fine in normal operation now --- .../civcraft/mc/citadel/command/Bypass.java | 4 +- .../civcraft/mc/citadel/model/ChunkCoord.java | 59 ------------------- .../citadel/model/CitadelSettingManager.java | 8 ++- .../mc/citadel/model/CitadelStorage.java | 1 - 4 files changed, 8 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java index a4597c78..5bf57c74 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -7,10 +7,10 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; @CivCommand(id = "ctb") @@ -19,7 +19,7 @@ public class Bypass extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); + BooleanSetting setting = Citadel.getInstance().getSettingManager().getBypass(); boolean enabled = setting.getValue(player); if (enabled) { CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Bypass mode has been disabled."); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java b/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java deleted file mode 100644 index 8bcc3429..00000000 --- a/src/main/java/vg/civcraft/mc/citadel/model/ChunkCoord.java +++ /dev/null @@ -1,59 +0,0 @@ -package vg.civcraft.mc.citadel.model; - -import org.bukkit.Chunk; -import org.bukkit.Location; - -public class ChunkCoord { - - public static ChunkCoord forChunk(Chunk chunk) { - return new ChunkCoord(chunk.getX(), chunk.getZ()); - } - public static ChunkCoord forLocation(Location loc) { - return new ChunkCoord(loc.getChunk().getX(), loc.getChunk().getZ()); - } - - public static ChunkCoord fromKey(long key) { - int x = (int) key; - int z = (int) ((key >> 32) & 0x00000000); - return new ChunkCoord(x, z); - } - - private int x; - - private int z; - - public ChunkCoord(int x, int z) { - this.x = x; - this.z = z; - } - - @Override - public boolean equals(Object o) { - if (o instanceof ChunkCoord) { - ChunkCoord pair = (ChunkCoord) o; - return pair.x == x && pair.z == z; - } - return false; - } - - public long getCombinedKey() { - long key = x; - long zPart = z; - key &= zPart << 32; - return key; - } - - public int getX() { - return x; - } - - public int getZ() { - return z; - } - - @Override - public int hashCode() { - // might collide - return x & (z << 16); - } -} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 3dbf9cdd..ad84cd80 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -32,7 +32,11 @@ public class CitadelSettingManager { public CitadelSettingManager() { initSettings(); } - + + public BooleanSetting getBypass() { + return byPass; + } + void initSettings() { MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", "Citadel and reinforcement related settings"); @@ -62,7 +66,7 @@ void initSettings() { ctiEnemy = new CommandReplySetting(Citadel.getInstance(), ChatColor.RED + "Reinforced at %%health_color%%%%perc_health%% (%%health%%/%%max_health%%)" - + ChatColor.RED + " health with " + ChatColor.AQUA + "%%%type%%%", + + ChatColor.RED + " health with " + ChatColor.AQUA + "%%type%%", "CTI Message Enemy", "citadel_cti_enemy", new ItemStack(Material.RED_TERRACOTTA), "The message received when interacting with enemy reinforcements"); ctiEnemy.registerArgument("perc_health", "33.33", "the percentage health of the reinforcement"); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java index 91e80d8c..54858460 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -133,7 +133,6 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer Date: Fri, 30 Aug 2019 17:02:20 +0200 Subject: [PATCH 134/255] Prevent NPE during explosions --- .../java/vg/civcraft/mc/citadel/listener/EntityListener.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 9b34c2ab..ecc38a4a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -63,6 +63,9 @@ public void explode(EntityExplodeEvent eee) { while (iterator.hasNext()) { Block block = iterator.next(); Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein == null) { + continue; + } ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); if (!rein.isBroken()) { iterator.remove(); From 644e21fa63c5760ee04fc43449e1ed02610af716 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 2 Sep 2019 02:24:45 +0200 Subject: [PATCH 135/255] Improve event priority, custom events; add permissionhandler and stop destroying reinforcements on type change --- .../java/vg/civcraft/mc/citadel/Citadel.java | 46 +--------- .../mc/citadel/CitadelPermissionHandler.java | 85 +++++++++++++++++++ .../civcraft/mc/citadel/CitadelUtility.java | 6 +- .../mc/citadel/ReinforcementLogic.java | 25 ++++-- .../vg/civcraft/mc/citadel/command/Acid.java | 3 +- .../command/AdvancedFortification.java | 8 +- .../mc/citadel/command/Fortification.java | 8 +- .../mc/citadel/command/Reinforce.java | 8 +- .../events/ReinforcementDamageEvent.java | 10 +-- .../events/ReinforcementDestructionEvent.java | 60 +++++++++++++ .../events/ReinforcementRepairEvent.java | 29 +++++++ .../mc/citadel/listener/BlockListener.java | 24 +++--- .../mc/citadel/listener/EntityListener.java | 10 +-- .../citadel/listener/InventoryListener.java | 3 +- .../mc/citadel/listener/RedstoneListener.java | 7 +- .../mc/citadel/model/CitadelStorage.java | 15 ++-- .../mc/citadel/model/HologramManager.java | 6 +- .../mc/citadel/model/Reinforcement.java | 46 +++++++--- .../playerstate/AbstractPlayerState.java | 10 ++- .../AdvancedFortificationState.java | 2 +- .../citadel/playerstate/InformationState.java | 3 +- .../mc/citadel/playerstate/InsecureState.java | 4 +- .../mc/citadel/playerstate/PatchState.java | 23 ++--- .../citadel/playerstate/ReinforcingState.java | 10 +-- 24 files changed, 313 insertions(+), 138 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java create mode 100644 src/main/java/vg/civcraft/mc/citadel/events/ReinforcementRepairEvent.java diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 236b4084..a3576b56 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -1,6 +1,5 @@ package vg.civcraft.mc.citadel; -import java.util.LinkedList; import java.util.logging.Logger; import org.bukkit.Bukkit; @@ -23,21 +22,9 @@ import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.ChunkMetaAPI; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; -import vg.civcraft.mc.namelayer.GroupManager.PlayerType; -import vg.civcraft.mc.namelayer.permission.PermissionType; public class Citadel extends ACivMod { - public static final String chestPerm = "CHESTS"; - public static final String bypassPerm = "BYPASS_REINFORCEMENT"; - public static final String cropsPerm = "CROPS"; - public static final String insecurePerm = "INSECURE_REINFORCEMENT"; - public static final String reinforcePerm = "REINFORCE"; - public static final String doorPerm = "DOORS"; - public static final String acidPerm = "ACIDBLOCK"; - public static final String infoPerm = "REINFORCEMENT_INFO"; - public static final String repairPerm = "REPAIR_REINFORCEMENT"; - private static Citadel instance; public static Citadel getInstance() { @@ -135,7 +122,7 @@ public void onEnable() { if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { holoManager = new HologramManager(); } - registerNameLayerPermissions(); + CitadelPermissionHandler.setup(); registerListeners(); } @@ -148,35 +135,4 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new InventoryListener(), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); } - - @SuppressWarnings("unchecked") - private void registerNameLayerPermissions() { - LinkedList membersAndAbove = new LinkedList<>(); - membersAndAbove.add(PlayerType.MEMBERS); - membersAndAbove.add(PlayerType.MODS); - membersAndAbove.add(PlayerType.ADMINS); - membersAndAbove.add(PlayerType.OWNER); - LinkedList modsAndAbove = new LinkedList<>(); - modsAndAbove.add(PlayerType.MODS); - modsAndAbove.add(PlayerType.ADMINS); - modsAndAbove.add(PlayerType.OWNER); - PermissionType.registerPermission(reinforcePerm, (LinkedList) modsAndAbove.clone(), - "Allows reinforcing blocks on this group"); - PermissionType.registerPermission(acidPerm, (LinkedList) modsAndAbove.clone(), - "Allows activating acid blocks reinforced on this group"); - PermissionType.registerPermission(infoPerm, (LinkedList) membersAndAbove.clone(), - "Allows viewing information on reinforcements reinforced on this group"); - PermissionType.registerPermission(bypassPerm, (LinkedList) modsAndAbove.clone(), - "Allows bypassing reinforcements reinforced on this group"); - PermissionType.registerPermission(repairPerm, (LinkedList) modsAndAbove.clone(), - "Allows repairing reinforcements reinforced on this group"); - PermissionType.registerPermission(doorPerm, (LinkedList) membersAndAbove.clone(), - "Allows opening doors reinforced on this group"); - PermissionType.registerPermission(chestPerm, (LinkedList) membersAndAbove.clone(), - "Allows opening containers like chests reinforced on this group"); - PermissionType.registerPermission(cropsPerm, (LinkedList) membersAndAbove.clone(), - "Allows harvesting crops growing on soil reinforced on this group"); - PermissionType.registerPermission(insecurePerm, (LinkedList) membersAndAbove.clone(), - "Allows toggling the insecure flag on reinforcements"); - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java new file mode 100644 index 00000000..8bda2ec8 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -0,0 +1,85 @@ +package vg.civcraft.mc.citadel; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import vg.civcraft.mc.namelayer.GroupManager.PlayerType; +import vg.civcraft.mc.namelayer.permission.PermissionType; + +public class CitadelPermissionHandler { + + private CitadelPermissionHandler() { + } + + private static PermissionType chestPerm; + private static PermissionType bypassPerm; + private static PermissionType cropsPerm; + private static PermissionType insecurePerm; + private static PermissionType reinforcePerm; + private static PermissionType doorPerm; + private static PermissionType acidPerm; + private static PermissionType infoPerm; + private static PermissionType repairPerm; + + + public static void setup() { + List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, PlayerType.OWNER); + List modAndAbove = Arrays.asList(PlayerType.MODS, PlayerType.ADMINS, PlayerType.OWNER); + reinforcePerm = PermissionType.registerPermission("REINFORCE", new ArrayList<>(modAndAbove), + "Allows reinforcing blocks on this group"); + acidPerm = PermissionType.registerPermission("ACIDBLOCK", new ArrayList<>(modAndAbove), + "Allows activating acid blocks reinforced on this group"); + infoPerm = PermissionType.registerPermission("REINFORCEMENT_INFO", new ArrayList<>(membersAndAbove), + "Allows viewing information on reinforcements reinforced on this group"); + bypassPerm = PermissionType.registerPermission("BYPASS_REINFORCEMENT", new ArrayList<>(modAndAbove), + "Allows bypassing reinforcements reinforced on this group"); + repairPerm = PermissionType.registerPermission("REPAIR_REINFORCEMENT", new ArrayList<>(modAndAbove), + "Allows repairing reinforcements reinforced on this group"); + doorPerm = PermissionType.registerPermission("DOORS", new ArrayList<>(membersAndAbove), + "Allows opening doors reinforced on this group"); + chestPerm = PermissionType.registerPermission("CHESTS", new ArrayList<>(membersAndAbove), + "Allows opening containers like chests reinforced on this group"); + cropsPerm = PermissionType.registerPermission("CROPS", new ArrayList<>(membersAndAbove), + "Allows harvesting crops growing on soil reinforced on this group"); + insecurePerm = PermissionType.registerPermission("INSECURE_REINFORCEMENT", new ArrayList<>(membersAndAbove), + "Allows toggling the insecure flag on reinforcements"); + } + + public static PermissionType getChests() { + return chestPerm; + } + + public static PermissionType getDoors() { + return doorPerm; + } + + public static PermissionType getBypass() { + return bypassPerm; + } + + public static PermissionType getReinforce() { + return reinforcePerm; + } + + public static PermissionType getAcidblock() { + return acidPerm; + } + + public static PermissionType getCrops() { + return cropsPerm; + } + + public static PermissionType getInsecure() { + return insecurePerm; + } + + public static PermissionType getInfo() { + return infoPerm; + } + + public static PermissionType getRepair() { + return repairPerm; + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 044ee0c1..ec6718d1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -16,7 +16,6 @@ import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; /** * Just a useful class with general and misplaced methods that can be called @@ -144,7 +143,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp } // check if player still has permission if (!NameAPI.getGroupManager().hasAccess(group, player.getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm))) { + CitadelPermissionHandler.getReinforce())) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(player, null); @@ -178,7 +177,6 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() + " for " + block.getType().toString() + " at " + block.getLocation().toString()); } - ReinforcementLogic.createReinforcement(player, block, type, group); - return false; + return ReinforcementLogic.createReinforcement(player, block, type, group) == null; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 6cb74a7e..16f75f7f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -10,6 +10,7 @@ import org.bukkit.inventory.InventoryHolder; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; +import vg.civcraft.mc.citadel.events.ReinforcementDestructionEvent; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -19,16 +20,28 @@ public class ReinforcementLogic { public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); + ReinforcementCreationEvent event = new ReinforcementCreationEvent(player, rein); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return null; + } Citadel.getInstance().getReinforcementManager().putReinforcement(rein); if (type.getCreationEffect() != null) { type.getCreationEffect().playEffect(rein); } - Bukkit.getPluginManager().callEvent(new ReinforcementCreationEvent(player, rein)); return rein; } - public static void damageReinforcement(Reinforcement rein, double damage) { - rein.setHealth((float) (rein.getHealth() - damage)); + public static void damageReinforcement(Reinforcement rein, float damage) { + float futureHealth = rein.getHealth() - damage; + if (futureHealth <= 0) { + ReinforcementDestructionEvent event = new ReinforcementDestructionEvent(rein, damage); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + } + rein.setHealth(futureHealth); if (rein.isBroken()) { if (rein.getType().getDestructionEffect() != null) { rein.getType().getDestructionEffect().playEffect(rein); @@ -40,8 +53,8 @@ public static void damageReinforcement(Reinforcement rein, double damage) { } } - public static double getDamageApplied(Reinforcement reinforcement) { - double damageAmount = 1.0; + public static float getDamageApplied(Reinforcement reinforcement) { + float damageAmount = 1.0f; if (!reinforcement.isMature()) { double timeExisted = System.currentTimeMillis() - reinforcement.getCreationTime(); double progress = timeExisted / reinforcement.getType().getMaturationTime(); @@ -171,7 +184,7 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { if (rein.isInsecure()) { return false; } - return !rein.hasPermission(player, Citadel.chestPerm); + return !rein.hasPermission(player, CitadelPermissionHandler.getChests()); } return false; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 57ba0ad9..1e234aac 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -16,6 +16,7 @@ import org.bukkit.util.BlockIterator; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementAcidBlockedEvent; @@ -44,7 +45,7 @@ public boolean execute(CommandSender sender, String[] args) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } - if (!reinforcement.hasPermission(p, Citadel.acidPerm)) { + if (!reinforcement.hasPermission(p, CitadelPermissionHandler.getAcidblock())) { CitadelUtility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java index 6b80d53d..aa668858 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -10,6 +10,7 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.AdvancedFortificationState; @@ -21,7 +22,6 @@ import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; @CivCommand(id = "cta") public class AdvancedFortification extends StandaloneCommand { @@ -78,7 +78,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm)); + CitadelPermissionHandler.getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); return true; @@ -94,10 +94,10 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), (Player) sender); else { return new ArrayList<>(); diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index 81d662d7..38959f5e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.FortificationState; @@ -19,7 +20,6 @@ import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; @CivCommand(id = "ctf") public class Fortification extends StandaloneCommand { @@ -60,7 +60,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm)); + CitadelPermissionHandler.getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); @@ -80,10 +80,10 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), (Player) sender); else { return new ArrayList<>(); diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java index ead8962f..c5a19d80 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -9,6 +9,7 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; @@ -19,7 +20,6 @@ import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; @CivCommand(id = "ctr") public class Reinforce extends StandaloneCommand { @@ -47,7 +47,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm)); + CitadelPermissionHandler.getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); @@ -71,10 +71,10 @@ public List tabComplete(CommandSender sender, String[] args) { return null; if (args.length == 0) - return GroupTabCompleter.complete(null, PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], PermissionType.getPermission(Citadel.reinforcePerm), + return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), (Player) sender); else { return new ArrayList<>(); diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java index 3d534313..67e7cdd5 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDamageEvent.java @@ -6,7 +6,7 @@ import vg.civcraft.mc.citadel.model.Reinforcement; /** - * Called when a reinforcement is damaged by a player + * Called when a reinforcement is damaged by a player, but not when it is damaged by other entities or natural causes * */ public class ReinforcementDamageEvent extends ReinforcementEvent { @@ -17,9 +17,9 @@ public static HandlerList getHandlerList() { return handlers; } - private double damageDone; + private float damageDone; - public ReinforcementDamageEvent(Player player, Reinforcement rein, double damageDone) { + public ReinforcementDamageEvent(Player player, Reinforcement rein, float damageDone) { super(player, rein); this.damageDone = damageDone; } @@ -29,7 +29,7 @@ public ReinforcementDamageEvent(Player player, Reinforcement rein, double damage * * @return Total damage */ - public double getDamageDone() { + public float getDamageDone() { return damageDone; } @@ -43,7 +43,7 @@ public HandlerList getHandlers() { * * @param damageDone Damage to do */ - public void setDamageDone(double damageDone) { + public void setDamageDone(float damageDone) { this.damageDone = damageDone; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java new file mode 100644 index 00000000..8845771d --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java @@ -0,0 +1,60 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.model.Reinforcement; + +/** + * Called when a reinforcement is forcefully destroyed, meaning it is removed + * and was not bypassed + * + */ +public class ReinforcementDestructionEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() { + return handlers; + } + + private boolean isCancelled; + private Reinforcement reinforcement; + private float finalDamage; + + public ReinforcementDestructionEvent(Reinforcement reinforcement, float finalDamage) { + this.finalDamage = finalDamage; + this.reinforcement = reinforcement; + } + + /** + * @return Reinforcement destroyed + */ + public Reinforcement getReinforcement() { + return reinforcement; + } + + /** + * @return How much damage was dealt in the killing blow to the reinforcement + */ + public float getFinalDamage() { + return finalDamage; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean value) { + isCancelled = value; + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementRepairEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementRepairEvent.java new file mode 100644 index 00000000..87dc94fa --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementRepairEvent.java @@ -0,0 +1,29 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import vg.civcraft.mc.citadel.model.Reinforcement; + +/** + * Called when a reinforcement is repaired in patch mode + * + */ +public class ReinforcementRepairEvent extends ReinforcementEvent { + + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() { + return handlers; + } + + public ReinforcementRepairEvent(Player who, Reinforcement reinforcement) { + super(who, reinforcement); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 3a4a46f2..31c904f0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -24,9 +24,11 @@ import org.bukkit.event.world.StructureGrowEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.MaterialAPI; public class BlockListener implements Listener { @@ -38,17 +40,17 @@ public class BlockListener implements Listener { private static final Material matfire = Material.FIRE; - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void blockBreakEvent(BlockBreakEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBreakBlock(event); } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void blockPlaceEvent(BlockPlaceEvent event) { Citadel.getInstance().getStateManager().getState(event.getPlayer()).handleBlockPlace(event); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void blockBurn(BlockBurnEvent bbe) { Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(bbe.getBlock()); if (reinforcement == null) { @@ -78,7 +80,7 @@ public void blockBurn(BlockBurnEvent bbe) { } } - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void blockPhysEvent(BlockPhysicsEvent event) { Block block = event.getBlock(); if (block.getType().hasGravity()) { @@ -117,7 +119,7 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { } } - @EventHandler(priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void interact(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; @@ -126,7 +128,7 @@ public void interact(PlayerInteractEvent pie) { } // prevent placing water inside of reinforced blocks - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.LOW) public void liquidDumpEvent(PlayerBucketEmptyEvent event) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); if (block.getType().equals(Material.AIR) || block.getType().isSolid()) { @@ -148,7 +150,7 @@ public void onBlockFromToEvent(BlockFromToEvent event) { } // prevent breaking reinforced blocks through plant growth - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onStructureGrow(StructureGrowEvent event) { for (BlockState block_state : event.getBlocks()) { if (ReinforcementLogic.getReinforcementProtecting(block_state.getBlock()) != null) { @@ -159,7 +161,7 @@ public void onStructureGrow(StructureGrowEvent event) { } // prevent opening reinforced things - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void openContainer(PlayerInteractEvent e) { if (!e.hasBlock()) { return; @@ -169,7 +171,7 @@ public void openContainer(PlayerInteractEvent e) { return; } if (e.getClickedBlock().getBlockData() instanceof Container) { - if (!rein.hasPermission(e.getPlayer(), Citadel.chestPerm)) { + if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getChests())) { e.setCancelled(true); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); @@ -177,7 +179,7 @@ public void openContainer(PlayerInteractEvent e) { return; } if (e.getClickedBlock().getBlockData() instanceof Openable) { - if (!rein.hasPermission(e.getPlayer(), Citadel.doorPerm)) { + if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getDoors())) { e.setCancelled(true); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); @@ -207,7 +209,7 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { // remove reinforced air @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void removeReinforcedAir(BlockPlaceEvent e) { - if (e.getBlockReplacedState().getType() != Material.AIR) { + if (!MaterialAPI.isAir(e.getBlockReplacedState().getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(e.getBlock()); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index ecc38a4a..6cb4a794 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -33,7 +33,7 @@ public class EntityListener implements Listener { protected GroupManager gm = NameAPI.getGroupManager(); // prevent zombies from breaking reinforced doors - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ebde.getBlock()); if (rein != null) { @@ -44,7 +44,7 @@ public void breakDoor(EntityBreakDoorEvent ebde) { } } - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void changeBlock(EntityChangeBlockEvent ecbe) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ecbe.getBlock()); if (rein != null) { @@ -56,7 +56,7 @@ public void changeBlock(EntityChangeBlockEvent ecbe) { } // apply explosion damage to reinforcements - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void explode(EntityExplodeEvent eee) { Iterator iterator = eee.blockList().iterator(); // we can edit the result by removing blocks from the list @@ -91,7 +91,7 @@ private List getGolemBlocks(EntityType type, Block base) { return blocks; } - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.HIGHEST) public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); @@ -112,7 +112,7 @@ public void run() { } // prevent creating golems from reinforced blocks - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) public void spawn(CreatureSpawnEvent cse) { EntityType type = cse.getEntityType(); if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index b51de7fe..98771133 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -2,6 +2,7 @@ import org.bukkit.block.Container; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.inventory.Inventory; @@ -13,7 +14,7 @@ public class InventoryListener implements Listener { // prevent sucking reinforcements out of reinforced containers with hoppers on // different groups or filling into them - @EventHandler(ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Inventory sourceInv = event.getSource(); Reinforcement sourceRein = null; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 5a4967b6..ab8a05cd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -27,6 +27,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -51,7 +52,7 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl if (player_x < min_x || player_x > max_x || player_z < min_z || player_z > max_z) { continue; } - if (!reinforcement.hasPermission(player, Citadel.doorPerm)) { + if (!reinforcement.hasPermission(player, CitadelPermissionHandler.getDoors())) { continue; } double distanceSquared = playerLocation.distance(reinLocation); @@ -97,7 +98,7 @@ public void pistonRetract(BlockPistonRetractEvent bpre) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void pressButton(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { return; @@ -146,7 +147,7 @@ public void redstonePower(BlockRedstoneEvent bre) { return; } for (UUID uuid : playersActivating) { - if (rein.hasPermission(uuid, Citadel.doorPerm)) { + if (rein.hasPermission(uuid, CitadelPermissionHandler.getDoors())) { // single valid perm is enough to open return; } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java index 54858460..4777eff0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -64,18 +64,19 @@ public void insert(Reinforcement data, ChunkCoord coord) { public void update(Reinforcement data, ChunkCoord coord) { try (Connection insertConn = db.getConnection(); PreparedStatement updateRein = insertConn.prepareStatement( - "update ctdl_reinforcements set type_id = ?, health = ?, group_id = ?, insecure = ? where " + "update ctdl_reinforcements set type_id = ?, health = ?, group_id = ?, insecure = ?, creation_time = ? where " + "chunk_x = ? and chunk_z = ? and world_id = ? and x_offset = ? and y = ? and z_offset = ?;");) { updateRein.setShort(1, data.getType().getID()); updateRein.setFloat(2, data.getHealth()); updateRein.setInt(3, data.getGroupId()); updateRein.setBoolean(4, data.isInsecure()); - updateRein.setInt(5, coord.getX()); - updateRein.setInt(6, coord.getZ()); - updateRein.setShort(7, (short) coord.getWorldID()); - updateRein.setByte(8, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); - updateRein.setByte(9, (byte) data.getLocation().getBlockY()); - updateRein.setByte(10,(byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + updateRein.setTimestamp(5, new Timestamp(data.getCreationTime())); + updateRein.setInt(6, coord.getX()); + updateRein.setInt(7, coord.getZ()); + updateRein.setShort(8, (short) coord.getWorldID()); + updateRein.setByte(9, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + updateRein.setByte(10, (byte) data.getLocation().getBlockY()); + updateRein.setByte(11,(byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); updateRein.execute(); } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to update reinforcement in db: ", e); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index 4e4e236f..ea8e1210 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -18,11 +18,13 @@ import com.gmail.filoghost.holographicdisplays.api.HologramsAPI; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.playerstate.InformationState; public class HologramManager { - //distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for good measure + // distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for + // good measure private static final double holoOffSet = 0.55 * Math.sqrt(2); private Map> holograms; @@ -97,7 +99,7 @@ public PlayerHolo(Player player, Reinforcement reinforcement) { // we intentionally cache permission to avoid having to look it up often // showing a bit too much information if the player gets kicked while a holo is // already visible does not matter - this.hasPermission = reinforcement.hasPermission(player, Citadel.infoPerm); + this.hasPermission = reinforcement.hasPermission(player, CitadelPermissionHandler.getInfo()); } void show() { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 2b55c14c..e1401a91 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -18,7 +18,7 @@ public class Reinforcement extends TableBasedDataObject { private static Random rng = new Random(); - private final long creationTime; + private long creationTime; private ReinforcementType type; private float health; private int groupId; @@ -95,17 +95,32 @@ public Location getBlockCenter() { public ReinforcementType getType() { return type; } - - public boolean hasPermission(Player p, String permission) { - return hasPermission(p.getUniqueId(), permission); - } - - public boolean hasPermission(UUID uuid, String permission) { + + /** + * Checks whether the player with the given UUID has the given permission on the group this reinforcement belongs to + * @param player UUID of the player to check permissions for, not null + * @param permission Permission to check, not null + * @return True if the player has the given permission on this reinforcements group, false otherwise + */ + public boolean hasPermission(UUID uuid, PermissionType permission) { + if (permission == null) { + throw new IllegalArgumentException("PermissionType may not be null"); + } Group g = getGroup(); if (g == null) { return false; } - return NameAPI.getGroupManager().hasAccess(g, uuid, PermissionType.getPermission(permission)); + return NameAPI.getGroupManager().hasAccess(g, uuid, permission); + } + + /** + * Checks whether the given player has the given permission on the group this reinforcement belongs to + * @param player Player to check permissions for, not null + * @param permission Permission to check, not null + * @return True if the player has the given permission on this reinforcements group, false otherwise + */ + public boolean hasPermission(Player player, PermissionType permission) { + return hasPermission(player.getUniqueId(), permission); } /** @@ -141,7 +156,7 @@ public void setGroup(Group group) { throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); } this.groupId = group.getGroupId(); - setCacheState(CacheState.MODIFIED); + setDirty(); } /** @@ -156,13 +171,13 @@ public void setHealth(float health) { setCacheState(CacheState.DELETED); } else { - setCacheState(CacheState.MODIFIED); + setDirty(); } } public void setType(ReinforcementType type) { this.type = type; - setCacheState(CacheState.MODIFIED); + setDirty(); } /** @@ -170,7 +185,14 @@ public void setType(ReinforcementType type) { */ public void toggleInsecure() { insecure = !insecure; - setCacheState(CacheState.MODIFIED); + setDirty(); + } + + /** + * Resets the timestamp at which the reinforcement was created to the current one + */ + public void resetCreationTime() { + this.creationTime = System.currentTimeMillis(); } /** diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 21020b70..aa0f8eaf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -12,7 +12,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; @@ -43,7 +43,7 @@ public void handleBreakBlock(BlockBreakEvent e) { // no reinforcement, normal break which we dont care about return; } - boolean hasAccess = rein.hasPermission(e.getPlayer(), Citadel.bypassPerm); + boolean hasAccess = rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass()); BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); boolean hasByPass = setting.getValue(e.getPlayer()); if (hasAccess && hasByPass) { @@ -51,14 +51,16 @@ public void handleBreakBlock(BlockBreakEvent e) { Bukkit.getPluginManager().callEvent(bypassEvent); if (bypassEvent.isCancelled()) { e.setCancelled(true); + return; } if (rein.rollForItemReturn()) { giveReinforcement(e.getBlock().getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); } + rein.setHealth(-1); return; } if (CitadelUtility.isPlant(e.getBlock())) { - if (rein.hasPermission(e.getPlayer(), Citadel.cropsPerm) + if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getCrops()) && !e.getBlock().getLocation().equals(rein.getLocation())) { // allow, because player has crop permission and the only reinforcement // protecting is in the soil @@ -70,7 +72,7 @@ public void handleBreakBlock(BlockBreakEvent e) { "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); } e.setCancelled(true); - double damage = ReinforcementLogic.getDamageApplied(rein); + float damage = ReinforcementLogic.getDamageApplied(rein); ReinforcementDamageEvent dre = new ReinforcementDamageEvent(e.getPlayer(), rein, damage); Bukkit.getPluginManager().callEvent(dre); if (dre.isCancelled()) { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index 250cb720..eda8bc55 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -33,7 +33,7 @@ public String getName() { public void handleBlockPlace(BlockPlaceEvent e) { ItemStack placed = e.getItemInHand(); Player player = e.getPlayer(); - // check if we have a setup for this block, weneed a copy for lookup so we can + // check if we have a setup for this block, we need a copy for lookup so we can // set amount to 1 ItemStack lookUpCopy = placed.clone(); lookUpCopy.setAmount(1); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index abe7a36b..644548f2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -11,6 +11,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.AcidManager; @@ -92,7 +93,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (player.getGameMode() == GameMode.CREATIVE) { e.setCancelled(true); } - if (!rein.hasPermission(player, Citadel.infoPerm)) { + if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) { Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); return; } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index 5291806b..37f64399 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -5,7 +5,7 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -32,7 +32,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } e.setCancelled(true); - if (rein.hasPermission(e.getPlayer(), Citadel.insecurePerm)) { + if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getInsecure())) { rein.toggleInsecure(); if (rein.isInsecure()) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index b9362da8..362188e0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -1,13 +1,15 @@ package vg.civcraft.mc.citadel.playerstate; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; @@ -35,13 +37,13 @@ public void handleInteractBlock(PlayerInteractEvent e) { CitadelUtility.sendAndLog(player, ChatColor.RED, "This block is not reinforced"); return; } - if (!rein.hasPermission(player, Citadel.repairPerm)) { + if (!rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to repair reinforcements on this group"); return; } if (rein.getHealth() >= rein.getType().getHealth()) { - if (rein.hasPermission(player, Citadel.infoPerm)) { + if (rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + InformationState.formatHealth(rein) + ChatColor.GOLD + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " @@ -58,19 +60,18 @@ public void handleInteractBlock(PlayerInteractEvent e) { + rein.getType().getName() + ChatColor.GOLD + " reinforcements"); return; } + ReinforcementRepairEvent repairEvent = new ReinforcementRepairEvent(e.getPlayer(), rein); + Bukkit.getPluginManager().callEvent(repairEvent); + if (repairEvent.isCancelled()) { + return; + } if (!rein.rollForItemReturn()) { if (!CitadelUtility.consumeReinforcementItems(player, rein.getType())) { return; } } - if (Citadel.getInstance().getConfigManager().logCreation()) { - Citadel.getInstance().getLogger() - .info(player.getName() + " recreated reinforcement with " + rein.getType().getName() + " for " - + e.getClickedBlock().getType().toString() + " at " - + e.getClickedBlock().getLocation().toString() + " via repair"); - } - rein.setHealth(-1); - ReinforcementLogic.createReinforcement(player, rein.getLocation().getBlock(), rein.getType(), rein.getGroup()); + rein.setHealth(rein.getType().getHealth()); + rein.resetCreationTime(); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 77cb50e6..aae18939 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -7,6 +7,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; @@ -16,7 +17,6 @@ import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; public class ReinforcingState extends AbstractPlayerState { @@ -71,7 +71,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { } // does the player have permission to reinforce on that group if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), - PermissionType.getPermission(Citadel.reinforcePerm))) { + CitadelPermissionHandler.getReinforce())) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); @@ -80,7 +80,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); // if reinforcement exists, check if player has permission to edit it if (rein != null) { - if (!rein.hasPermission(e.getPlayer(), Citadel.bypassPerm)) { + if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass())) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You do not have permission to bypass reinforcements on " + group.getName()); return; @@ -129,8 +129,8 @@ public void handleInteractBlock(PlayerInteractEvent e) { Bukkit.getPluginManager().callEvent(rcte); if (!rcte.isCancelled()) { giveReinforcement(rein.getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); - rein.setHealth(-1); - ReinforcementLogic.createReinforcement(player, rein.getLocation().getBlock(), type, group); + rein.setType(type); + rein.resetCreationTime(); CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Updated reinforcement to " + rein.getType().getName() + " on " + group.getName()); } else if (changedGroup) { From ad2d067518381beccfe9830589f6081c9e43badf Mon Sep 17 00:00:00 2001 From: Okx Date: Mon, 2 Sep 2019 02:55:32 +0100 Subject: [PATCH 136/255] Use BlockAPI Also cleanup isAuthorizedPlayerNear --- .../civcraft/mc/citadel/CitadelUtility.java | 66 +++++++++---------- .../mc/citadel/ReinforcementLogic.java | 4 +- .../mc/citadel/listener/BlockListener.java | 13 +--- .../mc/citadel/listener/RedstoneListener.java | 55 ++++++---------- 4 files changed, 58 insertions(+), 80 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index ec6718d1..d9fafb84 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -71,39 +71,39 @@ public static void dropItemAtLocation(final Location l, final ItemStack is) { public static boolean isPlant(Block plant) { switch (plant.getType()) { - case DANDELION: - case POPPY: - case BLUE_ORCHID: - case ALLIUM: - case AZURE_BLUET: - case ORANGE_TULIP: - case RED_TULIP: - case PINK_TULIP: - case WHITE_TULIP: - case OXEYE_DAISY: - case ACACIA_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case SPRUCE_SAPLING: - case WHEAT: - case CARROTS: - case POTATOES: - case BEETROOTS: - case MELON_STEM: - case PUMPKIN_STEM: - case ATTACHED_MELON_STEM: - case ATTACHED_PUMPKIN_STEM: - case NETHER_WART_BLOCK: - case SUGAR_CANE: - case CACTUS: - case SUNFLOWER: - case LILAC: - case PEONY: - return true; - default: - return false; + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: + case WHEAT: + case CARROTS: + case POTATOES: + case BEETROOTS: + case MELON_STEM: + case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case NETHER_WART_BLOCK: + case SUGAR_CANE: + case CACTUS: + case SUNFLOWER: + case LILAC: + case PEONY: + return true; + default: + return false; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 16f75f7f..60f48af4 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -14,6 +14,7 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.namelayer.group.Group; public class ReinforcementLogic { @@ -195,8 +196,7 @@ public static Reinforcement resolveDoubleChestReinforcement(Block block) { if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { return rein; } - for (BlockFace face : BlockListener.PLANAR_SIDES) { - Block relative = block.getRelative(face); + for (Block relative : BlockAPI.getPlanarSides(block)) { if (relative.getType() != mat) { continue; } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 31c904f0..71031cef 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -1,8 +1,5 @@ package vg.civcraft.mc.citadel.listener; -import java.util.Arrays; -import java.util.List; - import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; @@ -29,15 +26,10 @@ import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.MaterialAPI; +import vg.civcraft.mc.civmodcore.api.BlockAPI; public class BlockListener implements Listener { - public static final List ALL_SIDES = Arrays.asList(BlockFace.UP, BlockFace.DOWN, BlockFace.NORTH, - BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST); - - public static final List PLANAR_SIDES = Arrays.asList(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, - BlockFace.EAST); - private static final Material matfire = Material.FIRE; @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) @@ -195,8 +187,7 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { if (mat != Material.CHEST && mat != Material.TRAPPED_CHEST) { return; } - for (BlockFace face : PLANAR_SIDES) { - Block rel = e.getBlock().getRelative(face); + for (Block rel : BlockAPI.getPlanarSides(e.getBlock())) { if (rel.getType() == mat && ReinforcementLogic.isPreventingBlockAccess(e.getPlayer(), rel)) { e.setCancelled(true); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index ab8a05cd..23e17485 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel.listener; +import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -16,6 +17,7 @@ import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Door; import org.bukkit.block.data.type.Switch; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -30,38 +32,25 @@ import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.BlockAPI; public class RedstoneListener implements Listener { private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, double distance) { Location reinLocation = reinforcement.getLocation(); - double min_x = reinLocation.getX() - distance; - double min_z = reinLocation.getZ() - distance; - double max_x = reinLocation.getX() + distance; - double max_z = reinLocation.getZ() + distance; - boolean result = false; - for (Player player : Bukkit.getOnlinePlayers()) { - if (player.isDead()) { - continue; - } - Location playerLocation = player.getLocation(); - double player_x = playerLocation.getX(); - double player_z = playerLocation.getZ(); - // Simple bounding box check to quickly rule out Players - // before doing the more expensive playerLocation.distance - if (player_x < min_x || player_x > max_x || player_z < min_z || player_z > max_z) { - continue; - } - if (!reinforcement.hasPermission(player, CitadelPermissionHandler.getDoors())) { - continue; - } - double distanceSquared = playerLocation.distance(reinLocation); - if (distanceSquared <= distance) { - result = true; - break; - } + + if (reinLocation.getWorld() == null) { + return false; } - return result; + + // distance is radius, not diameter + double diameter = distance * 2; + Collection entities = reinLocation.getWorld().getNearbyEntities(reinLocation, diameter, diameter, diameter, + e -> e instanceof Player + && !e.isDead() + && reinforcement.hasPermission(e.getUniqueId(), Citadel.doorPerm) + && e.getLocation().distanceSquared(reinLocation) <= diameter * diameter); + return !entities.isEmpty(); } private double maxRedstoneDistance; @@ -73,7 +62,7 @@ public RedstoneListener(double maxRedstoneDistance) { this.authorizations = new HashMap<>(); Bukkit.getScheduler().scheduleSyncRepeatingTask(Citadel.getInstance(), () -> { authorizations.clear(); - }, 1L, 1L); + }, 1, 1); } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) @@ -157,11 +146,7 @@ public void redstonePower(BlockRedstoneEvent bre) { } private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { - for (BlockFace face : BlockListener.ALL_SIDES) { - if (face == skip) { - continue; - } - Block rel = block.getRelative(face); + for (Block rel : BlockAPI.getAllSides(block, f -> f != skip)) { BlockData blockData = rel.getBlockData(); if (!(blockData instanceof Openable)) { continue; @@ -189,8 +174,10 @@ public void stepPressurePlate(PlayerInteractEvent e) { return; } Material mat = e.getClickedBlock().getType(); - if (mat != Material.STONE_PRESSURE_PLATE && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE - && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { + if (mat != Material.STONE_PRESSURE_PLATE + && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE + && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE + && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); From ad596a6ce5ec0d7649e87483f900063111303a63 Mon Sep 17 00:00:00 2001 From: Okx Date: Mon, 2 Sep 2019 02:57:34 +0100 Subject: [PATCH 137/255] fix --- .../java/vg/civcraft/mc/citadel/listener/RedstoneListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 23e17485..b3724efc 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -48,7 +48,7 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl Collection entities = reinLocation.getWorld().getNearbyEntities(reinLocation, diameter, diameter, diameter, e -> e instanceof Player && !e.isDead() - && reinforcement.hasPermission(e.getUniqueId(), Citadel.doorPerm) + && reinforcement.hasPermission(e.getUniqueId(), CitadelPermissionHandler.getDoors()) && e.getLocation().distanceSquared(reinLocation) <= diameter * diameter); return !entities.isEmpty(); } From fc2a58b74a175d4a3b4fedf642f81edbaae4fb3d Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:28:21 +0100 Subject: [PATCH 138/255] Update Item Frame behaviour to allow for more interactions --- .../mc/citadel/listener/EntityListener.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 10172bb0..9d76651f 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel.listener; +import org.bukkit.inventory.ItemStack; import static vg.civcraft.mc.citadel.Utility.canPlace; import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; @@ -167,6 +168,10 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { if (group == null) { return; } + // If the reinforcement is insecure, then allow the block placement + if (playerReinforcement.isInsecure()) { + return; + } PermissionType permission = PermissionType.getPermission("REINFORCE"); // If the REINFORCE permission is not registered, do nothing if (permission == null) { @@ -217,7 +222,11 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { return; } Player player = (Player) event.getRemover(); - // If the player is a member of the group and has bypass permissions, do nothing + // If the reinforcement is insecure, allow the break + if (playerReinforcement.isInsecure()) { + return; + } + // If the player has bypass permissions, allow the break if (playerReinforcement.canBypass(player)) { return; } @@ -253,7 +262,21 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { return; } Player player = event.getPlayer(); - // If the player is a member of the group and has bypass permissions, do nothing + // Item Frame specific behaviour + if (entity instanceof ItemFrame) { + // If the reinforcement is insecure, then allow all alterations + if (playerReinforcement.isInsecure()) { + return; + } + // If player can access doors, allow rotation alterations + ItemStack heldItem = ((ItemFrame) entity).getItem(); + if (heldItem != null && heldItem.getType() != Material.AIR) { + if (playerReinforcement.canAccessDoors(player)) { + return; + } + } + } + // If the player has bypass permissions, allow all alterations if (playerReinforcement.canBypass(player)) { return; } @@ -291,6 +314,16 @@ public void entityDamageEvent(EntityDamageByEntityEvent event) { if (group == null) { return; } + // If the hanging entity is an item frame and it holds an item and the reinforcement is + // insecure, then allow the item frame to be damaged, which will drop the item. + if (entity instanceof ItemFrame) { + if (playerReinforcement.isInsecure()) { + ItemStack heldItem = ((ItemFrame) entity).getItem(); + if (heldItem != null && heldItem.getType() != Material.AIR) { + return; + } + } + } Player player = (Player) event.getDamager(); // If the player is a member of the group and has bypass permissions, do nothing if (playerReinforcement.canBypass(player)) { From 397e4d88caf480330fecc74facbfcc4efee5f32a Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:28:57 +0100 Subject: [PATCH 139/255] Unused import cleanup --- .../mc/citadel/listener/EntityListener.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 9d76651f..c9b8b793 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -1,17 +1,9 @@ package vg.civcraft.mc.citadel.listener; import org.bukkit.inventory.ItemStack; -import static vg.civcraft.mc.citadel.Utility.canPlace; -import static vg.civcraft.mc.citadel.Utility.createNaturalReinforcement; -import static vg.civcraft.mc.citadel.Utility.createPlayerReinforcement; import static vg.civcraft.mc.citadel.Utility.explodeReinforcement; import static vg.civcraft.mc.citadel.Utility.getRealBlock; import static vg.civcraft.mc.citadel.Utility.maybeReinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.reinforcementBroken; -import static vg.civcraft.mc.citadel.Utility.reinforcementDamaged; -import static vg.civcraft.mc.citadel.Utility.timeUntilAcidMature; -import static vg.civcraft.mc.citadel.Utility.timeUntilMature; -import static vg.civcraft.mc.citadel.Utility.wouldPlantDoubleReinforce; import java.util.ArrayList; import java.util.Iterator; @@ -24,7 +16,6 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Hanging; import org.bukkit.entity.ItemFrame; @@ -38,25 +29,19 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.hanging.HangingBreakEvent.RemoveCause; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.Inventory; import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelConfigManager; import vg.civcraft.mc.citadel.PlayerState; import vg.civcraft.mc.citadel.ReinforcementManager; -import vg.civcraft.mc.citadel.ReinforcementMode; import vg.civcraft.mc.citadel.Utility; -import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; -import vg.civcraft.mc.citadel.misc.ReinforcemnetFortificationCancelException; import vg.civcraft.mc.citadel.reinforcement.PlayerReinforcement; import vg.civcraft.mc.citadel.reinforcement.Reinforcement; -import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; From 90e5af4f08a4a54f04ec921d2f6bda2299f8be66 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:50:26 +0100 Subject: [PATCH 140/255] Bump version - 3.11.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 619a5327..a625d310 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ vg.civcraft.mc.citadel Citadel jar - 3.11.3 + 3.11.4 Citadel https://github.com/Devoted/Citadel From 6901e756bf695bc5990f4d6b7351997b069d6c37 Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 2 Sep 2019 20:52:10 +0100 Subject: [PATCH 141/255] Slightly comment change --- src/vg/civcraft/mc/citadel/listener/EntityListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index c9b8b793..9dbae078 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -153,7 +153,7 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { if (group == null) { return; } - // If the reinforcement is insecure, then allow the block placement + // If the reinforcement is insecure, then allow placement if (playerReinforcement.isInsecure()) { return; } From 339857e7348a78e1eb19b7b8fab44d09385c812b Mon Sep 17 00:00:00 2001 From: Alexander <52572989+Protonull@users.noreply.github.com> Date: Mon, 2 Sep 2019 22:09:04 +0100 Subject: [PATCH 142/255] Now uses custom permissions --- src/vg/civcraft/mc/citadel/Citadel.java | 3 + .../mc/citadel/listener/EntityListener.java | 87 +++++++++---------- .../reinforcement/PlayerReinforcement.java | 24 +++++ 3 files changed, 68 insertions(+), 46 deletions(-) diff --git a/src/vg/civcraft/mc/citadel/Citadel.java b/src/vg/civcraft/mc/citadel/Citadel.java index 1081a699..a039b8db 100644 --- a/src/vg/civcraft/mc/citadel/Citadel.java +++ b/src/vg/civcraft/mc/citadel/Citadel.java @@ -138,6 +138,9 @@ public void registerNameLayerPermissions() { PermissionType.registerPermission("CHESTS",(LinkedList) membersAndAbove.clone()); PermissionType.registerPermission("CROPS",(LinkedList) membersAndAbove.clone()); PermissionType.registerPermission("INSECURE_REINFORCEMENT",(LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission("HANGING_PLACE_BREAK", (LinkedList) modsAndAbove.clone()); + PermissionType.registerPermission("ITEM_FRAME_PUT_TAKE",(LinkedList) membersAndAbove.clone()); + PermissionType.registerPermission("ITEM_FRAME_ROTATE",(LinkedList) membersAndAbove.clone()); } diff --git a/src/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/vg/civcraft/mc/citadel/listener/EntityListener.java index 9dbae078..6aa3b055 100644 --- a/src/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -138,34 +138,28 @@ public void playerQuitEvent(PlayerQuitEvent event){ @EventHandler(priority = EventPriority.HIGHEST) public void hangingPlaceEvent(HangingPlaceEvent event) { - // If Hanging Entity Reinforcements is not enabled, back out + // If Hanging Entity Reinforcements is not enabled, allow placement if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } Reinforcement reinforcement = rm.getReinforcement(event.getBlock()); - // If no player reinforcement is present, do nothing + // If no player reinforcement is present, allow placement if (!(reinforcement instanceof PlayerReinforcement)) { return; } PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; Group group = playerReinforcement.getGroup(); - // If the player reinforcement doesn't have a group, do nothing + // If the player reinforcement doesn't have a group, allow placement if (group == null) { return; } - // If the reinforcement is insecure, then allow placement + // If the reinforcement is insecure, allow placement if (playerReinforcement.isInsecure()) { return; } - PermissionType permission = PermissionType.getPermission("REINFORCE"); - // If the REINFORCE permission is not registered, do nothing - if (permission == null) { - Citadel.getInstance().warning("Could not get the REINFORCE permission from NameLayer. Is it loaded?"); - return; - } Player player = event.getPlayer(); - // If the player is a member of the group and has bypass permissions, do nothing - if (gm.hasAccess(group, player.getUniqueId(), permission)) { + // If the player has the HANGING_PLACE_BREAK permission, allow placement + if (playerReinforcement.canPlaceOrBreakHangingEntity(player)) { return; } // Otherwise prevent the player from putting item frames on other people's reinforced blocks @@ -176,11 +170,10 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { @EventHandler(priority = EventPriority.HIGHEST) public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { - // If Hanging Entity Reinforcements is not enabled, back out + // If Hanging Entity Reinforcements is not enabled, allow break if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } - Hanging entity = event.getEntity(); switch (event.getCause()) { // Allow it to break if: // 1) The host block broke @@ -193,26 +186,26 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { // Prevent break if breaker is player and does not have BYPASS permissions case ENTITY: { if (event.getRemover() instanceof Player) { + Hanging entity = event.getEntity(); Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out - // and let the entity be broken + // If the reinforcement isn't a player reinforcement, allow break if (!(reinforcement instanceof PlayerReinforcement)) { return; } PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; Group group = playerReinforcement.getGroup(); - // If the player reinforcement somehow does not have a group, just back out + // If the player reinforcement somehow does not have a group, allow break if (group == null) { return; } Player player = (Player) event.getRemover(); - // If the reinforcement is insecure, allow the break + // If the reinforcement is insecure, allow break if (playerReinforcement.isInsecure()) { return; } - // If the player has bypass permissions, allow the break - if (playerReinforcement.canBypass(player)) { + // If the player has the HANGING_PLACE_BREAK permissions, allow break + if (playerReinforcement.canPlaceOrBreakHangingEntity(player)) { return; } // Otherwise prevent interaction and notify the player they do not have perms @@ -225,24 +218,24 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { @EventHandler(priority = EventPriority.HIGHEST) public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { - // If Hanging Entity Reinforcements is not enabled, back out + // If Hanging Entity Reinforcements is not enabled, allow interaction if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } - // If the entity isn't a Item Frame, Painting, or LeashHitch, back out + // If the entity isn't a Item Frame, Painting, or LeashHitch, allow interaction if (!(event.getRightClicked() instanceof Hanging)) { return; } Hanging entity = (Hanging) event.getRightClicked(); Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If no player reinforcement is present, do nothing + // If no player reinforcement is present, allow interaction if (!(reinforcement instanceof PlayerReinforcement)) { return; } PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; Group group = playerReinforcement.getGroup(); - // If the player reinforcement doesn't have a group, do nothing + // If the player reinforcement doesn't have a group, allow interaction if (group == null) { return; } @@ -253,17 +246,19 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { if (playerReinforcement.isInsecure()) { return; } - // If player can access doors, allow rotation alterations ItemStack heldItem = ((ItemFrame) entity).getItem(); + // If the item frame has an item and the player has the ITEM_FRAME_ROTATE permission + // then allow the item to be rotated. if (heldItem != null && heldItem.getType() != Material.AIR) { - if (playerReinforcement.canAccessDoors(player)) { + if (playerReinforcement.canRotateItemInItemFrame(player)) { return; } } - } - // If the player has bypass permissions, allow all alterations - if (playerReinforcement.canBypass(player)) { - return; + // Otherwise if the player has the ITEM_FRAME_PUT_TAKE permission, then allow them + // to place items into an empty item frame. + else if (playerReinforcement.canPutInOrTakeFromItemFrame(player)) { + return; + } } // Otherwise prevent interaction and notify the player they do not have perms player.sendMessage(ChatColor.RED + "You do not have permission to alter that."); @@ -272,11 +267,11 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { @EventHandler(priority = EventPriority.HIGHEST) public void entityDamageEvent(EntityDamageByEntityEvent event) { - // If Hanging Entity Reinforcements is not enabled, back out + // If Hanging Entity Reinforcements is not enabled, allow damage if (!CitadelConfigManager.hangersInheritReinforcements()) { return; } - // If the entity isn't a Item Frame, Painting, or LeashHitch, back out + // If the entity isn't a Item Frame, Painting, or LeashHitch, allow damage if (!(event.getEntity() instanceof Hanging)) { return; } @@ -288,34 +283,34 @@ public void entityDamageEvent(EntityDamageByEntityEvent event) { } Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); Reinforcement reinforcement = rm.getReinforcement(host.getLocation()); - // If the reinforcement doesn't exist or isn't a player reinforcement, we can safely back out - // and let the entity be broken + // If the reinforcement isn't a player reinforcement, allow damage if (!(reinforcement instanceof PlayerReinforcement)) { return; } PlayerReinforcement playerReinforcement = (PlayerReinforcement) reinforcement; Group group = playerReinforcement.getGroup(); - // If the player reinforcement somehow does not have a group, just back out + // If the player reinforcement somehow does not have a group, allow damage if (group == null) { return; } - // If the hanging entity is an item frame and it holds an item and the reinforcement is - // insecure, then allow the item frame to be damaged, which will drop the item. + Player player = (Player) event.getDamager(); + // Item Frame specific behaviour if (entity instanceof ItemFrame) { - if (playerReinforcement.isInsecure()) { - ItemStack heldItem = ((ItemFrame) entity).getItem(); - if (heldItem != null && heldItem.getType() != Material.AIR) { + // If the item frame is holding an item + ItemStack heldItem = ((ItemFrame) entity).getItem(); + if (heldItem != null && heldItem.getType() != Material.AIR) { + // If the reinforcement is insecure, then allow the item to be dropped + if (playerReinforcement.isInsecure()) { + return; + } + // Also allow if the player has the ITEM_FRAME_PUT_TAKE permission + if (playerReinforcement.canPutInOrTakeFromItemFrame(player)) { return; } } } - Player player = (Player) event.getDamager(); - // If the player is a member of the group and has bypass permissions, do nothing - if (playerReinforcement.canBypass(player)) { - return; - } // Otherwise prevent interaction and notify the player they do not have perms - player.sendRawMessage(ChatColor.RED + "The host block is protecting this."); + player.sendMessage(ChatColor.RED + "The host block is protecting this."); event.setCancelled(true); } diff --git a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java index 20b0eeb0..e361ad50 100644 --- a/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java +++ b/src/vg/civcraft/mc/citadel/reinforcement/PlayerReinforcement.java @@ -53,6 +53,30 @@ public boolean canBypass(Player p) { return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("BYPASS_REINFORCEMENT")); } + public boolean canPlaceOrBreakHangingEntity(Player p) { + checkValid(); + if (g == null) { + return false; + } + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("HANGING_PLACE_BREAK")); + } + + public boolean canPutInOrTakeFromItemFrame(Player p) { + checkValid(); + if (g == null) { + return false; + } + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("ITEM_FRAME_PUT_TAKE")); + } + + public boolean canRotateItemInItemFrame(Player p) { + checkValid(); + if (g == null) { + return false; + } + return gm.hasAccess(g, p.getUniqueId(), PermissionType.getPermission("ITEM_FRAME_ROTATE")); + } + public boolean canAccessCrops(Player p) { checkValid(); if (g == null) { From 4aba7062544e3936dea7fc9352bb92970e5924a3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 30 Sep 2019 02:52:44 +0200 Subject: [PATCH 143/255] Latest to go along with CMC updates --- src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 1 - .../java/vg/civcraft/mc/citadel/listener/BlockListener.java | 1 - .../vg/civcraft/mc/citadel/model/CitadelSettingManager.java | 1 - src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java | 2 -- 4 files changed, 5 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 60f48af4..93e56d13 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -11,7 +11,6 @@ import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDestructionEvent; -import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.api.BlockAPI; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 71031cef..47470484 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -3,7 +3,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.Container; import org.bukkit.block.data.Openable; diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index ad84cd80..8919a3cd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -41,7 +41,6 @@ void initSettings() { MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", "Citadel and reinforcement related settings"); byPass = new BooleanSetting(Citadel.getInstance(), true, "Bypass", "citadelBypass", - new ItemStack(Material.DIAMOND_PICKAXE), "Allows you to bypass reinforcements you have permission for and break them in a single break"); PlayerSettingAPI.registerSetting(byPass, menu); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index e1401a91..16b5fa81 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -7,7 +7,6 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.CacheState; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -168,7 +167,6 @@ public void setHealth(float health) { this.health = health; if (health <= 0) { getOwningCache().remove(this); - setCacheState(CacheState.DELETED); } else { setDirty(); From 2cd4714cfe2b82d06a169414eeb37bd56bfdf1ce Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Wed, 2 Oct 2019 01:02:49 -0400 Subject: [PATCH 144/255] Fixing a few javaodc problems for clean build --- src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 1 + src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java | 3 ++- src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java | 2 +- .../mc/citadel/reinforcementtypes/ReinforcementEffect.java | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 93e56d13..8c57d206 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -168,6 +168,7 @@ public static Block getResponsibleBlock(Block block) { * Checks if at the given block is a container, which is not insecure and which * the player can not access due to missing perms * + * @param player the player attempting to access stuff * @param block Block to check for * @return True if the player can not do something like placing an adjacent * chest or comparator, false otherwise diff --git a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java index e7ceffe4..c2e584ef 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java @@ -20,7 +20,8 @@ public AcidManager(Collection acidMats) { /** * Checks if acid blocking is enabled for this reinforcement type * - * @param rein Reinforcement type to check for + * @param acidBlock acid Reinforcement type to check for + * @param victim victim block Reinforcement type * @return True if the reinforcement type can acid block other reinforcements * and has an acid timer configured */ diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 16b5fa81..7936d6cd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -97,7 +97,7 @@ public ReinforcementType getType() { /** * Checks whether the player with the given UUID has the given permission on the group this reinforcement belongs to - * @param player UUID of the player to check permissions for, not null + * @param uuid UUID of the player to check permissions for, not null * @param permission Permission to check, not null * @return True if the player has the given permission on this reinforcements group, false otherwise */ diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java index e2066c94..84b660c2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementEffect.java @@ -83,7 +83,7 @@ public void playEffect(Location location) { /** * Display an effect defined in the config around a reinforcement. * - * @param Reinforcement to play effect around + * @param reinforcement Reinforcement to play effect around */ public void playEffect(Reinforcement reinforcement) { playEffect(reinforcement.getBlockCenter()); From e88563aeb4617676964b78e9652582d54e68e627 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 15 Oct 2019 22:40:39 +0200 Subject: [PATCH 145/255] Add involved entity to reinforcement destruction event --- .../mc/citadel/ReinforcementLogic.java | 11 +++++---- .../vg/civcraft/mc/citadel/command/Acid.java | 2 +- .../events/ReinforcementDestructionEvent.java | 23 ++++++++++++++----- .../mc/citadel/listener/EntityListener.java | 6 ++--- .../playerstate/AbstractPlayerState.java | 2 +- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 93e56d13..f4c569e1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -6,6 +6,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.type.Bed; +import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; @@ -16,7 +17,9 @@ import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.namelayer.group.Group; -public class ReinforcementLogic { +public final class ReinforcementLogic { + + private ReinforcementLogic() {} public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); @@ -32,10 +35,10 @@ public static Reinforcement createReinforcement(Player player, Block block, Rein return rein; } - public static void damageReinforcement(Reinforcement rein, float damage) { + public static void damageReinforcement(Reinforcement rein, float damage, Entity source) { float futureHealth = rein.getHealth() - damage; if (futureHealth <= 0) { - ReinforcementDestructionEvent event = new ReinforcementDestructionEvent(rein, damage); + ReinforcementDestructionEvent event = new ReinforcementDestructionEvent(rein, damage, source); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { return; @@ -54,7 +57,7 @@ public static void damageReinforcement(Reinforcement rein, float damage) { } public static float getDamageApplied(Reinforcement reinforcement) { - float damageAmount = 1.0f; + float damageAmount = 1.0F; if (!reinforcement.isMature()) { double timeExisted = System.currentTimeMillis() - reinforcement.getCreationTime(); double progress = timeExisted / reinforcement.getType().getMaturationTime(); diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 1e234aac..022f45ed 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -87,7 +87,7 @@ public boolean execute(CommandSender sender, String[] args) { } reinforcement.setHealth(-1); // play particles for top block - ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1); + ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); topFace.breakNaturally(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java index 8845771d..abd8e17a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementDestructionEvent.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel.events; +import org.bukkit.entity.Entity; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; @@ -12,36 +13,46 @@ * */ public class ReinforcementDestructionEvent extends Event implements Cancellable { - + private static final HandlerList handlers = new HandlerList(); public static HandlerList getHandlerList() { return handlers; } - + private boolean isCancelled; private Reinforcement reinforcement; private float finalDamage; + private Entity source; - public ReinforcementDestructionEvent(Reinforcement reinforcement, float finalDamage) { + public ReinforcementDestructionEvent(Reinforcement reinforcement, float finalDamage, Entity source) { this.finalDamage = finalDamage; this.reinforcement = reinforcement; + this.source = source; } - + + /** + * @return Source of the final damage dealt to the reinforcement. May be a + * player, creeper, fireball etc. or possibly null + */ + public Entity getSource() { + return source; + } + /** * @return Reinforcement destroyed */ public Reinforcement getReinforcement() { return reinforcement; } - + /** * @return How much damage was dealt in the killing blow to the reinforcement */ public float getFinalDamage() { return finalDamage; } - + @Override public HandlerList getHandlers() { return handlers; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 6cb4a794..4333b039 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -37,7 +37,7 @@ public class EntityListener implements Listener { public void breakDoor(EntityBreakDoorEvent ebde) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ebde.getBlock()); if (rein != null) { - ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), ebde.getEntity()); if (!rein.isBroken()) { ebde.setCancelled(true); } @@ -48,7 +48,7 @@ public void breakDoor(EntityBreakDoorEvent ebde) { public void changeBlock(EntityChangeBlockEvent ecbe) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ecbe.getBlock()); if (rein != null) { - ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), ecbe.getEntity()); if (!rein.isBroken()) { ecbe.setCancelled(true); } @@ -66,7 +66,7 @@ public void explode(EntityExplodeEvent eee) { if (rein == null) { continue; } - ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein)); + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), eee.getEntity()); if (!rein.isBroken()) { iterator.remove(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index aa0f8eaf..f4538812 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -79,7 +79,7 @@ public void handleBreakBlock(BlockBreakEvent e) { return; } damage = dre.getDamageDone(); - ReinforcementLogic.damageReinforcement(rein, damage); + ReinforcementLogic.damageReinforcement(rein, damage, e.getPlayer()); } public abstract void handleInteractBlock(PlayerInteractEvent e); From ed77b3edcf303104add0236fe15ceecd5d7d65d3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 26 Oct 2019 20:44:40 +0200 Subject: [PATCH 146/255] Various minor fix of stuff that came up in testing --- .../mc/citadel/ReinforcementLogic.java | 2 + .../citadel/events/ReinforcedBlockBreak.java | 40 +++++++++++++++++++ .../mc/citadel/listener/BlockListener.java | 9 +++-- .../mc/citadel/listener/EntityListener.java | 2 +- .../mc/citadel/model/HologramManager.java | 4 +- .../playerstate/AbstractPlayerState.java | 6 +++ .../citadel/playerstate/InformationState.java | 7 +++- src/main/resources/plugin.yml | 2 +- 8 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/events/ReinforcedBlockBreak.java diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index b41adedf..d540dc13 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -142,6 +142,7 @@ public static Block getResponsibleBlock(Block block) { // block is upper half of a door return block.getRelative(BlockFace.DOWN); } + return block; case BLACK_BED: case BLUE_BED: case BROWN_BED: @@ -162,6 +163,7 @@ public static Block getResponsibleBlock(Block block) { if (bed.getPart() == Bed.Part.HEAD) { return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); } + return block; default: return block; } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcedBlockBreak.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcedBlockBreak.java new file mode 100644 index 00000000..4e41a892 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcedBlockBreak.java @@ -0,0 +1,40 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.block.BlockBreakEvent; + +import vg.civcraft.mc.citadel.model.Reinforcement; + +/** + * Called when a reinforcement is destroyed and the block reinforced is going to drop + * + */ +public class ReinforcedBlockBreak extends ReinforcementEvent { + + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() { + return handlers; + } + + private BlockBreakEvent blockEvent; + + public ReinforcedBlockBreak(Player who, Reinforcement reinforcement, BlockBreakEvent event) { + super(who, reinforcement); + this.blockEvent = event; + } + + /** + * @return The BlockBreakEvent which caused the destrution of the reinforcement + */ + public BlockBreakEvent getWrappedBlockBreakEvent() { + return blockEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 47470484..5b80a9dd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -24,8 +24,8 @@ import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.civmodcore.api.MaterialAPI; import vg.civcraft.mc.civmodcore.api.BlockAPI; +import vg.civcraft.mc.civmodcore.api.MaterialAPI; public class BlockListener implements Listener { @@ -122,7 +122,7 @@ public void interact(PlayerInteractEvent pie) { @EventHandler(priority = EventPriority.LOW) public void liquidDumpEvent(PlayerBucketEmptyEvent event) { Block block = event.getBlockClicked().getRelative(event.getBlockFace()); - if (block.getType().equals(Material.AIR) || block.getType().isSolid()) { + if (block.getType() == Material.AIR || block.getType().isSolid()) { return; } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); @@ -131,9 +131,12 @@ public void liquidDumpEvent(PlayerBucketEmptyEvent event) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onBlockFromToEvent(BlockFromToEvent event) { // prevent water/lava from spilling reinforced blocks away + if (event.getToBlock().getY() < 0) { + return; + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getToBlock()); if (rein != null) { event.setCancelled(true); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 4333b039..bf83f29c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -112,7 +112,7 @@ public void run() { } // prevent creating golems from reinforced blocks - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void spawn(CreatureSpawnEvent cse) { EntityType type = cse.getEntityType(); if (type != EntityType.IRON_GOLEM && type != EntityType.SNOWMAN && type != EntityType.WITHER diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index ea8e1210..0a18ce15 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -131,8 +131,8 @@ boolean update(long cullDelay) { void updateLocation() { Location current = player.getLocation(); // Location.equals would also check pitch/yaw - if (current.getX() == cachedPlayerLocation.getX() && current.getY() == cachedPlayerLocation.getY() - && current.getZ() == cachedPlayerLocation.getZ()) { + if (current.getBlockX() == cachedPlayerLocation.getBlockX() && current.getBlockY() == cachedPlayerLocation.getBlockY() + && current.getBlockZ() == cachedPlayerLocation.getBlockZ()) { return; } Location updated = getHoloLocation(reinforcement, player); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index f4538812..5e146e4f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -15,6 +15,7 @@ import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.events.ReinforcedBlockBreak; import vg.civcraft.mc.citadel.events.ReinforcementBypassEvent; import vg.civcraft.mc.citadel.events.ReinforcementDamageEvent; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -80,6 +81,11 @@ public void handleBreakBlock(BlockBreakEvent e) { } damage = dre.getDamageDone(); ReinforcementLogic.damageReinforcement(rein, damage, e.getPlayer()); + if (rein.getHealth() <= 0) { + e.setCancelled(false); + ReinforcedBlockBreak rbbe = new ReinforcedBlockBreak(e.getPlayer(), rein, e); + Bukkit.getPluginManager().callEvent(rbbe); + } } public abstract void handleInteractBlock(PlayerInteractEvent e); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java index 644548f2..6f49cccf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java @@ -95,6 +95,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { } if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) { Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); + showHolo(rein, player); return; } StringBuilder sb = new StringBuilder(); @@ -121,10 +122,14 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); + showHolo(rein, player); + + } + + private void showHolo(Reinforcement rein, Player player) { HologramManager holoManager = Citadel.getInstance().getHologramManager(); if (holoManager != null) { holoManager.showInfoHolo(rein, player); } - } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2b96f5d2..36674ff5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -126,4 +126,4 @@ commands: permissions: citadel.admin: default: op -api-version: 1.13 \ No newline at end of file +api-version: 1.14 \ No newline at end of file From 5632784d7267b7e0e976c2d8782467e59dc2e7d0 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 26 Oct 2019 21:09:16 +0200 Subject: [PATCH 147/255] Make cti state instead of mode --- .../mc/citadel/command/Information.java | 16 ++- .../InformationModeListener.java} | 99 ++++++++++--------- .../citadel/model/CitadelSettingManager.java | 51 ++++++++-- .../mc/citadel/model/HologramManager.java | 7 +- .../mc/citadel/playerstate/PatchState.java | 5 +- 5 files changed, 103 insertions(+), 75 deletions(-) rename src/main/java/vg/civcraft/mc/citadel/{playerstate/InformationState.java => listener/InformationModeListener.java} (62%) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Information.java b/src/main/java/vg/civcraft/mc/citadel/command/Information.java index 1882de94..84b94b6c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Information.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Information.java @@ -3,15 +3,14 @@ import java.util.ArrayList; import java.util.List; +import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; -import vg.civcraft.mc.citadel.playerstate.InformationState; -import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; @CivCommand(id = "cti") public class Information extends StandaloneCommand { @@ -19,13 +18,10 @@ public class Information extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); - AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); - if (currentState instanceof InformationState) { - stateManager.setState(player, null); - } else { - stateManager.setState(player, new InformationState(player)); - } + BooleanSetting ctiSetting = Citadel.getInstance().getSettingManager().getInformationMode(); + ctiSetting.toggleValue(player.getUniqueId()); + player.sendMessage(ChatColor.GREEN + "Toggled reinforcement information mode " + ChatColor.YELLOW + + (ctiSetting.getValue(player.getUniqueId()) ? "on" : "off")); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java similarity index 62% rename from src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java rename to src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java index 6f49cccf..ed186cf4 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InformationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java @@ -1,4 +1,4 @@ -package vg.civcraft.mc.citadel.playerstate; +package vg.civcraft.mc.citadel.listener; import java.text.DecimalFormat; import java.util.concurrent.TimeUnit; @@ -6,8 +6,10 @@ import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; @@ -19,12 +21,11 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.util.TextUtil; -public class InformationState extends AbstractPlayerState { +public class InformationModeListener implements Listener { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); - - + public static ChatColor getDamageColor(double relativeHealth) { if (relativeHealth >= 1.0) { return ChatColor.GREEN; @@ -66,70 +67,70 @@ public static String formatProgress(long start, long timeNeeded, String text) { TextUtil.formatDuration(timeNeeded - timeTaken, TimeUnit.MILLISECONDS)); } - public InformationState(Player p) { - super(p); - } - - @Override - public String getName() { - return "Information mode"; - } - - @Override - public void handleBlockPlace(BlockPlaceEvent e) { - } - - @Override + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handleInteractBlock(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK && e.getAction() != Action.LEFT_CLICK_BLOCK) { return; } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + Player player = e.getPlayer(); + boolean showChat = Citadel.getInstance().getSettingManager().shouldShowChatInCti(player.getUniqueId()); if (rein == null) { - CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); + if (showChat) { + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); + } return; } - Player player = e.getPlayer(); if (player.getGameMode() == GameMode.CREATIVE) { e.setCancelled(true); } + boolean showHolo = Citadel.getInstance().getSettingManager().shouldShowHologramInCti(player.getUniqueId()); if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) { - Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); - showHolo(rein, player); + if (showChat) { + Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); + } + if (showHolo) { + showHolo(rein, player); + } return; } - StringBuilder sb = new StringBuilder(); - sb.append(String.format("Reinforced at %s%s health with %s%s %son %s%s ", formatHealth(rein), ChatColor.GREEN, - ChatColor.AQUA, rein.getType().getName(), ChatColor.GREEN, ChatColor.LIGHT_PURPLE, - rein.getGroup().getName())); - if (!rein.isMature()) { - sb.append(ChatColor.GOLD); - sb.append(formatProgress(rein.getCreationTime(), rein.getType().getMaturationTime(), "mature")); - sb.append(" "); - } - if (rein.isInsecure()) { - sb.append(ChatColor.AQUA); - sb.append("(Insecure)"); - } - AcidManager acidMan = Citadel.getInstance().getAcidManager(); - if (acidMan.isPossibleAcidBlock(e.getClickedBlock())) { - sb.append(ChatColor.GOLD); - long remainingTime = acidMan.getRemainingAcidMaturationTime(rein); - if (remainingTime == 0) { - sb.append("Acid ready"); - } else { - sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); + if (showChat) { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("Reinforced at %s%s health with %s%s %son %s%s ", formatHealth(rein), + ChatColor.GREEN, ChatColor.AQUA, rein.getType().getName(), ChatColor.GREEN, ChatColor.LIGHT_PURPLE, + rein.getGroup().getName())); + if (!rein.isMature()) { + sb.append(ChatColor.GOLD); + sb.append(formatProgress(rein.getCreationTime(), rein.getType().getMaturationTime(), "mature")); + sb.append(" "); + } + if (rein.isInsecure()) { + sb.append(ChatColor.AQUA); + sb.append("(Insecure)"); + } + AcidManager acidMan = Citadel.getInstance().getAcidManager(); + if (acidMan.isPossibleAcidBlock(e.getClickedBlock())) { + sb.append(ChatColor.GOLD); + long remainingTime = acidMan.getRemainingAcidMaturationTime(rein); + if (remainingTime == 0) { + sb.append("Acid ready"); + } else { + sb.append(formatProgress(rein.getCreationTime(), rein.getType().getAcidTime(), "acid timer")); + } } + CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); } - CitadelUtility.sendAndLog(player, ChatColor.GREEN, sb.toString().trim()); - showHolo(rein, player); - + if (showHolo) { + showHolo(rein, player); + } + } - - private void showHolo(Reinforcement rein, Player player) { + + private static void showHolo(Reinforcement rein, Player player) { HologramManager holoManager = Citadel.getInstance().getHologramManager(); if (holoManager != null) { holoManager.showInfoHolo(rein, player); } } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 8919a3cd..3a381197 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -3,6 +3,7 @@ import java.text.DecimalFormat; import java.util.Map; import java.util.TreeMap; +import java.util.UUID; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -11,7 +12,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; -import vg.civcraft.mc.citadel.playerstate.InformationState; +import vg.civcraft.mc.citadel.listener.InformationModeListener; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; @@ -22,21 +23,37 @@ public class CitadelSettingManager { private BooleanSetting byPass; + private BooleanSetting informationMode; + private BooleanSetting showChatMsgInCti; + private BooleanSetting showHologramInCti; + private CommandReplySetting ctiNotReinforced; - //private CommandReplySetting ctiAllied; + // private CommandReplySetting ctiAllied; private CommandReplySetting ctiEnemy; - //private CommandReplySetting modeSwitch; + // private CommandReplySetting modeSwitch; private DecimalFormatSetting ctiPercentageHealth; private DecimalFormatSetting ctiReinforcementHealth; public CitadelSettingManager() { initSettings(); } - + public BooleanSetting getBypass() { return byPass; } + public BooleanSetting getInformationMode() { + return informationMode; + } + + public boolean shouldShowChatInCti(UUID uuid) { + return showChatMsgInCti.getValue(uuid); + } + + public boolean shouldShowHologramInCti(UUID uuid) { + return showHologramInCti.getValue(uuid); + } + void initSettings() { MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", "Citadel and reinforcement related settings"); @@ -44,6 +61,18 @@ void initSettings() { "Allows you to bypass reinforcements you have permission for and break them in a single break"); PlayerSettingAPI.registerSetting(byPass, menu); + informationMode = new BooleanSetting(Citadel.getInstance(), false, "Information mode", "citadelInformationMode", + "Displays information about reinforced blocks when interacting with them"); + PlayerSettingAPI.registerSetting(informationMode, menu); + + showChatMsgInCti = new BooleanSetting(Citadel.getInstance(), true, "Show chat message in information mode", + "citadelCtiShowChatMsg", "Should chat messages be shown in reinforcement information mode"); + PlayerSettingAPI.registerSetting(showChatMsgInCti, menu); + + showHologramInCti = new BooleanSetting(Citadel.getInstance(), true, "Show holograms in information mode", + "citadelCtiShowHologram", "Should holograms be shown in reinforcement information mode"); + PlayerSettingAPI.registerSetting(showChatMsgInCti, menu); + MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); @@ -72,21 +101,23 @@ void initSettings() { ctiEnemy.registerArgument("max_health", "50", "the maximum health of the reinforcement"); ctiEnemy.registerArgument("health", "25", "the current health of the reinforcement"); ctiEnemy.registerArgument("type", "Stone", "the type of the reinforcement"); - ctiEnemy.registerArgument("health_color", InformationState.getDamageColor(0.5).toString(), + ctiEnemy.registerArgument("health_color", InformationModeListener.getDamageColor(0.5).toString(), "a color representing the reinforcement health"); PlayerSettingAPI.registerSetting(ctiEnemy, commandSection); } - + public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) { Map args = new TreeMap<>(); ReinforcementType type = reinforcement.getType(); - String percFormat = ctiPercentageHealth.getValue(player).format(reinforcement.getHealth() / type.getHealth() * 100); + String percFormat = ctiPercentageHealth.getValue(player) + .format(reinforcement.getHealth() / type.getHealth() * 100); args.put("perc_health", percFormat); DecimalFormat reinHealthFormatter = ctiReinforcementHealth.getValue(player); - args.put("health",reinHealthFormatter.format(reinforcement.getHealth())); - args.put("max_health",reinHealthFormatter.format(type.getHealth())); + args.put("health", reinHealthFormatter.format(reinforcement.getHealth())); + args.put("max_health", reinHealthFormatter.format(type.getHealth())); args.put("type", type.getName()); - args.put("health_color", InformationState.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); + args.put("health_color", + InformationModeListener.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); CitadelUtility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index 0a18ce15..348b8710 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -19,8 +19,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; -import vg.civcraft.mc.citadel.playerstate.InformationState; - +import vg.civcraft.mc.citadel.listener.InformationModeListener; public class HologramManager { // distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for @@ -148,7 +147,7 @@ void updateText() { if (hologram.size() > 0) { hologram.removeLine(0); } - hologram.insertTextLine(0, InformationState.formatHealth(reinforcement)); + hologram.insertTextLine(0, InformationModeListener.formatHealth(reinforcement)); cachedHealth = reinforcement.getHealth(); } if (!hasPermission) { @@ -163,7 +162,7 @@ void updateText() { hologram.removeLine(3); } if (!reinforcement.isMature()) { - hologram.insertTextLine(3, InformationState.formatProgress(reinforcement.getCreationTime(), + hologram.insertTextLine(3, InformationModeListener.formatProgress(reinforcement.getCreationTime(), reinforcement.getType().getMaturationTime(), "")); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index 362188e0..968c5ffb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -10,6 +10,7 @@ import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; +import vg.civcraft.mc.citadel.listener.InformationModeListener; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; @@ -45,12 +46,12 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (rein.getHealth() >= rein.getType().getHealth()) { if (rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.GOLD, - "Reinforcement is already at " + InformationState.formatHealth(rein) + ChatColor.GOLD + "Reinforcement is already at " + InformationModeListener.formatHealth(rein) + ChatColor.GOLD + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + rein.getGroup().getName()); } else { CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " - + InformationState.formatHealth(rein) + ChatColor.GOLD + " health"); + + InformationModeListener.formatHealth(rein) + ChatColor.GOLD + " health"); } return; } From 3f0584560f080e600417103b2cfa6ea25b820253 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 26 Oct 2019 21:42:57 +0200 Subject: [PATCH 148/255] Prevent modifying reinforced logs, grass etc. --- .../mc/citadel/CitadelPermissionHandler.java | 27 ++++--- .../mc/citadel/listener/BlockListener.java | 73 +++++++++++++++++++ .../citadel/model/CitadelSettingManager.java | 2 +- 3 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index 8bda2ec8..a3915507 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -8,7 +8,7 @@ import vg.civcraft.mc.namelayer.permission.PermissionType; public class CitadelPermissionHandler { - + private CitadelPermissionHandler() { } @@ -21,10 +21,11 @@ private CitadelPermissionHandler() { private static PermissionType acidPerm; private static PermissionType infoPerm; private static PermissionType repairPerm; - - + private static PermissionType modifyBlockPerm; + public static void setup() { - List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, PlayerType.OWNER); + List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, + PlayerType.OWNER); List modAndAbove = Arrays.asList(PlayerType.MODS, PlayerType.ADMINS, PlayerType.OWNER); reinforcePerm = PermissionType.registerPermission("REINFORCE", new ArrayList<>(modAndAbove), "Allows reinforcing blocks on this group"); @@ -44,8 +45,14 @@ public static void setup() { "Allows harvesting crops growing on soil reinforced on this group"); insecurePerm = PermissionType.registerPermission("INSECURE_REINFORCEMENT", new ArrayList<>(membersAndAbove), "Allows toggling the insecure flag on reinforcements"); + modifyBlockPerm = PermissionType.registerPermission("MODIFY_BLOCK", new ArrayList<>(modAndAbove), + "Allows modifying reinforced blocks like flipping levers, strippling logs etc."); } + public static PermissionType getModifyBlocks() { + return modifyBlockPerm; + } + public static PermissionType getChests() { return chestPerm; } @@ -57,27 +64,27 @@ public static PermissionType getDoors() { public static PermissionType getBypass() { return bypassPerm; } - + public static PermissionType getReinforce() { return reinforcePerm; } - + public static PermissionType getAcidblock() { return acidPerm; } - + public static PermissionType getCrops() { return cropsPerm; } - + public static PermissionType getInsecure() { return insecurePerm; } - + public static PermissionType getInfo() { return infoPerm; } - + public static PermissionType getRepair() { return repairPerm; } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 5b80a9dd..00ed9ac7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -2,11 +2,13 @@ import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Container; import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Comparator; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -18,6 +20,8 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.world.StructureGrowEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; @@ -26,6 +30,7 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.civmodcore.api.MaterialAPI; +import vg.civcraft.mc.civmodcore.api.ToolAPI; public class BlockListener implements Listener { @@ -210,4 +215,72 @@ public void removeReinforcedAir(BlockPlaceEvent e) { rein.setHealth(-1); } } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void preventStrippingLogs(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + Block block = pie.getClickedBlock(); + if (!MaterialAPI.isLog(block.getType())) { + return; + } + EquipmentSlot hand = pie.getHand(); + if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + return; + } + ItemStack relevant; + Player p = pie.getPlayer(); + if (hand == EquipmentSlot.HAND) { + relevant = p.getInventory().getItemInMainHand(); + } + else { + relevant = p.getInventory().getItemInOffHand(); + } + if (!ToolAPI.isAxe(relevant.getType())) { + return; + } + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null) { + return; + } + if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); + pie.setCancelled(true); + } + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void preventTilingGrass(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + Block block = pie.getClickedBlock(); + if (block.getType() != Material.GRASS_BLOCK) { + return; + } + EquipmentSlot hand = pie.getHand(); + if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + return; + } + ItemStack relevant; + Player p = pie.getPlayer(); + if (hand == EquipmentSlot.HAND) { + relevant = p.getInventory().getItemInMainHand(); + } + else { + relevant = p.getInventory().getItemInOffHand(); + } + if (!ToolAPI.isShovel(relevant.getType())) { + return; + } + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null) { + return; + } + if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); + pie.setCancelled(true); + } + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 3a381197..0c348f81 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -71,7 +71,7 @@ void initSettings() { showHologramInCti = new BooleanSetting(Citadel.getInstance(), true, "Show holograms in information mode", "citadelCtiShowHologram", "Should holograms be shown in reinforcement information mode"); - PlayerSettingAPI.registerSetting(showChatMsgInCti, menu); + PlayerSettingAPI.registerSetting(showHologramInCti, menu); MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); From 2795be73413e71bf5e284bf5556d00b7cb37db12 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 27 Oct 2019 22:05:48 +0100 Subject: [PATCH 149/255] Lots of minor stuff from testing --- .../java/vg/civcraft/mc/citadel/Citadel.java | 4 ++- .../mc/citadel/CitadelConfigManager.java | 11 ++++---- .../mc/citadel/listener/BlockListener.java | 1 - .../listener/InformationModeListener.java | 3 +++ .../citadel/model/CitadelSettingManager.java | 25 ++++++++++++++----- .../mc/citadel/model/HologramManager.java | 14 +++++++---- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index a3576b56..ddf78c22 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -7,6 +7,7 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; +import vg.civcraft.mc.citadel.listener.InformationModeListener; import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; @@ -120,7 +121,7 @@ public void onEnable() { acidManager = new AcidManager(config.getAcidMaterials()); settingManager = new CitadelSettingManager(); if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { - holoManager = new HologramManager(); + holoManager = new HologramManager(settingManager); } CitadelPermissionHandler.setup(); registerListeners(); @@ -133,6 +134,7 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new BlockListener(), this); getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); + getServer().getPluginManager().registerEvents(new InformationModeListener(), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index 5f1ffc2c..0b82ba08 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -63,16 +63,17 @@ private ReinforcementEffect getReinforcementEffect(ConfigurationSection config) Particle effect; try { String effectName = config.getString("type"); - effect = effectName.equals("FLYING_GLYPH") ? Particle.ENCHANTMENT_TABLE : Particle.valueOf(effectName); + effect = Particle.valueOf(effectName); } catch (IllegalArgumentException e) { logger.warning("Invalid effect at: " + config.getCurrentPath()); return null; } - float offsetX = (float) config.getDouble("offsetX", 0); - float offsetY = (float) config.getDouble("offsetY", 0); - float offsetZ = (float) config.getDouble("offsetZ", 0); + float offSet = (float) config.getDouble("offset", 0); + float offsetX = (float) config.getDouble("offsetX", offSet); + float offsetY = (float) config.getDouble("offsetY", offSet); + float offsetZ = (float) config.getDouble("offsetZ", offSet); float speed = (float) config.getDouble("speed", 1); - int amount = config.getInt("particleCount", 1); + int amount = config.getInt("particleCount", 50); return new ReinforcementEffect(effect, offsetX, offsetY, offsetZ, speed, amount); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 00ed9ac7..5b9def8a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -2,7 +2,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Container; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java index ed186cf4..630ae29b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java @@ -72,6 +72,9 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK && e.getAction() != Action.LEFT_CLICK_BLOCK) { return; } + if (!Citadel.getInstance().getSettingManager().getInformationMode().getValue(e.getPlayer())) { + return; + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); Player player = e.getPlayer(); boolean showChat = Citadel.getInstance().getSettingManager().shouldShowChatInCti(player.getUniqueId()); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 0c348f81..75d963e5 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -17,6 +17,7 @@ import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.playersettings.impl.BoundedIntegerSetting; import vg.civcraft.mc.civmodcore.playersettings.impl.CommandReplySetting; import vg.civcraft.mc.civmodcore.playersettings.impl.DecimalFormatSetting; @@ -27,6 +28,8 @@ public class CitadelSettingManager { private BooleanSetting showChatMsgInCti; private BooleanSetting showHologramInCti; + private BoundedIntegerSetting hologramDuration; + private CommandReplySetting ctiNotReinforced; // private CommandReplySetting ctiAllied; private CommandReplySetting ctiEnemy; @@ -41,18 +44,22 @@ public CitadelSettingManager() { public BooleanSetting getBypass() { return byPass; } - + public BooleanSetting getInformationMode() { return informationMode; } - + public boolean shouldShowChatInCti(UUID uuid) { return showChatMsgInCti.getValue(uuid); } - + public boolean shouldShowHologramInCti(UUID uuid) { return showHologramInCti.getValue(uuid); } + + public int getHologramDuration(UUID uuid) { + return hologramDuration.getValue(uuid); + } void initSettings() { MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", @@ -68,11 +75,17 @@ void initSettings() { showChatMsgInCti = new BooleanSetting(Citadel.getInstance(), true, "Show chat message in information mode", "citadelCtiShowChatMsg", "Should chat messages be shown in reinforcement information mode"); PlayerSettingAPI.registerSetting(showChatMsgInCti, menu); - + showHologramInCti = new BooleanSetting(Citadel.getInstance(), true, "Show holograms in information mode", "citadelCtiShowHologram", "Should holograms be shown in reinforcement information mode"); PlayerSettingAPI.registerSetting(showHologramInCti, menu); - + + hologramDuration = new BoundedIntegerSetting(Citadel.getInstance(), 5000, "Hologram visibility duration", + "citadelHologramCullTimer", new ItemStack(Material.CLOCK), + "How long should holograms in information mode remain visible, measured in milli seconds", false, 1000, + 30000); + PlayerSettingAPI.registerSetting(hologramDuration, menu); + MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); @@ -93,7 +106,7 @@ void initSettings() { PlayerSettingAPI.registerSetting(ctiReinforcementHealth, commandSection); ctiEnemy = new CommandReplySetting(Citadel.getInstance(), - ChatColor.RED + "Reinforced at %%health_color%%%%perc_health%% (%%health%%/%%max_health%%)" + ChatColor.RED + "Reinforced at %%health_color%%%%perc_health%%% (%%health%%/%%max_health%%)" + ChatColor.RED + " health with " + ChatColor.AQUA + "%%type%%", "CTI Message Enemy", "citadel_cti_enemy", new ItemStack(Material.RED_TERRACOTTA), "The message received when interacting with enemy reinforcements"); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index 348b8710..3f7a3bad 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -24,14 +24,16 @@ public class HologramManager { // distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for // good measure - private static final double holoOffSet = 0.55 * Math.sqrt(2); + private static final double HOLOOFFSET = 0.55 * Math.sqrt(2); private Map> holograms; private Set activeHolos; + private CitadelSettingManager settingMan; - public HologramManager() { + public HologramManager(CitadelSettingManager settingMan) { this.holograms = new HashMap<>(); this.activeHolos = new HashSet<>(); + this.settingMan = settingMan; new BukkitRunnable() { @Override @@ -67,7 +69,7 @@ private static Location getHoloLocation(Reinforcement rein, Player player) { vector.normalize(); // holoOffSet is a good distance to ensure we fully move the hologram out of the // block - vector.multiply(holoOffSet); + vector.multiply(HOLOOFFSET); baseLoc.add(vector); return baseLoc; } @@ -75,7 +77,7 @@ private static Location getHoloLocation(Reinforcement rein, Player player) { private void updateHolograms() { for (Iterator iter = activeHolos.iterator(); iter.hasNext();) { PlayerHolo holo = iter.next(); - if (!holo.update(5000)) { + if (!holo.update()) { iter.remove(); } } @@ -90,11 +92,13 @@ private class PlayerHolo { private boolean hasPermission; private Location cachedPlayerLocation; private double cachedHealth; + private long cullDelay; public PlayerHolo(Player player, Reinforcement reinforcement) { this.player = player; this.reinforcement = reinforcement; this.timeStamp = System.currentTimeMillis(); + this.cullDelay = settingMan.getHologramDuration(player.getUniqueId()); // we intentionally cache permission to avoid having to look it up often // showing a bit too much information if the player gets kicked while a holo is // already visible does not matter @@ -113,7 +117,7 @@ void show() { updateText(); } - boolean update(long cullDelay) { + boolean update() { if (System.currentTimeMillis() - timeStamp > cullDelay) { delete(); return false; From 74644c2602b921741ad66ce0238b5ad691691709 Mon Sep 17 00:00:00 2001 From: ProgrammerDan Date: Thu, 2 Jan 2020 00:57:33 -0500 Subject: [PATCH 150/255] Formal release to deal with API change without version increase in civmodcore. --- pom.xml | 6 +++--- src/main/resources/plugin.yml | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 551eae6e..05dbb692 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ vg.civcraft.mc.citadel Citadel jar - 4.0.1 + 4.0.2 Citadel https://github.com/Devotedmc/Citadel @@ -50,13 +50,13 @@ vg.civcraft.mc.civmodcore CivModCore - 1.7.5 + 1.7.6 provided vg.civcraft.mc.namelayer NameLayer - 2.13.0 + 2.13.1 provided diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 36674ff5..674d1427 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,6 +4,12 @@ version: ${project.version} authors: - Rourke750 - Maxopoly +- ProgrammerDan +- okx-code +- Cranite +- FeatherCrown +- Lazersmoke +- TealNerd depend: - NameLayer - CivModCore @@ -126,4 +132,4 @@ commands: permissions: citadel.admin: default: op -api-version: 1.14 \ No newline at end of file +api-version: 1.14 From e8fee7687ff4b136064cc01e676d797ce4bcc026 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 14 Jan 2020 02:39:15 +0100 Subject: [PATCH 151/255] Fully fix redstone activation of doors --- .../mc/citadel/listener/RedstoneListener.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index b3724efc..e117a11f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -13,6 +13,7 @@ import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Door; @@ -45,9 +46,9 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl // distance is radius, not diameter double diameter = distance * 2; - Collection entities = reinLocation.getWorld().getNearbyEntities(reinLocation, diameter, diameter, diameter, - e -> e instanceof Player - && !e.isDead() + Collection entities = reinLocation.getWorld().getNearbyEntities(reinLocation, diameter, diameter, + diameter, + e -> e instanceof Player && !e.isDead() && reinforcement.hasPermission(e.getUniqueId(), CitadelPermissionHandler.getDoors()) && e.getLocation().distanceSquared(reinLocation) <= diameter * diameter); return !entities.isEmpty(); @@ -60,12 +61,10 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl public RedstoneListener(double maxRedstoneDistance) { this.maxRedstoneDistance = maxRedstoneDistance; this.authorizations = new HashMap<>(); - Bukkit.getScheduler().scheduleSyncRepeatingTask(Citadel.getInstance(), () -> { - authorizations.clear(); - }, 1, 1); + Bukkit.getScheduler().scheduleSyncRepeatingTask(Citadel.getInstance(), () -> authorizations.clear(), 1, 1); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void pistonExtend(BlockPistonExtendEvent bpee) { for (Block block : bpee.getBlocks()) { Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); @@ -76,7 +75,7 @@ public void pistonExtend(BlockPistonExtendEvent bpee) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void pistonRetract(BlockPistonRetractEvent bpre) { for (Block block : bpre.getBlocks()) { Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(block); @@ -87,7 +86,7 @@ public void pistonRetract(BlockPistonRetractEvent bpre) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void pressButton(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { return; @@ -99,12 +98,12 @@ public void pressButton(PlayerInteractEvent e) { Block buttonBlock = e.getClickedBlock(); Block attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); // prepare all sides of button itself - setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getFacing()); + setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getFacing().getOppositeFace()); // prepare all sides of the block attached to - setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getFacing().getOppositeFace()); + setupAdjacentDoors(e.getPlayer(), attachedBlock, button.getFacing()); } - @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void redstonePower(BlockRedstoneEvent bre) { // prevent doors from being opened by redstone if (bre.getNewCurrent() <= 0 || bre.getOldCurrent() > 0) { @@ -119,6 +118,13 @@ public void redstonePower(BlockRedstoneEvent bre) { if (openable.isOpen()) { return; } + if (blockData instanceof Door) { + //we always store the activation for the lower half of a door + Door door = (Door) blockData; + if (door.getHalf() == Bisected.Half.TOP) { + block = block.getRelative(BlockFace.DOWN); + } + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); if (rein == null) { return; @@ -153,10 +159,12 @@ private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { } Location locationToSave; if (blockData instanceof Door) { - if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + Door door = (Door) blockData; + if (door.getHalf() == Bisected.Half.TOP) { // block is upper half of a door locationToSave = rel.getRelative(BlockFace.DOWN).getLocation(); - } else { + } + else { // already the lower half of the door locationToSave = rel.getLocation(); } @@ -168,16 +176,14 @@ private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void stepPressurePlate(PlayerInteractEvent e) { if (e.getAction() != Action.PHYSICAL) { return; } Material mat = e.getClickedBlock().getType(); - if (mat != Material.STONE_PRESSURE_PLATE - && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE - && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE - && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { + if (mat != Material.STONE_PRESSURE_PLATE && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE + && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); From 06498815b95a61b8a9fdb7abf7f73e52ed186309 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 14 Jan 2020 23:53:59 +0100 Subject: [PATCH 152/255] Show proper message when not switching mode --- .../mc/citadel/playerstate/AbstractPlayerState.java | 3 +++ .../playerstate/AdvancedFortificationState.java | 6 ++++++ .../mc/citadel/playerstate/FortificationState.java | 9 +++++++++ .../mc/citadel/playerstate/InsecureState.java | 5 +++++ .../civcraft/mc/citadel/playerstate/NormalState.java | 5 +++++ .../civcraft/mc/citadel/playerstate/PatchState.java | 6 ++++++ .../mc/citadel/playerstate/PlayerStateManager.java | 11 +++++++++-- .../mc/citadel/playerstate/ReinforcingState.java | 8 ++++++++ 8 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 5e146e4f..5e60556a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -96,5 +96,8 @@ protected static void giveReinforcement(Location location, Player p, Reinforceme CitadelUtility.dropItemAtLocation(location, type.getItem().clone()); } } + + @Override + public abstract boolean equals(Object o); } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index eda8bc55..720ad2ac 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -87,4 +87,10 @@ private class ReinforcingSetup { } + @Override + public boolean equals(Object o) { + //just always make a new state for this one + return false; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 95ebeedd..efd3baf6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -47,4 +47,13 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { } + + @Override + public boolean equals(Object o) { + if (!(o instanceof FortificationState)) { + return false; + } + FortificationState fort = (FortificationState) o; + return fort.type == this.type && fort.group.getName().equals(this.getGroup().getName()); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index 37f64399..5462ef71 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -46,4 +46,9 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } + @Override + public boolean equals(Object o) { + return o instanceof InsecureState; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index bbc31148..4ad8c046 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -27,4 +27,9 @@ public void handleInteractBlock(PlayerInteractEvent e) { } + @Override + public boolean equals(Object o) { + return o instanceof NormalState; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index 968c5ffb..7ecdebd2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -9,6 +9,7 @@ import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.command.PatchMode; import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; import vg.civcraft.mc.citadel.listener.InformationModeListener; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -75,4 +76,9 @@ public void handleInteractBlock(PlayerInteractEvent e) { rein.resetCreationTime(); } + @Override + public boolean equals(Object o) { + return o instanceof PatchMode; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index 4f95c461..531ea4ef 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -34,13 +34,20 @@ public void setState(Player player, AbstractPlayerState state) { throw new IllegalArgumentException("Can not set state for null player"); } AbstractPlayerState existingState = getState(player); + if (existingState == null) { + existingState = new NormalState(player); + } // null state is allowed, it just resets the state if (state == null) { state = new NormalState(player); } + if (existingState.equals(state)) { + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "You are still in " + ChatColor.YELLOW + state.getName()); + return; + } playerStateMap.put(player.getUniqueId(), state); - CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() - + ChatColor.GOLD + " from " + ChatColor.YELLOW + existingState.getName()); + CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + + state.getName() + ChatColor.GOLD + " from " + ChatColor.YELLOW + existingState.getName()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index aae18939..26dbb74e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -143,4 +143,12 @@ public void handleInteractBlock(PlayerInteractEvent e) { } } } + + @Override + public boolean equals(Object o) { + if (!(o instanceof ReinforcingState)) { + return false; + } + return ((ReinforcingState) o).group.getName().equals(this.getGroup().getName()); + } } From 3bcab7cd201369650831d533c34ae7c3e18b7ad1 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 15 Jan 2020 00:08:10 +0100 Subject: [PATCH 153/255] Readd easy mode --- .../civcraft/mc/citadel/command/EasyMode.java | 38 +++++++++++++++++++ .../citadel/model/CitadelSettingManager.java | 13 +++++++ .../mc/citadel/playerstate/NormalState.java | 25 +++++++++++- 3 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java diff --git a/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java b/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java new file mode 100644 index 00000000..b2f5402c --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java @@ -0,0 +1,38 @@ +package vg.civcraft.mc.citadel.command; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; +import vg.civcraft.mc.civmodcore.command.CivCommand; +import vg.civcraft.mc.civmodcore.command.StandaloneCommand; +import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; + +@CivCommand(id = "cte") +public class EasyMode extends StandaloneCommand { + + @Override + public boolean execute(CommandSender sender, String[] args) { + Player player = (Player) sender; + BooleanSetting setting = Citadel.getInstance().getSettingManager().getEasyMode(); + boolean enabled = setting.getValue(player); + if (enabled) { + CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Easy reinforcing mode has been disabled."); + } else { + CitadelUtility.sendAndLog(player, ChatColor.GREEN, + "Easy reinforcing mode has been enabled. You will be able to reinforce to your default groups by placing blocks while having a reinforcement material in your off hand."); + } + setting.toggleValue(player.getUniqueId()); + return true; + } + + @Override + public List tabComplete(CommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 75d963e5..8a18523f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -27,6 +27,7 @@ public class CitadelSettingManager { private BooleanSetting informationMode; private BooleanSetting showChatMsgInCti; private BooleanSetting showHologramInCti; + private BooleanSetting easyMode; private BoundedIntegerSetting hologramDuration; @@ -48,6 +49,10 @@ public BooleanSetting getBypass() { public BooleanSetting getInformationMode() { return informationMode; } + + public BooleanSetting getEasyMode() { + return easyMode; + } public boolean shouldShowChatInCti(UUID uuid) { return showChatMsgInCti.getValue(uuid); @@ -57,6 +62,10 @@ public boolean shouldShowHologramInCti(UUID uuid) { return showHologramInCti.getValue(uuid); } + public boolean isInEasyMode(UUID uuid) { + return easyMode.getValue(uuid); + } + public int getHologramDuration(UUID uuid) { return hologramDuration.getValue(uuid); } @@ -71,6 +80,10 @@ void initSettings() { informationMode = new BooleanSetting(Citadel.getInstance(), false, "Information mode", "citadelInformationMode", "Displays information about reinforced blocks when interacting with them"); PlayerSettingAPI.registerSetting(informationMode, menu); + + easyMode = new BooleanSetting(Citadel.getInstance(), false, "Easy reinforcing mode", "citadelEasyMode", + "Allows automatically reinforcing to your default group with reinforcement materials from your off hand"); + PlayerSettingAPI.registerSetting(easyMode, menu); showChatMsgInCti = new BooleanSetting(Citadel.getInstance(), true, "Show chat message in information mode", "citadelCtiShowChatMsg", "Should chat messages be shown in reinforcement information mode"); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 4ad8c046..2d387250 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -3,6 +3,14 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelUtility; +import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; +import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.group.Group; public class NormalState extends AbstractPlayerState { @@ -18,8 +26,21 @@ public String getName() { @Override public void handleBlockPlace(BlockPlaceEvent e) { - // TODO Auto-generated method stub - + Player player = e.getPlayer(); + if (!Citadel.getInstance().getSettingManager().isInEasyMode(player.getUniqueId())) { + return; + } + ItemStack offHand = player.getInventory().getItemInOffHand(); + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(offHand); + if (type == null) { + return; + } + String defaultGroupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); + Group defaultGroup = GroupManager.getGroup(defaultGroupName); + if (defaultGroup == null) { + return; + } + CitadelUtility.attemptReinforcementCreation(e.getBlock(), type, defaultGroup, player); } @Override From a5c219f92d82334a14fb9016723d51bce49be720 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 18 Jan 2020 00:00:27 +0100 Subject: [PATCH 154/255] Properly adjust reinforcement health on ctr --- src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java | 2 +- .../vg/civcraft/mc/citadel/playerstate/ReinforcingState.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java b/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java index b2f5402c..ef45fc1c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java @@ -25,7 +25,7 @@ public boolean execute(CommandSender sender, String[] args) { CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Easy reinforcing mode has been disabled."); } else { CitadelUtility.sendAndLog(player, ChatColor.GREEN, - "Easy reinforcing mode has been enabled. You will be able to reinforce to your default groups by placing blocks while having a reinforcement material in your off hand."); + "Easy reinforcing mode has been enabled. You will be able to reinforce to your default group by placing blocks while having a reinforcement material in your off hand."); } setting.toggleValue(player.getUniqueId()); return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 26dbb74e..d90b4eee 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -128,8 +128,11 @@ public void handleInteractBlock(PlayerInteractEvent e) { ReinforcementChangeTypeEvent rcte = new ReinforcementChangeTypeEvent(player, rein, type); Bukkit.getPluginManager().callEvent(rcte); if (!rcte.isCancelled()) { - giveReinforcement(rein.getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); + if (rein.rollForItemReturn()) { + giveReinforcement(rein.getLocation().clone().add(0.5, 0.5, 0.5), e.getPlayer(), rein.getType()); + } rein.setType(type); + rein.setHealth(type.getHealth()); rein.resetCreationTime(); CitadelUtility.sendAndLog(player, ChatColor.GREEN, "Updated reinforcement to " + rein.getType().getName() + " on " + group.getName()); From 50290b498c4de961f90163a27bef000e9200de82 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 18 Jan 2020 00:38:05 +0100 Subject: [PATCH 155/255] Prevent double interacts --- pom.xml | 2 +- src/main/java/vg/civcraft/mc/citadel/Citadel.java | 4 ++-- .../mc/citadel/listener/BlockListener.java | 15 ++++++++++++++- .../citadel/listener/InformationModeListener.java | 14 +++++++++++++- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 05dbb692..5e602888 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.7.6 + 1.7.7 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index ddf78c22..eb265201 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -131,10 +131,10 @@ public void onEnable() { * Registers the listeners for Citadel. */ private void registerListeners() { - getServer().getPluginManager().registerEvents(new BlockListener(), this); + getServer().getPluginManager().registerEvents(new BlockListener(this), this); getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); - getServer().getPluginManager().registerEvents(new InformationModeListener(), this); + getServer().getPluginManager().registerEvents(new InformationModeListener(this), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 5b9def8a..c8c90a5c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -11,6 +11,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockFromToEvent; @@ -30,10 +31,17 @@ import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.civmodcore.api.MaterialAPI; import vg.civcraft.mc.civmodcore.api.ToolAPI; +import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; public class BlockListener implements Listener { private static final Material matfire = Material.FIRE; + + private DoubleInteractFixer interactFixer; + + public BlockListener(Citadel plugin) { + this.interactFixer = new DoubleInteractFixer(plugin); + } @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void blockBreakEvent(BlockBreakEvent event) { @@ -116,7 +124,12 @@ public void comparatorPlaceCheck(BlockPlaceEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void interact(PlayerInteractEvent pie) { - if (!pie.hasBlock()) { + if (pie.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (interactFixer.checkInteracted(pie.getPlayer(), pie.getClickedBlock())) { + return; + } + } + else if (pie.getAction() != Action.LEFT_CLICK_BLOCK) { return; } Citadel.getInstance().getStateManager().getState(pie.getPlayer()).handleInteractBlock(pie); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java index 630ae29b..64d43a4a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java @@ -19,12 +19,19 @@ import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; import vg.civcraft.mc.civmodcore.util.TextUtil; public class InformationModeListener implements Listener { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); + + private DoubleInteractFixer interactFixer; + + public InformationModeListener(Citadel citadel) { + interactFixer = new DoubleInteractFixer(citadel); + } public static ChatColor getDamageColor(double relativeHealth) { if (relativeHealth >= 1.0) { @@ -69,7 +76,12 @@ public static String formatProgress(long start, long timeNeeded, String text) { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void handleInteractBlock(PlayerInteractEvent e) { - if (e.getAction() != Action.RIGHT_CLICK_BLOCK && e.getAction() != Action.LEFT_CLICK_BLOCK) { + if (e.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (interactFixer.checkInteracted(e.getPlayer(), e.getClickedBlock())) { + return; + } + } + else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { return; } if (!Citadel.getInstance().getSettingManager().getInformationMode().getValue(e.getPlayer())) { From a19967ec43e7777198a9680ec9e47d1ffbd2b3f0 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 24 Mar 2020 04:06:16 +0100 Subject: [PATCH 156/255] Implement migration of old data --- pom.xml | 2 +- .../mc/citadel/CitadelConfigManager.java | 3 +- .../mc/citadel/model/CitadelStorage.java | 146 ++++++++++++++++-- .../reinforcementtypes/ReinforcementType.java | 13 +- 4 files changed, 149 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 5e602888..c15115f9 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.7.7 + 1.7.8 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index 0b82ba08..e7d16455 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -164,6 +164,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { long decayTimer = ConfigParsing .parseTime(config.getString("decay_timer", String.valueOf(globalDecayTimer / 1000L) + "s")); double decayMultiplier = config.getDouble("decay_multiplier", globalDecayMultiplier); + int legacyId = config.getInt("legacy_id", -1); if (name == null) { logger.warning("No name specified for reinforcement type at " + config.getCurrentPath()); name = item.getType().name(); @@ -183,7 +184,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + gracePeriod + ", id: " + id); return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, creationEffect, damageEffect, destructionEffect, reinforceables, nonReinforceables, id, name, - globalBlackList, decayTimer, decayMultiplier); + globalBlackList, decayTimer, decayMultiplier, legacyId); } private void parseReinforcementTypes(ConfigurationSection config) { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java index 4777eff0..8e2c5804 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -1,22 +1,47 @@ package vg.civcraft.mc.citadel.model; +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Array; +import java.sql.Blob; +import java.sql.Clob; import java.sql.Connection; +import java.sql.Date; +import java.sql.NClob; +import java.sql.ParameterMetaData; import java.sql.PreparedStatement; +import java.sql.Ref; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.RowId; import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Time; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.Callable; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.inventory.meta.ItemMeta; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; +import vg.civcraft.mc.civmodcore.CivModCorePlugin; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkCoord; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.GlobalChunkMetaManager; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.BlockBasedChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; @@ -29,12 +54,109 @@ public CitadelStorage(Logger logger, ManagedDatasource db) { @Override public void registerMigrations() { - db.registerMigration(15, false, - "create table ctdl_reinforcements (chunk_x int not null, chunk_z int not null, world_id smallint unsigned not null, " - + "x_offset tinyint unsigned not null, y tinyint unsigned not null, z_offset tinyint unsigned not null, " - + "type_id smallint unsigned not null, health float not null, group_id int not null, insecure boolean not null default false," - + "creation_time timestamp not null default now(), index reinChunkLookUp(chunk_x, chunk_z, world_id), primary key " - + "(chunk_x, chunk_z, world_id, x_offset, y ,z_offset))"); + db.registerMigration(15, false, new Callable() { + + @Override + public Boolean call() throws Exception { + try (Connection insertConn = db.getConnection(); + PreparedStatement selectRein = insertConn.prepareStatement( + "select x,y,z,chunk_x,chunk_z,world,material_id,durability,insecure,group_id,maturation_time,lore from reinforcement order by rein_id asc"); + ResultSet rs = selectRein.executeQuery()) { + PreparedStatement insertRein = insertConn.prepareStatement( + "insert into ctdl_reinforcements (chunk_x, chunk_z, world_id, x_offset, y, z_offset, type_id, " + + "health, group_id, insecure, creation_time) values(?,?,?, ?,?,?, ?,?,?,?,?);"); + try (PreparedStatement deleteExisting = insertConn + .prepareStatement("delete from ctdl_reinforcements")) { + // in case this migration failed before some of the data might already have + // migrated, which we want to undo + deleteExisting.execute(); + } + + GlobalChunkMetaManager worldMan = CivModCorePlugin.getInstance().getChunkMetaManager(); + Map> reinTypes = new TreeMap<>(); + for (ReinforcementType type : Citadel.getInstance().getReinforcementTypeManager().getAllTypes()) { + List withType = reinTypes.computeIfAbsent(type.getLegacyId(), + s -> new ArrayList<>()); + withType.add(type); + } + int batchCounter = 0; + while (rs.next()) { + byte x = (byte) ((rs.getInt(1) % 16) + 16); + byte y = (byte) rs.getInt(2); + byte z = (byte) ((rs.getInt(3) % 16) + 16); + int chunkX = rs.getInt(4); + int chunkZ = rs.getInt(5); + String worldName = rs.getString(6); + int materialId = rs.getInt(7); + String durability = rs.getString(8); + boolean insecure = rs.getBoolean(9); + int groupId = rs.getInt(10); + int maturationTime = rs.getInt(11); + String lore = rs.getString(12); + + short worldID = worldMan.getInternalWorldIdByName(worldName); + if (worldID == -1) { + logger.severe("Failed to find world id for world with name " + worldName); + return false; + } + float healthFloat = Float.parseFloat(durability); + List withType = reinTypes.get(materialId); + if (withType == null) { + logger.severe("Failed to find material mapping for reinforcement with material id " + materialId); + return false; + } + ReinforcementType type = null; + if (withType.size() == 1) { + type = withType.get(0); + } + else { + boolean hasLore = lore != null; + for(ReinforcementType compType : withType) { + ItemMeta meta = compType.getItem().getItemMeta(); + if (hasLore == meta.hasLore()) { + if (!hasLore || meta.getLore().get(0).equals(lore)) { + type = compType; + break; + } + } + } + if (type == null) { + logger.severe("Failed to find material mapping for reinforcement with material id " + materialId + " and lore " + lore); + return false; + } + } + //previously we stored the timestamp at which the reinforcement will be mature in minutes since unix epoch + //No, I do not know why + long creationTime = maturationTime - (type.getMaturationTime()/60_000); + creationTime *= 60_000; + + + insertRein.setInt(1, chunkX); + insertRein.setInt(2, chunkZ); + insertRein.setShort(3, worldID); + insertRein.setByte(4, x); + insertRein.setByte(5, y); + insertRein.setByte(6, z); + insertRein.setShort(7, type.getID()); + insertRein.setFloat(8, healthFloat); + insertRein.setInt(9, groupId); + insertRein.setBoolean(10, insecure); + insertRein.setTimestamp(11, new Timestamp(creationTime)); + insertRein.addBatch(); + if (batchCounter > 100) { + insertRein.executeBatch(); + } + batchCounter++; + } + insertRein.executeBatch(); + } + return true; + } + }, "create table ctdl_reinforcements if not exists (chunk_x int not null, chunk_z int not null, world_id smallint unsigned not null, " + + "x_offset tinyint unsigned not null, y tinyint unsigned not null, z_offset tinyint unsigned not null, " + + "type_id smallint unsigned not null, health float not null, group_id int not null, insecure boolean not null default false," + + "creation_time timestamp not null default now(), index reinChunkLookUp(chunk_x, chunk_z, world_id), primary key " + + "(chunk_x, chunk_z, world_id, x_offset, y ,z_offset))"); } @Override @@ -45,7 +167,7 @@ public void insert(Reinforcement data, ChunkCoord coord) { + "health, group_id, insecure, creation_time) values(?,?,?, ?,?,?, ?,?,?,?,?);");) { insertRein.setInt(1, coord.getX()); insertRein.setInt(2, coord.getZ()); - insertRein.setShort(3, (short) coord.getWorldID()); + insertRein.setShort(3, coord.getWorldID()); insertRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); insertRein.setByte(5, (byte) data.getLocation().getBlockY()); insertRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); @@ -73,10 +195,10 @@ public void update(Reinforcement data, ChunkCoord coord) { updateRein.setTimestamp(5, new Timestamp(data.getCreationTime())); updateRein.setInt(6, coord.getX()); updateRein.setInt(7, coord.getZ()); - updateRein.setShort(8, (short) coord.getWorldID()); + updateRein.setShort(8, coord.getWorldID()); updateRein.setByte(9, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); updateRein.setByte(10, (byte) data.getLocation().getBlockY()); - updateRein.setByte(11,(byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + updateRein.setByte(11, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); updateRein.execute(); } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to update reinforcement in db: ", e); @@ -88,10 +210,10 @@ public void delete(Reinforcement data, ChunkCoord coord) { try (Connection insertConn = db.getConnection(); PreparedStatement deleteRein = insertConn.prepareStatement( "delete from ctdl_reinforcements where chunk_x = ? and chunk_z = ? and world_id = ? and " - + "x_offset = ? and y = ? and z_offset = ?;");) { + + "x_offset = ? and y = ? and z_offset = ?;");) { deleteRein.setInt(1, coord.getX()); deleteRein.setInt(2, coord.getZ()); - deleteRein.setShort(3, (short) coord.getWorldID()); + deleteRein.setShort(3, coord.getWorldID()); deleteRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); deleteRein.setByte(5, (byte) data.getLocation().getBlockY()); deleteRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); @@ -113,7 +235,7 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer allowsReinforceables, Collection disallowedReinforceables, short id, String name, Collection globalBlackList, - long decayTimer, double decayMultiplier) { + long decayTimer, double decayMultiplier, int legacyId) { this.health = health; this.name = name; this.returnChance = returnChance; @@ -58,6 +59,7 @@ public ReinforcementType(float health, double returnChance, ItemStack item, long this.id = id; this.decayMultiplier = decayMultiplier; this.decayTimer = decayTimer; + this.legacyId = legacyId; } public boolean canBeReinforced(Material mat) { @@ -162,6 +164,15 @@ public double getReturnChance() { return returnChance; } + /** + * Material id the material used for the reinforcement had pre-flattening (<= 1.12.2). Needed once for + * proper migration of reinforcements to higher versions + * @return Old item id of the reinforcement item + */ + public int getLegacyId() { + return legacyId; + } + public double getDecayDamageMultipler(long since) { if (decayTimer <= 0 || decayMultiplier == 1) { return 1; From a8d222a3ff96637a2f3b2cf344dab160d1d4b48e Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 24 Mar 2020 04:13:24 +0100 Subject: [PATCH 157/255] Fix imports --- .../mc/citadel/model/CitadelStorage.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java index 8e2c5804..8b2fd54a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -1,28 +1,11 @@ package vg.civcraft.mc.citadel.model; -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.sql.Array; -import java.sql.Blob; -import java.sql.Clob; import java.sql.Connection; -import java.sql.Date; -import java.sql.NClob; -import java.sql.ParameterMetaData; import java.sql.PreparedStatement; -import java.sql.Ref; import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.RowId; import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Calendar; import java.util.List; import java.util.Map; import java.util.TreeMap; From 3063bafbf231187942356e35eafca5e3b1bc02d1 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 24 Mar 2020 18:38:08 +0100 Subject: [PATCH 158/255] Reset batch counter in migration --- src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java index 8b2fd54a..ae8e0dd6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java @@ -127,6 +127,7 @@ public Boolean call() throws Exception { insertRein.setTimestamp(11, new Timestamp(creationTime)); insertRein.addBatch(); if (batchCounter > 100) { + batchCounter = 0; insertRein.executeBatch(); } batchCounter++; From ba8328ca5d51d08d9e8562a2348b03e0963d5de1 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 26 Mar 2020 05:58:05 +0100 Subject: [PATCH 159/255] Latest --- .../java/vg/civcraft/mc/citadel/Citadel.java | 6 +-- .../mc/citadel/model/CitadelChunkData.java | 2 +- .../{CitadelStorage.java => CitadelDAO.java} | 53 +++++++++++-------- 3 files changed, 35 insertions(+), 26 deletions(-) rename src/main/java/vg/civcraft/mc/citadel/model/{CitadelStorage.java => CitadelDAO.java} (83%) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index eb265201..26577cbc 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -13,7 +13,7 @@ import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.CitadelChunkData; import vg.civcraft.mc.citadel.model.CitadelSettingManager; -import vg.civcraft.mc.citadel.model.CitadelStorage; +import vg.civcraft.mc.citadel.model.CitadelDAO; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; @@ -103,14 +103,14 @@ public void onEnable() { } typeManager = new ReinforcementTypeManager(); config.getReinforcementTypes().forEach(t -> typeManager.register(t)); - CitadelStorage storage = new CitadelStorage(this.logger, config.getDatabase()); + CitadelDAO storage = new CitadelDAO(this.logger, config.getDatabase()); if (!storage.updateDatabase()) { logger.severe("Errors setting up database, shutting down"); Bukkit.shutdown(); return; } BlockBasedChunkMetaView> chunkMetaData = - ChunkMetaAPI.registerBlockBasedPlugin(this, () -> {return new CitadelChunkData(false, storage);}); + ChunkMetaAPI.registerBlockBasedPlugin(this, () -> new CitadelChunkData(false, storage)); if (chunkMetaData == null) { logger.severe("Errors setting up chunk metadata API, shutting down"); Bukkit.shutdown(); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java index a26ba689..d812c729 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java @@ -4,7 +4,7 @@ public class CitadelChunkData extends TableBasedBlockChunkMeta { - public CitadelChunkData(boolean isNew, CitadelStorage storage) { + public CitadelChunkData(boolean isNew, CitadelDAO storage) { super(isNew, storage); } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java similarity index 83% rename from src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java rename to src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java index ae8e0dd6..0fba6ffc 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelStorage.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java @@ -29,15 +29,21 @@ import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; -public class CitadelStorage extends TableStorageEngine { +public class CitadelDAO extends TableStorageEngine { - public CitadelStorage(Logger logger, ManagedDatasource db) { + public CitadelDAO(Logger logger, ManagedDatasource db) { super(logger, db); } @Override public void registerMigrations() { - db.registerMigration(15, false, new Callable() { + db.registerMigration(15, false, + "CREATE TABLE IF NOT EXISTS reinforcement (rein_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY," + + "x int(11) NOT NULL, y int(11) NOT NULL, z int(11) NOT NULL, chunk_x int(11) NOT NULL, chunk_z int(11) NOT NULL," + + "world varchar(255) NOT NULL, material_id int(11) NOT NULL, durability varchar(10) NOT NULL, insecure tinyint(1) NOT NULL," + + "group_id int(11) NOT NULL, maturation_time int(11) NOT NULL, rein_type_id int(11) NOT NULL, lore varchar(255) DEFAULT NULL," + + "acid_time int(11) NOT NULL)"); + db.registerMigration(16, false, new Callable() { @Override public Boolean call() throws Exception { @@ -64,9 +70,9 @@ public Boolean call() throws Exception { } int batchCounter = 0; while (rs.next()) { - byte x = (byte) ((rs.getInt(1) % 16) + 16); - byte y = (byte) rs.getInt(2); - byte z = (byte) ((rs.getInt(3) % 16) + 16); + byte x = (byte) BlockBasedChunkMeta.modulo(rs.getInt(1), 16); + short y = (short) rs.getInt(2); + byte z = (byte) BlockBasedChunkMeta.modulo(rs.getInt(3), 16); int chunkX = rs.getInt(4); int chunkZ = rs.getInt(5); String worldName = rs.getString(6); @@ -85,16 +91,16 @@ public Boolean call() throws Exception { float healthFloat = Float.parseFloat(durability); List withType = reinTypes.get(materialId); if (withType == null) { - logger.severe("Failed to find material mapping for reinforcement with material id " + materialId); + logger.severe( + "Failed to find material mapping for reinforcement with material id " + materialId); return false; } ReinforcementType type = null; if (withType.size() == 1) { type = withType.get(0); - } - else { + } else { boolean hasLore = lore != null; - for(ReinforcementType compType : withType) { + for (ReinforcementType compType : withType) { ItemMeta meta = compType.getItem().getItemMeta(); if (hasLore == meta.hasLore()) { if (!hasLore || meta.getLore().get(0).equals(lore)) { @@ -104,21 +110,24 @@ public Boolean call() throws Exception { } } if (type == null) { - logger.severe("Failed to find material mapping for reinforcement with material id " + materialId + " and lore " + lore); + logger.severe("Failed to find material mapping for reinforcement with material id " + + materialId + " and lore " + lore); return false; } } - //previously we stored the timestamp at which the reinforcement will be mature in minutes since unix epoch - //No, I do not know why - long creationTime = maturationTime - (type.getMaturationTime()/60_000); + // previously we stored the timestamp at which the reinforcement will be mature + // in minutes since unix epoch + // No, I do not know why + long creationTime = maturationTime - (type.getMaturationTime() / 60_000); + //some rows have a maturation time of 0, no idea why + creationTime = Math.max(creationTime, 1); creationTime *= 60_000; - insertRein.setInt(1, chunkX); insertRein.setInt(2, chunkZ); insertRein.setShort(3, worldID); insertRein.setByte(4, x); - insertRein.setByte(5, y); + insertRein.setShort(5, y); insertRein.setByte(6, z); insertRein.setShort(7, type.getID()); insertRein.setFloat(8, healthFloat); @@ -136,8 +145,8 @@ public Boolean call() throws Exception { } return true; } - }, "create table ctdl_reinforcements if not exists (chunk_x int not null, chunk_z int not null, world_id smallint unsigned not null, " - + "x_offset tinyint unsigned not null, y tinyint unsigned not null, z_offset tinyint unsigned not null, " + }, "create table if not exists ctdl_reinforcements (chunk_x int not null, chunk_z int not null, world_id smallint unsigned not null, " + + "x_offset tinyint unsigned not null, y smallint not null, z_offset tinyint unsigned not null, " + "type_id smallint unsigned not null, health float not null, group_id int not null, insecure boolean not null default false," + "creation_time timestamp not null default now(), index reinChunkLookUp(chunk_x, chunk_z, world_id), primary key " + "(chunk_x, chunk_z, world_id, x_offset, y ,z_offset))"); @@ -153,7 +162,7 @@ public void insert(Reinforcement data, ChunkCoord coord) { insertRein.setInt(2, coord.getZ()); insertRein.setShort(3, coord.getWorldID()); insertRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); - insertRein.setByte(5, (byte) data.getLocation().getBlockY()); + insertRein.setShort(5, (short) data.getLocation().getBlockY()); insertRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); insertRein.setShort(7, data.getType().getID()); insertRein.setFloat(8, data.getHealth()); @@ -181,7 +190,7 @@ public void update(Reinforcement data, ChunkCoord coord) { updateRein.setInt(7, coord.getZ()); updateRein.setShort(8, coord.getWorldID()); updateRein.setByte(9, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); - updateRein.setByte(10, (byte) data.getLocation().getBlockY()); + updateRein.setShort(10, (short) data.getLocation().getBlockY()); updateRein.setByte(11, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); updateRein.execute(); } catch (SQLException e) { @@ -199,7 +208,7 @@ public void delete(Reinforcement data, ChunkCoord coord) { deleteRein.setInt(2, coord.getZ()); deleteRein.setShort(3, coord.getWorldID()); deleteRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); - deleteRein.setByte(5, (byte) data.getLocation().getBlockY()); + deleteRein.setShort(5, (short) data.getLocation().getBlockY()); deleteRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); deleteRein.execute(); } catch (SQLException e) { @@ -224,7 +233,7 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer Date: Sat, 28 Mar 2020 03:55:23 +0100 Subject: [PATCH 160/255] Adapt to CMC changes --- .../java/vg/civcraft/mc/citadel/Citadel.java | 13 ++- .../mc/citadel/ReinforcementManager.java | 19 ++++ .../civcraft/mc/citadel/model/CitadelDAO.java | 97 ++++++++++++++++--- 3 files changed, 111 insertions(+), 18 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 26577cbc..38e78263 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -12,8 +12,8 @@ import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.CitadelChunkData; -import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.citadel.model.CitadelDAO; +import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; @@ -39,6 +39,7 @@ public static Citadel getInstance() { private ReinforcementTypeManager typeManager; private HologramManager holoManager; private CitadelSettingManager settingManager; + private CitadelDAO dao; private PlayerStateManager stateManager; @@ -72,6 +73,10 @@ public PlayerStateManager getStateManager() { public HologramManager getHologramManager() { return holoManager; } + + CitadelDAO getDAO() { + return dao; + } @Override public void onDisable() { @@ -103,14 +108,14 @@ public void onEnable() { } typeManager = new ReinforcementTypeManager(); config.getReinforcementTypes().forEach(t -> typeManager.register(t)); - CitadelDAO storage = new CitadelDAO(this.logger, config.getDatabase()); - if (!storage.updateDatabase()) { + dao = new CitadelDAO(this.logger, config.getDatabase()); + if (!dao.updateDatabase()) { logger.severe("Errors setting up database, shutting down"); Bukkit.shutdown(); return; } BlockBasedChunkMetaView> chunkMetaData = - ChunkMetaAPI.registerBlockBasedPlugin(this, () -> new CitadelChunkData(false, storage)); + ChunkMetaAPI.registerBlockBasedPlugin(this, () -> new CitadelChunkData(false, dao),dao, true); if (chunkMetaData == null) { logger.severe("Errors setting up chunk metadata API, shutting down"); Bukkit.shutdown(); diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java index 3376e8b8..e69696c0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -18,14 +18,33 @@ public class ReinforcementManager { this.chunkMetaData = chunkMetaData; } + /** + * Gets the reinforcement at the given location if one exists + * + * @param location Location to get reinforcement for + * @return Reinforcement at the location or null if no reinforcement exists + * there + */ public Reinforcement getReinforcement(Location location) { return (Reinforcement) chunkMetaData.get(location); } + /** + * Gets the reinforcement for the given block if one exists + * + * @param location Block to get reinforcement for + * @return Reinforcement for the block or null if no reinforcement exists there + */ public Reinforcement getReinforcement(Block block) { return getReinforcement(block.getLocation()); } + /** + * Inserts the given reinforcement into the tracking. If a reinforcement already + * exists at the same location it will be replaced. + * + * @param reinforcement Reinforcement to insert + */ public void putReinforcement(Reinforcement reinforcement) { chunkMetaData.put(reinforcement); } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java index 0fba6ffc..e4d060df 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java @@ -6,6 +6,7 @@ import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -23,8 +24,8 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.CivModCorePlugin; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.ChunkCoord; import vg.civcraft.mc.civmodcore.locations.chunkmeta.GlobalChunkMetaManager; +import vg.civcraft.mc.civmodcore.locations.chunkmeta.XZWCoord; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.BlockBasedChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; @@ -70,9 +71,9 @@ public Boolean call() throws Exception { } int batchCounter = 0; while (rs.next()) { - byte x = (byte) BlockBasedChunkMeta.modulo(rs.getInt(1), 16); + byte x = (byte) BlockBasedChunkMeta.modulo(rs.getInt(1)); short y = (short) rs.getInt(2); - byte z = (byte) BlockBasedChunkMeta.modulo(rs.getInt(3), 16); + byte z = (byte) BlockBasedChunkMeta.modulo(rs.getInt(3)); int chunkX = rs.getInt(4); int chunkZ = rs.getInt(5); String worldName = rs.getString(6); @@ -119,7 +120,7 @@ public Boolean call() throws Exception { // in minutes since unix epoch // No, I do not know why long creationTime = maturationTime - (type.getMaturationTime() / 60_000); - //some rows have a maturation time of 0, no idea why + // some rows have a maturation time of 0, no idea why creationTime = Math.max(creationTime, 1); creationTime *= 60_000; @@ -135,7 +136,7 @@ public Boolean call() throws Exception { insertRein.setBoolean(10, insecure); insertRein.setTimestamp(11, new Timestamp(creationTime)); insertRein.addBatch(); - if (batchCounter > 100) { + if (batchCounter > 10000) { batchCounter = 0; insertRein.executeBatch(); } @@ -152,8 +153,53 @@ public Boolean call() throws Exception { + "(chunk_x, chunk_z, world_id, x_offset, y ,z_offset))"); } + /** + * Gets a single reinforcement at the given location without inserting it into + * the tracking + * + * @return Reinforcement loaded from the database + */ @Override - public void insert(Reinforcement data, ChunkCoord coord) { + public Reinforcement getForLocation(int x, int y, int z, short worldID, short pluginID) { + int chunkX = BlockBasedChunkMeta.toChunkCoord(x); + int chunkZ = BlockBasedChunkMeta.toChunkCoord(z); + ReinforcementTypeManager typeMan = Citadel.getInstance().getReinforcementTypeManager(); + try (Connection insertConn = db.getConnection(); + PreparedStatement selectRein = insertConn + .prepareStatement("select type_id, group_id, creation_time, health, insecure " + + "from ctdl_reinforcements where chunk_x = ? and chunk_z = ? and world_id = ? and x_offset = ? and y = ? and z_offset = ?;");) { + selectRein.setInt(1, chunkX); + selectRein.setInt(2, chunkZ); + selectRein.setShort(3, worldID); + selectRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(x)); + selectRein.setShort(5, (short) y); + selectRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(z)); + try (ResultSet rs = selectRein.executeQuery()) { + if (!rs.next()) { + return null; + } + short typeID = rs.getShort(1); + ReinforcementType type = typeMan.getById(typeID); + if (type == null) { + logger.log(Level.SEVERE, "Failed to load reinforcement with type id " + typeID); + return null; + } + int groupID = rs.getInt(2); + long creationTime = rs.getTimestamp(3).getTime(); + float health = rs.getFloat(4); + boolean insecure = rs.getBoolean(5); + World world = CivModCorePlugin.getInstance().getChunkMetaManager().getWorldByInternalID(worldID); + Location loc = new Location(world, x, y, z); + return new Reinforcement(loc, type, groupID, creationTime, health, insecure, false); + } + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to load reinforcement from db: ", e); + return null; + } + } + + @Override + public void insert(Reinforcement data, XZWCoord coord) { try (Connection insertConn = db.getConnection(); PreparedStatement insertRein = insertConn.prepareStatement( "insert into ctdl_reinforcements (chunk_x, chunk_z, world_id, x_offset, y, z_offset, type_id, " @@ -161,9 +207,9 @@ public void insert(Reinforcement data, ChunkCoord coord) { insertRein.setInt(1, coord.getX()); insertRein.setInt(2, coord.getZ()); insertRein.setShort(3, coord.getWorldID()); - insertRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + insertRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX())); insertRein.setShort(5, (short) data.getLocation().getBlockY()); - insertRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + insertRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ())); insertRein.setShort(7, data.getType().getID()); insertRein.setFloat(8, data.getHealth()); insertRein.setInt(9, data.getGroupId()); @@ -176,7 +222,7 @@ public void insert(Reinforcement data, ChunkCoord coord) { } @Override - public void update(Reinforcement data, ChunkCoord coord) { + public void update(Reinforcement data, XZWCoord coord) { try (Connection insertConn = db.getConnection(); PreparedStatement updateRein = insertConn.prepareStatement( "update ctdl_reinforcements set type_id = ?, health = ?, group_id = ?, insecure = ?, creation_time = ? where " @@ -189,9 +235,9 @@ public void update(Reinforcement data, ChunkCoord coord) { updateRein.setInt(6, coord.getX()); updateRein.setInt(7, coord.getZ()); updateRein.setShort(8, coord.getWorldID()); - updateRein.setByte(9, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + updateRein.setByte(9, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX())); updateRein.setShort(10, (short) data.getLocation().getBlockY()); - updateRein.setByte(11, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + updateRein.setByte(11, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ())); updateRein.execute(); } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to update reinforcement in db: ", e); @@ -199,7 +245,7 @@ public void update(Reinforcement data, ChunkCoord coord) { } @Override - public void delete(Reinforcement data, ChunkCoord coord) { + public void delete(Reinforcement data, XZWCoord coord) { try (Connection insertConn = db.getConnection(); PreparedStatement deleteRein = insertConn.prepareStatement( "delete from ctdl_reinforcements where chunk_x = ? and chunk_z = ? and world_id = ? and " @@ -207,9 +253,9 @@ public void delete(Reinforcement data, ChunkCoord coord) { deleteRein.setInt(1, coord.getX()); deleteRein.setInt(2, coord.getZ()); deleteRein.setShort(3, coord.getWorldID()); - deleteRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX(), 16)); + deleteRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockX())); deleteRein.setShort(5, (short) data.getLocation().getBlockY()); - deleteRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ(), 16)); + deleteRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(data.getLocation().getBlockZ())); deleteRein.execute(); } catch (SQLException e) { logger.log(Level.SEVERE, "Failed to delete reinforcement from db: ", e); @@ -257,4 +303,27 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer getAllDataChunks() { + List result = new ArrayList<>(); + try (Connection insertConn = db.getConnection(); + PreparedStatement selectChunks = insertConn.prepareStatement( + "select chunk_x, chunk_z, world_id from ctdl_reinforcements group by chunk_x, chunk_z, world_id"); + ResultSet rs = selectChunks.executeQuery()) { + while (rs.next()) { + int chunkX = rs.getInt(1); + int chunkZ = rs.getInt(2); + short worldID = rs.getShort(3); + result.add(new XZWCoord(chunkX, chunkZ, worldID)); + } + } catch (SQLException e) { + logger.log(Level.SEVERE, "Failed to select populated chunks from db: ", e); + } + return result; + } + + @Override + public boolean stayLoaded() { + return false; + } } From b9515d6845238ae82a3b0146bf0ecfa3481883a5 Mon Sep 17 00:00:00 2001 From: Falvyu Date: Thu, 9 Apr 2020 23:26:14 +0200 Subject: [PATCH 161/255] Reinforced chest, block container and doors can't be interacted with by non-members. --- .../civcraft/mc/citadel/listener/BlockListener.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index c8c90a5c..26c4b7f3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -8,6 +8,7 @@ import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Comparator; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -172,18 +173,21 @@ public void onStructureGrow(StructureGrowEvent event) { } // prevent opening reinforced things - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void openContainer(PlayerInteractEvent e) { if (!e.hasBlock()) { return; } + if (e.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); if (rein == null) { return; } - if (e.getClickedBlock().getBlockData() instanceof Container) { + if (e.getClickedBlock().getState() instanceof Container) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getChests())) { - e.setCancelled(true); + e.setUseInteractedBlock(Event.Result.DENY); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } @@ -191,7 +195,7 @@ public void openContainer(PlayerInteractEvent e) { } if (e.getClickedBlock().getBlockData() instanceof Openable) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getDoors())) { - e.setCancelled(true); + e.setUseInteractedBlock(Event.Result.DENY); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); } From 4fe48dbe1ff41965d40a24349dc9346ee237668b Mon Sep 17 00:00:00 2001 From: Falvyu Date: Thu, 9 Apr 2020 23:46:33 +0200 Subject: [PATCH 162/255] Added color for reinforcement in door/chest locked message --- .../vg/civcraft/mc/citadel/listener/BlockListener.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 26c4b7f3..a97958a8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -188,16 +188,18 @@ public void openContainer(PlayerInteractEvent e) { if (e.getClickedBlock().getState() instanceof Container) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getChests())) { e.setUseInteractedBlock(Event.Result.DENY); - CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, - e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); + String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), + ChatColor.AQUA, rein.getType().getName()); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, msg); } return; } if (e.getClickedBlock().getBlockData() instanceof Openable) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getDoors())) { e.setUseInteractedBlock(Event.Result.DENY); - CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, - e.getClickedBlock().getType().name() + " is locked with " + rein.getType().getName()); + String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), + ChatColor.AQUA, rein.getType().getName()); + CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, msg); } } } From 1b700721cafd646c85a28cebc85a9af84d2bde4d Mon Sep 17 00:00:00 2001 From: Falvyu Date: Sat, 11 Apr 2020 22:32:59 +0200 Subject: [PATCH 163/255] Reverted to e.setCancelled() from setUseInteractedBlock() --- .../java/vg/civcraft/mc/citadel/listener/BlockListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index a97958a8..3a3edba7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -187,7 +187,7 @@ public void openContainer(PlayerInteractEvent e) { } if (e.getClickedBlock().getState() instanceof Container) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getChests())) { - e.setUseInteractedBlock(Event.Result.DENY); + e.setCancelled(true); String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), ChatColor.AQUA, rein.getType().getName()); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, msg); @@ -196,7 +196,7 @@ public void openContainer(PlayerInteractEvent e) { } if (e.getClickedBlock().getBlockData() instanceof Openable) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getDoors())) { - e.setUseInteractedBlock(Event.Result.DENY); + e.setCancelled(true); String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), ChatColor.AQUA, rein.getType().getName()); CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, msg); From cd1b6a277b37ff7e8f61e4ad7a1f650912b70b3e Mon Sep 17 00:00:00 2001 From: Falvyu Date: Sat, 11 Apr 2020 23:27:10 +0200 Subject: [PATCH 164/255] Fix protection against stripping wood and tiling grass. --- .../vg/civcraft/mc/citadel/listener/BlockListener.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 3a3edba7..fb107e90 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -234,11 +234,14 @@ public void removeReinforcedAir(BlockPlaceEvent e) { } } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void preventStrippingLogs(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } Block block = pie.getClickedBlock(); if (!MaterialAPI.isLog(block.getType())) { return; @@ -268,11 +271,14 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { } } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void preventTilingGrass(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } Block block = pie.getClickedBlock(); if (block.getType() != Material.GRASS_BLOCK) { return; From 16a0263c0da23aa0e06742142bef327785477946 Mon Sep 17 00:00:00 2001 From: Falvyu Date: Mon, 13 Apr 2020 01:13:57 +0200 Subject: [PATCH 165/255] Reverts handler priorities from HIGH to LOW. --- .../java/vg/civcraft/mc/citadel/listener/BlockListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index fb107e90..75ecec62 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -173,7 +173,7 @@ public void onStructureGrow(StructureGrowEvent event) { } // prevent opening reinforced things - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void openContainer(PlayerInteractEvent e) { if (!e.hasBlock()) { return; @@ -234,7 +234,7 @@ public void removeReinforcedAir(BlockPlaceEvent e) { } } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventStrippingLogs(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; @@ -271,7 +271,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { } } - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventTilingGrass(PlayerInteractEvent pie) { if (!pie.hasBlock()) { return; From db5230e99ad64b4047b58375983df9f7224bd7a6 Mon Sep 17 00:00:00 2001 From: Falvyu Date: Mon, 13 Apr 2020 22:49:37 +0200 Subject: [PATCH 166/255] Prevent non-ctb members from tilling reinforced grass/dirt/coarse into farmland/dirt --- .../mc/citadel/listener/BlockListener.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 75ecec62..2b0c74f6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -307,4 +307,43 @@ public void preventTilingGrass(PlayerInteractEvent pie) { pie.setCancelled(true); } } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Block block = pie.getClickedBlock(); + Material type = block.getType(); + if (type != Material.GRASS_BLOCK && type != Material.DIRT && type != Material.COARSE_DIRT + && type != Material.GRASS_PATH) { + return; + } + EquipmentSlot hand = pie.getHand(); + if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + return; + } + ItemStack relevant; + Player p = pie.getPlayer(); + if (hand == EquipmentSlot.HAND) { + relevant = p.getInventory().getItemInMainHand(); + } + else { + relevant = p.getInventory().getItemInOffHand(); + } + if (!ToolAPI.isHoe(relevant.getType())) { + return; + } + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null) { + return; + } + if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); + pie.setCancelled(true); + } + } } From da7320fb319c1e6846c6cf9a7ffa3ef82edc13fb Mon Sep 17 00:00:00 2001 From: Falvyu Date: Tue, 14 Apr 2020 01:10:19 +0200 Subject: [PATCH 167/255] Added permission for managing beacon protection --- .../mc/citadel/CitadelPermissionHandler.java | 7 ++++++ .../mc/citadel/listener/BlockListener.java | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index a3915507..f27be817 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -22,6 +22,7 @@ private CitadelPermissionHandler() { private static PermissionType infoPerm; private static PermissionType repairPerm; private static PermissionType modifyBlockPerm; + private static PermissionType beaconPerm; public static void setup() { List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, @@ -47,6 +48,8 @@ public static void setup() { "Allows toggling the insecure flag on reinforcements"); modifyBlockPerm = PermissionType.registerPermission("MODIFY_BLOCK", new ArrayList<>(modAndAbove), "Allows modifying reinforced blocks like flipping levers, strippling logs etc."); + beaconPerm = PermissionType.registerPermission("BEACON_EFFECT", new ArrayList<>(membersAndAbove), + "Allow changing beacon effects"); } public static PermissionType getModifyBlocks() { @@ -89,4 +92,8 @@ public static PermissionType getRepair() { return repairPerm; } + public static PermissionType getBeacon() { + return beaconPerm; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 2b0c74f6..b2b22e93 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -346,4 +346,26 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { pie.setCancelled(true); } } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = false) + public void openBeacon(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(pie.getClickedBlock()); + if (rein == null) { + return; + } + if (pie.getClickedBlock().getType() == Material.BEACON) { + if (!rein.hasPermission(pie.getPlayer(), CitadelPermissionHandler.getBeacon())) { + pie.setCancelled(true); + String msg = String.format("%s is locked with %s%s", pie.getClickedBlock().getType().name(), + ChatColor.AQUA, rein.getType().getName()); + CitadelUtility.sendAndLog(pie.getPlayer(), ChatColor.RED, msg); + } + } + } } From 06a8036cafbf4c5360828aafb3c1cde157c9f702 Mon Sep 17 00:00:00 2001 From: Falvyu Date: Tue, 14 Apr 2020 23:07:30 +0200 Subject: [PATCH 168/255] Renamed 'BEACON_EFFECT' permission to 'BEACONS' --- .../java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index f27be817..74368eff 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -48,7 +48,7 @@ public static void setup() { "Allows toggling the insecure flag on reinforcements"); modifyBlockPerm = PermissionType.registerPermission("MODIFY_BLOCK", new ArrayList<>(modAndAbove), "Allows modifying reinforced blocks like flipping levers, strippling logs etc."); - beaconPerm = PermissionType.registerPermission("BEACON_EFFECT", new ArrayList<>(membersAndAbove), + beaconPerm = PermissionType.registerPermission("BEACONS", new ArrayList<>(membersAndAbove), "Allow changing beacon effects"); } From 3ae86cf66233880dcc9a4f1aead7018027ee4339 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 15 Apr 2020 05:38:22 +0200 Subject: [PATCH 169/255] Minor DAO fixes --- .../java/vg/civcraft/mc/citadel/model/CitadelDAO.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java index e4d060df..11e5d2d1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java @@ -24,11 +24,11 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementTypeManager; import vg.civcraft.mc.civmodcore.CivModCorePlugin; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.GlobalChunkMetaManager; import vg.civcraft.mc.civmodcore.locations.chunkmeta.XZWCoord; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.BlockBasedChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; +import vg.civcraft.mc.civmodcore.locations.global.WorldIDManager; public class CitadelDAO extends TableStorageEngine { @@ -62,7 +62,7 @@ public Boolean call() throws Exception { deleteExisting.execute(); } - GlobalChunkMetaManager worldMan = CivModCorePlugin.getInstance().getChunkMetaManager(); + WorldIDManager worldMan = CivModCorePlugin.getInstance().getWorldIdManager(); Map> reinTypes = new TreeMap<>(); for (ReinforcementType type : Citadel.getInstance().getReinforcementTypeManager().getAllTypes()) { List withType = reinTypes.computeIfAbsent(type.getLegacyId(), @@ -173,7 +173,7 @@ public Reinforcement getForLocation(int x, int y, int z, short worldID, short pl selectRein.setShort(3, worldID); selectRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(x)); selectRein.setShort(5, (short) y); - selectRein.setByte(4, (byte) BlockBasedChunkMeta.modulo(z)); + selectRein.setByte(6, (byte) BlockBasedChunkMeta.modulo(z)); try (ResultSet rs = selectRein.executeQuery()) { if (!rs.next()) { return null; @@ -188,7 +188,7 @@ public Reinforcement getForLocation(int x, int y, int z, short worldID, short pl long creationTime = rs.getTimestamp(3).getTime(); float health = rs.getFloat(4); boolean insecure = rs.getBoolean(5); - World world = CivModCorePlugin.getInstance().getChunkMetaManager().getWorldByInternalID(worldID); + World world = CivModCorePlugin.getInstance().getWorldIdManager().getWorldByInternalID(worldID); Location loc = new Location(world, x, y, z); return new Reinforcement(loc, type, groupID, creationTime, health, insecure, false); } From becde3ba1808e59e1c7a2e7d53e07e843f8b8dd6 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 16 Apr 2020 19:50:59 +0200 Subject: [PATCH 170/255] Hologram manager debug message --- src/main/java/vg/civcraft/mc/citadel/Citadel.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 38e78263..07a10dad 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -127,6 +127,10 @@ public void onEnable() { settingManager = new CitadelSettingManager(); if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { holoManager = new HologramManager(settingManager); + logger.info("HolographicDisplays is loaded, holograms available"); + } + else { + logger.info("HolographicDisplays is not loaded, no holograms available"); } CitadelPermissionHandler.setup(); registerListeners(); From 2aa6320312c396d8885a263cd8aa37cb169e928b Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 16 Apr 2020 20:46:32 +0200 Subject: [PATCH 171/255] More improvements --- .../java/vg/civcraft/mc/citadel/Citadel.java | 16 +++++++++------- .../listener/InformationModeListener.java | 17 ++++++++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 07a10dad..e531a673 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -1,5 +1,6 @@ package vg.civcraft.mc.citadel; +import java.util.Arrays; import java.util.logging.Logger; import org.bukkit.Bukkit; @@ -125,13 +126,14 @@ public void onEnable() { stateManager = new PlayerStateManager(); acidManager = new AcidManager(config.getAcidMaterials()); settingManager = new CitadelSettingManager(); - if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { - holoManager = new HologramManager(settingManager); - logger.info("HolographicDisplays is loaded, holograms available"); - } - else { - logger.info("HolographicDisplays is not loaded, no holograms available"); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> { + if (Bukkit.getPluginManager().isPluginEnabled("HolographicDisplays")) { + holoManager = new HologramManager(settingManager); + logger.info("HolographicDisplays is loaded, holograms available"); + } + else { + logger.info("HolographicDisplays is not loaded, no holograms available"); + }}); CitadelPermissionHandler.setup(); registerListeners(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java index 64d43a4a..0afa68bf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; @@ -138,7 +139,21 @@ else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { if (showHolo) { showHolo(rein, player); } - + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) + public void onBlockBreak(BlockBreakEvent event) { + //refresh hologram + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getBlock()); + if (rein == null) { + return; + } + Player player = event.getPlayer(); + boolean showHolo = Citadel.getInstance().getSettingManager().shouldShowHologramInCti(player.getUniqueId()); + if (!showHolo) { + return; + } + showHolo(rein, player); } private static void showHolo(Reinforcement rein, Player player) { From 2cdb9de7ea6ea80fdfccb76b97bcfad3d07e3492 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 18 Apr 2020 15:29:30 +0200 Subject: [PATCH 172/255] Integrate cti state into overlay --- .../java/vg/civcraft/mc/citadel/Citadel.java | 1 - .../mc/citadel/listener/BlockListener.java | 1 - .../listener/InformationModeListener.java | 65 ++++++++++++++++--- .../citadel/model/CitadelSettingManager.java | 37 +++++++++-- 4 files changed, 89 insertions(+), 15 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index e531a673..589540b7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -1,6 +1,5 @@ package vg.civcraft.mc.citadel; -import java.util.Arrays; import java.util.logging.Logger; import org.bukkit.Bukkit; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index b2b22e93..954c2f1d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -8,7 +8,6 @@ import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Comparator; import org.bukkit.entity.Player; -import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java index 0afa68bf..f844637f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java @@ -1,8 +1,10 @@ package vg.civcraft.mc.citadel.listener; import java.text.DecimalFormat; +import java.util.UUID; import java.util.concurrent.TimeUnit; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.entity.Player; @@ -12,14 +14,23 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.AcidManager; +import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.playersettings.PlayerSetting; +import vg.civcraft.mc.civmodcore.playersettings.SettingChangeListener; +import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; +import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLine; +import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI; +import vg.civcraft.mc.civmodcore.scoreboard.side.CivScoreBoard; +import vg.civcraft.mc.civmodcore.scoreboard.side.ScoreBoardAPI; import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; import vg.civcraft.mc.civmodcore.util.TextUtil; @@ -27,11 +38,48 @@ public class InformationModeListener implements Listener { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); - + private DoubleInteractFixer interactFixer; - + private BottomLine bottomLine; + private CivScoreBoard ctiBoard; + private CitadelSettingManager settingMan; + public InformationModeListener(Citadel citadel) { interactFixer = new DoubleInteractFixer(citadel); + this.bottomLine = BottomLineAPI.createBottomLine("ctiDisplay", 3); + this.ctiBoard = ScoreBoardAPI.createBoard("ctiDisplay"); + this.settingMan = Citadel.getInstance().getSettingManager(); + settingMan.getInformationMode().registerListener(new SettingChangeListener() { + @Override + public void handle(UUID player, PlayerSetting setting, Boolean oldValue, Boolean newValue) { + setCtiOverlay(Bukkit.getPlayer(player), newValue); + } + }); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void playerLogin(PlayerJoinEvent e) { + setCtiOverlay(e.getPlayer(), settingMan.getInformationMode().getValue(e.getPlayer())); + } + + private void setCtiOverlay(Player player, boolean state) { + if (player == null) { + return; + } + DisplayLocationSetting locSetting = settingMan.getInformationLocationSetting(); + if (!state) { + // always clean up, value might have been changed + bottomLine.removePlayer(player); + ctiBoard.set(player, null); + } else { + if (locSetting.showOnActionbar(player.getUniqueId())) { + bottomLine.updatePlayer(player, ChatColor.GOLD + "CTI"); + } + if (locSetting.showOnSidebar(player.getUniqueId())) { + ctiBoard.set(player, ChatColor.GOLD + "CTI"); + } + } + } public static ChatColor getDamageColor(double relativeHealth) { @@ -81,16 +129,15 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (interactFixer.checkInteracted(e.getPlayer(), e.getClickedBlock())) { return; } - } - else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { + } else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { return; } - if (!Citadel.getInstance().getSettingManager().getInformationMode().getValue(e.getPlayer())) { + if (!settingMan.getInformationMode().getValue(e.getPlayer())) { return; } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); Player player = e.getPlayer(); - boolean showChat = Citadel.getInstance().getSettingManager().shouldShowChatInCti(player.getUniqueId()); + boolean showChat = settingMan.shouldShowChatInCti(player.getUniqueId()); if (rein == null) { if (showChat) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, "Not reinforced"); @@ -100,7 +147,7 @@ else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { if (player.getGameMode() == GameMode.CREATIVE) { e.setCancelled(true); } - boolean showHolo = Citadel.getInstance().getSettingManager().shouldShowHologramInCti(player.getUniqueId()); + boolean showHolo = settingMan.shouldShowHologramInCti(player.getUniqueId()); if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) { if (showChat) { Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); @@ -140,10 +187,10 @@ else if (e.getAction() != Action.LEFT_CLICK_BLOCK) { showHolo(rein, player); } } - + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false) public void onBlockBreak(BlockBreakEvent event) { - //refresh hologram + // refresh hologram Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getBlock()); if (rein == null) { return; diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 8a18523f..7af0ac50 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -20,6 +20,8 @@ import vg.civcraft.mc.civmodcore.playersettings.impl.BoundedIntegerSetting; import vg.civcraft.mc.civmodcore.playersettings.impl.CommandReplySetting; import vg.civcraft.mc.civmodcore.playersettings.impl.DecimalFormatSetting; +import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; +import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting.DisplayLocation; public class CitadelSettingManager { @@ -37,11 +39,26 @@ public class CitadelSettingManager { // private CommandReplySetting modeSwitch; private DecimalFormatSetting ctiPercentageHealth; private DecimalFormatSetting ctiReinforcementHealth; + private DisplayLocationSetting ctbLocationSetting; + private DisplayLocationSetting modeLocationSetting; + private DisplayLocationSetting ctiLocationSetting; public CitadelSettingManager() { initSettings(); } + public DisplayLocationSetting getBypassLocationSetting() { + return ctbLocationSetting; + } + + public DisplayLocationSetting getModeLocationSetting() { + return modeLocationSetting; + } + + public DisplayLocationSetting getInformationLocationSetting() { + return ctiLocationSetting; + } + public BooleanSetting getBypass() { return byPass; } @@ -49,7 +66,7 @@ public BooleanSetting getBypass() { public BooleanSetting getInformationMode() { return informationMode; } - + public BooleanSetting getEasyMode() { return easyMode; } @@ -61,11 +78,11 @@ public boolean shouldShowChatInCti(UUID uuid) { public boolean shouldShowHologramInCti(UUID uuid) { return showHologramInCti.getValue(uuid); } - + public boolean isInEasyMode(UUID uuid) { return easyMode.getValue(uuid); } - + public int getHologramDuration(UUID uuid) { return hologramDuration.getValue(uuid); } @@ -98,7 +115,19 @@ void initSettings() { "How long should holograms in information mode remain visible, measured in milli seconds", false, 1000, 30000); PlayerSettingAPI.registerSetting(hologramDuration, menu); - + + ctbLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocation.NONE, "Bypass display location" + , "citadelBypassDisplayLocation", new ItemStack(Material.GOLDEN_PICKAXE), "bypass"); + PlayerSettingAPI.registerSetting(ctbLocationSetting, menu); + + ctiLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocation.SIDEBAR, "Information mode display location" + , "citadelInfoModeDisplayLocation", new ItemStack(Material.BOOKSHELF), "reinforcement info mode"); + PlayerSettingAPI.registerSetting(ctiLocationSetting, menu); + + modeLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocation.SIDEBAR, "Citadel mode display location" + , "citadelReinModeDisplayLocation", new ItemStack(Material.NETHER_STAR), "Citadel mode"); + PlayerSettingAPI.registerSetting(ctbLocationSetting, menu); + MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); From fb2687bfa7f949924af67960444791d260a178ed Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 19 Apr 2020 20:18:19 +0200 Subject: [PATCH 173/255] Adapt to CMC changes --- .../vg/civcraft/mc/citadel/listener/RedstoneListener.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index e117a11f..2d0311b8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -5,6 +5,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; import org.bukkit.Bukkit; @@ -152,7 +153,11 @@ public void redstonePower(BlockRedstoneEvent bre) { } private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { - for (Block rel : BlockAPI.getAllSides(block, f -> f != skip)) { + for (Entry entry : BlockAPI.getAllSidesMapped(block).entrySet()) { + if (entry.getKey() == skip) { + continue; + } + Block rel = entry.getValue(); BlockData blockData = rel.getBlockData(); if (!(blockData instanceof Openable)) { continue; From 497a42f1a308d224b0c8ba4f578ee38656dc8c8e Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 20 Apr 2020 04:00:15 +0200 Subject: [PATCH 174/255] Overlay for modes fully works --- .../java/vg/civcraft/mc/citadel/Citadel.java | 4 +- .../events/ReinforcementModeSwitchEvent.java | 62 ++++++++++++++ ...ionModeListener.java => ModeListener.java} | 85 ++++++++++++++++--- .../citadel/model/CitadelSettingManager.java | 8 +- .../mc/citadel/model/HologramManager.java | 6 +- .../playerstate/AbstractPlayerState.java | 2 + .../AdvancedFortificationState.java | 5 ++ .../playerstate/FortificationState.java | 8 +- .../mc/citadel/playerstate/InsecureState.java | 5 ++ .../mc/citadel/playerstate/NormalState.java | 5 ++ .../mc/citadel/playerstate/PatchState.java | 11 ++- .../playerstate/PlayerStateManager.java | 7 ++ .../citadel/playerstate/ReinforcingState.java | 5 ++ 13 files changed, 190 insertions(+), 23 deletions(-) create mode 100644 src/main/java/vg/civcraft/mc/citadel/events/ReinforcementModeSwitchEvent.java rename src/main/java/vg/civcraft/mc/citadel/listener/{InformationModeListener.java => ModeListener.java} (68%) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 589540b7..08bfa48c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -7,7 +7,7 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; -import vg.civcraft.mc.citadel.listener.InformationModeListener; +import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.listener.InventoryListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; @@ -144,7 +144,7 @@ private void registerListeners() { getServer().getPluginManager().registerEvents(new BlockListener(this), this); getServer().getPluginManager().registerEvents(new EntityListener(), this); getServer().getPluginManager().registerEvents(new InventoryListener(), this); - getServer().getPluginManager().registerEvents(new InformationModeListener(this), this); + getServer().getPluginManager().registerEvents(new ModeListener(this), this); getServer().getPluginManager().registerEvents(new RedstoneListener(config.getMaxRedstoneDistance()), this); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementModeSwitchEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementModeSwitchEvent.java new file mode 100644 index 00000000..78c30c51 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementModeSwitchEvent.java @@ -0,0 +1,62 @@ +package vg.civcraft.mc.citadel.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; + +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; + +/** + * Called when a player changes his reinforcement mode. Not called when the + * player attempt to switch, but stays in the same mode + * + */ +public class ReinforcementModeSwitchEvent extends PlayerEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + + public static HandlerList getHandlerList() { + return handlers; + } + + private AbstractPlayerState oldState; + private AbstractPlayerState newState; + private boolean isCancelled; + + public ReinforcementModeSwitchEvent(Player who, AbstractPlayerState oldState, AbstractPlayerState newState) { + super(who); + this.oldState = oldState; + this.newState = newState; + isCancelled = false; + } + + /** + * @return Reinforcement mode before the change + */ + public AbstractPlayerState getOldMode() { + return oldState; + } + + /** + * @return Reinforcement mode after the change + */ + public AbstractPlayerState getNewMode() { + return newState; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean value) { + isCancelled = value; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java similarity index 68% rename from src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java rename to src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java index f844637f..9b4d56d4 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InformationModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java @@ -20,10 +20,13 @@ import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.events.ReinforcementModeSwitchEvent; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.citadel.model.HologramManager; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; +import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.civmodcore.playersettings.PlayerSetting; import vg.civcraft.mc.civmodcore.playersettings.SettingChangeListener; import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; @@ -34,20 +37,30 @@ import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; import vg.civcraft.mc.civmodcore.util.TextUtil; -public class InformationModeListener implements Listener { +public class ModeListener implements Listener { private static final DecimalFormat commaFormat = new DecimalFormat("#.##"); private static final DecimalFormat roundingFormat = new DecimalFormat("0"); private DoubleInteractFixer interactFixer; - private BottomLine bottomLine; + private BottomLine ctiBottomLine; private CivScoreBoard ctiBoard; + private BottomLine ctbBottomLine; + private CivScoreBoard ctbBoard; + private BottomLine reinBottomLine; + private CivScoreBoard reinBoard; private CitadelSettingManager settingMan; + private PlayerStateManager stateMan; - public InformationModeListener(Citadel citadel) { + public ModeListener(Citadel citadel) { interactFixer = new DoubleInteractFixer(citadel); - this.bottomLine = BottomLineAPI.createBottomLine("ctiDisplay", 3); + this.stateMan = citadel.getStateManager(); + this.ctiBottomLine = BottomLineAPI.createBottomLine("ctiDisplay", 3); this.ctiBoard = ScoreBoardAPI.createBoard("ctiDisplay"); + this.ctbBottomLine = BottomLineAPI.createBottomLine("ctbDisplay", 3); + this.ctbBoard = ScoreBoardAPI.createBoard("ctbDisplay"); + this.reinBottomLine = BottomLineAPI.createBottomLine("ctreinDisplay", 3); + this.reinBoard = ScoreBoardAPI.createBoard("ctreinDisplay"); this.settingMan = Citadel.getInstance().getSettingManager(); settingMan.getInformationMode().registerListener(new SettingChangeListener() { @Override @@ -55,31 +68,83 @@ public void handle(UUID player, PlayerSetting setting, Boolean oldValue setCtiOverlay(Bukkit.getPlayer(player), newValue); } }); + settingMan.getInformationLocationSetting().registerListener(new SettingChangeListener() { + @Override + public void handle(UUID player, PlayerSetting setting, String oldValue, String newValue) { + setCtiOverlay(Bukkit.getPlayer(player), settingMan.getInformationMode().getValue(player)); + } + }); + settingMan.getBypass().registerListener(new SettingChangeListener() { + @Override + public void handle(UUID player, PlayerSetting setting, Boolean oldValue, Boolean newValue) { + setCtbOverlay(Bukkit.getPlayer(player), newValue); + } + }); + settingMan.getBypassLocationSetting().registerListener(new SettingChangeListener() { + @Override + public void handle(UUID player, PlayerSetting setting, String oldValue, String newValue) { + setCtbOverlay(Bukkit.getPlayer(player), settingMan.getBypass().getValue(player)); + } + }); + settingMan.getModeLocationSetting().registerListener(new SettingChangeListener() { + + @Override + public void handle(UUID player, PlayerSetting setting, String oldValue, String newValue) { + setReinModeOverlay(Bukkit.getPlayer(player), stateMan.getState(Bukkit.getPlayer(player))); + } + }); } - + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void modeChange(ReinforcementModeSwitchEvent event) { + setReinModeOverlay(event.getPlayer(), event.getNewMode()); + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void playerLogin(PlayerJoinEvent e) { setCtiOverlay(e.getPlayer(), settingMan.getInformationMode().getValue(e.getPlayer())); + setCtbOverlay(e.getPlayer(), settingMan.getBypass().getValue(e.getPlayer())); + setReinModeOverlay(e.getPlayer(), stateMan.getState(e.getPlayer())); } private void setCtiOverlay(Player player, boolean state) { + updateDisplaySetting(player, settingMan.getInformationLocationSetting(), state, ChatColor.GOLD + "CTI", + ctiBottomLine, ctiBoard); + } + + private void setCtbOverlay(Player player, boolean state) { + updateDisplaySetting(player, settingMan.getBypassLocationSetting(), state, ChatColor.AQUA + "CTB", + ctbBottomLine, ctbBoard); + } + + private void setReinModeOverlay(Player player, AbstractPlayerState state) { + if (state == null) { + return; + } + updateDisplaySetting(player, settingMan.getModeLocationSetting(), true, state.getOverlayText(), reinBottomLine, + reinBoard); + } + + private static void updateDisplaySetting(Player player, DisplayLocationSetting locSetting, boolean state, String text, + BottomLine bottomLine, CivScoreBoard scoreBoard) { if (player == null) { return; } - DisplayLocationSetting locSetting = settingMan.getInformationLocationSetting(); + if (text == null) { + state = false; + } if (!state) { // always clean up, value might have been changed bottomLine.removePlayer(player); - ctiBoard.set(player, null); + scoreBoard.hide(player); } else { if (locSetting.showOnActionbar(player.getUniqueId())) { - bottomLine.updatePlayer(player, ChatColor.GOLD + "CTI"); + bottomLine.updatePlayer(player, text); } if (locSetting.showOnSidebar(player.getUniqueId())) { - ctiBoard.set(player, ChatColor.GOLD + "CTI"); + scoreBoard.set(player, text); } } - } public static ChatColor getDamageColor(double relativeHealth) { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 7af0ac50..90748f04 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -12,7 +12,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; -import vg.civcraft.mc.citadel.listener.InformationModeListener; +import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; @@ -126,7 +126,7 @@ void initSettings() { modeLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocation.SIDEBAR, "Citadel mode display location" , "citadelReinModeDisplayLocation", new ItemStack(Material.NETHER_STAR), "Citadel mode"); - PlayerSettingAPI.registerSetting(ctbLocationSetting, menu); + PlayerSettingAPI.registerSetting(modeLocationSetting, menu); MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); @@ -156,7 +156,7 @@ void initSettings() { ctiEnemy.registerArgument("max_health", "50", "the maximum health of the reinforcement"); ctiEnemy.registerArgument("health", "25", "the current health of the reinforcement"); ctiEnemy.registerArgument("type", "Stone", "the type of the reinforcement"); - ctiEnemy.registerArgument("health_color", InformationModeListener.getDamageColor(0.5).toString(), + ctiEnemy.registerArgument("health_color", ModeListener.getDamageColor(0.5).toString(), "a color representing the reinforcement health"); PlayerSettingAPI.registerSetting(ctiEnemy, commandSection); } @@ -172,7 +172,7 @@ public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) { args.put("max_health", reinHealthFormatter.format(type.getHealth())); args.put("type", type.getName()); args.put("health_color", - InformationModeListener.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); + ModeListener.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); CitadelUtility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index 3f7a3bad..fbc1ad57 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -19,7 +19,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; -import vg.civcraft.mc.citadel.listener.InformationModeListener; +import vg.civcraft.mc.citadel.listener.ModeListener; public class HologramManager { // distance from center to diagonal corner is 0.5 * sqrt(2) and we add 10 % for @@ -151,7 +151,7 @@ void updateText() { if (hologram.size() > 0) { hologram.removeLine(0); } - hologram.insertTextLine(0, InformationModeListener.formatHealth(reinforcement)); + hologram.insertTextLine(0, ModeListener.formatHealth(reinforcement)); cachedHealth = reinforcement.getHealth(); } if (!hasPermission) { @@ -166,7 +166,7 @@ void updateText() { hologram.removeLine(3); } if (!reinforcement.isMature()) { - hologram.insertTextLine(3, InformationModeListener.formatProgress(reinforcement.getCreationTime(), + hologram.insertTextLine(3, ModeListener.formatProgress(reinforcement.getCreationTime(), reinforcement.getType().getMaturationTime(), "")); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 5e60556a..06f36a48 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -97,6 +97,8 @@ protected static void giveReinforcement(Location location, Player p, Reinforceme } } + public abstract String getOverlayText(); + @Override public abstract boolean equals(Object o); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index 720ad2ac..c0cec432 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -93,4 +93,9 @@ public boolean equals(Object o) { return false; } + @Override + public String getOverlayText() { + return ChatColor.GOLD + "CTAF"; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index efd3baf6..6d6b5d31 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -47,7 +47,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { } - + @Override public boolean equals(Object o) { if (!(o instanceof FortificationState)) { @@ -56,4 +56,10 @@ public boolean equals(Object o) { FortificationState fort = (FortificationState) o; return fort.type == this.type && fort.group.getName().equals(this.getGroup().getName()); } + + @Override + public String getOverlayText() { + return String.format("%sCTF %s%s %s%s", ChatColor.GOLD, ChatColor.LIGHT_PURPLE, group.getName(), ChatColor.AQUA, + type.getName()); + } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index 5462ef71..91cf2fba 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -51,4 +51,9 @@ public boolean equals(Object o) { return o instanceof InsecureState; } + @Override + public String getOverlayText() { + return ChatColor.GREEN + "CTIN"; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 2d387250..7fd7e31e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -53,4 +53,9 @@ public boolean equals(Object o) { return o instanceof NormalState; } + @Override + public String getOverlayText() { + return null; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index 7ecdebd2..bef74532 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -11,7 +11,7 @@ import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.command.PatchMode; import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; -import vg.civcraft.mc.citadel.listener.InformationModeListener; +import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; @@ -47,12 +47,12 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (rein.getHealth() >= rein.getType().getHealth()) { if (rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.GOLD, - "Reinforcement is already at " + InformationModeListener.formatHealth(rein) + ChatColor.GOLD + "Reinforcement is already at " + ModeListener.formatHealth(rein) + ChatColor.GOLD + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " + ChatColor.LIGHT_PURPLE + rein.getGroup().getName()); } else { CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " - + InformationModeListener.formatHealth(rein) + ChatColor.GOLD + " health"); + + ModeListener.formatHealth(rein) + ChatColor.GOLD + " health"); } return; } @@ -81,4 +81,9 @@ public boolean equals(Object o) { return o instanceof PatchMode; } + @Override + public String getOverlayText() { + return ChatColor.GREEN + "CTP"; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java index 531ea4ef..2050f1b6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PlayerStateManager.java @@ -4,10 +4,12 @@ import java.util.TreeMap; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.CitadelUtility; +import vg.civcraft.mc.citadel.events.ReinforcementModeSwitchEvent; public class PlayerStateManager { @@ -45,6 +47,11 @@ public void setState(Player player, AbstractPlayerState state) { CitadelUtility.sendAndLog(player, ChatColor.GOLD, "You are still in " + ChatColor.YELLOW + state.getName()); return; } + ReinforcementModeSwitchEvent switchEvent = new ReinforcementModeSwitchEvent(player, existingState, state); + Bukkit.getPluginManager().callEvent(switchEvent); + if (switchEvent.isCancelled()) { + return; + } playerStateMap.put(player.getUniqueId(), state); CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Switched Citadel mode to " + ChatColor.YELLOW + state.getName() + ChatColor.GOLD + " from " + ChatColor.YELLOW + existingState.getName()); diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index d90b4eee..5a705fae 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -154,4 +154,9 @@ public boolean equals(Object o) { } return ((ReinforcingState) o).group.getName().equals(this.getGroup().getName()); } + + @Override + public String getOverlayText() { + return String.format("%sCTR %s%s", ChatColor.GOLD, ChatColor.LIGHT_PURPLE, group.getName()); + } } From 3404e49ff2afc2cdc4122a7ecf90cd85bc513f08 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Apr 2020 03:34:41 +0200 Subject: [PATCH 175/255] Fix minor bugs --- src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java | 3 +++ src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index d9fafb84..ce1c5792 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -161,6 +161,9 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp return true; } ItemMap playerItems = new ItemMap(player.getInventory()); + if (player.getInventory().getItemInOffHand() != null) { + playerItems.addItemStack(player.getInventory().getItemInOffHand()); + } // check inventory int available = playerItems.getAmount(type.getItem()); if (available == 0) { diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index d540dc13..0f32db4d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -61,7 +61,7 @@ public static float getDamageApplied(Reinforcement reinforcement) { if (!reinforcement.isMature()) { double timeExisted = System.currentTimeMillis() - reinforcement.getCreationTime(); double progress = timeExisted / reinforcement.getType().getMaturationTime(); - damageAmount /= (1.0 - progress); + damageAmount /= progress; damageAmount *= reinforcement.getType().getMaturationScale(); } long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); From 7e5d0d81344d8fa063c263f61bee4708aac04781 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 24 Apr 2020 04:30:16 +0200 Subject: [PATCH 176/255] Add settings to configure cto further --- .../vg/civcraft/mc/citadel/command/Off.java | 10 ++++++++++ .../citadel/model/CitadelSettingManager.java | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Off.java b/src/main/java/vg/civcraft/mc/citadel/command/Off.java index 26381980..6b70940c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Off.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Off.java @@ -2,11 +2,13 @@ import java.util.ArrayList; import java.util.List; +import java.util.UUID; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.model.CitadelSettingManager; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; @@ -16,6 +18,14 @@ public class Off extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Citadel.getInstance().getStateManager().setState((Player) sender, null); + CitadelSettingManager settings = Citadel.getInstance().getSettingManager(); + UUID uuid = ((Player) sender).getUniqueId(); + if (settings.getInformationMode().getValue(uuid) && settings.shouldCtoDisableCti(uuid)) { + settings.getInformationMode().setValue(uuid, false); + } + if (settings.getBypass().getValue(uuid) && settings.shouldCtoDisableCtb(uuid)) { + settings.getBypass().setValue(uuid, false); + } return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index 90748f04..b4214e37 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -30,6 +30,8 @@ public class CitadelSettingManager { private BooleanSetting showChatMsgInCti; private BooleanSetting showHologramInCti; private BooleanSetting easyMode; + private BooleanSetting ctoDisableCti; + private BooleanSetting ctoDisableCtb; private BoundedIntegerSetting hologramDuration; @@ -74,6 +76,14 @@ public BooleanSetting getEasyMode() { public boolean shouldShowChatInCti(UUID uuid) { return showChatMsgInCti.getValue(uuid); } + + public boolean shouldCtoDisableCti(UUID uuid) { + return ctoDisableCti.getValue(uuid); + } + + public boolean shouldCtoDisableCtb(UUID uuid) { + return ctoDisableCtb.getValue(uuid); + } public boolean shouldShowHologramInCti(UUID uuid) { return showHologramInCti.getValue(uuid); @@ -128,6 +138,14 @@ void initSettings() { , "citadelReinModeDisplayLocation", new ItemStack(Material.NETHER_STAR), "Citadel mode"); PlayerSettingAPI.registerSetting(modeLocationSetting, menu); + ctoDisableCtb = new BooleanSetting(Citadel.getInstance(), false, "/cto disable /ctb", + "citadelCtoDisableCtb", "Should /cto disable Bypass mode (/ctb)"); + PlayerSettingAPI.registerSetting(ctoDisableCtb, menu); + + ctoDisableCti = new BooleanSetting(Citadel.getInstance(), true, "/cto disable /cti", + "citadelCtoDisableCti", "Should /cto disable Information mode (/cti)"); + PlayerSettingAPI.registerSetting(ctoDisableCti, menu); + MenuSection commandSection = menu.createMenuSection("Command replies", "Allows configuring the replies received when interacting with reinforcements or Citadel commands. For advanced users only"); From ca3368b2e1cbdd471ab2c799b8423e307417f9b1 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 25 Apr 2020 01:08:12 +0200 Subject: [PATCH 177/255] Beds use legacy data --- .../java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 0f32db4d..da6f72d5 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -5,10 +5,10 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.type.Bed; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.material.Bed; import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDestructionEvent; @@ -160,8 +160,8 @@ public static Block getResponsibleBlock(Block block) { case RED_BED: case YELLOW_BED: Bed bed = (Bed) block.getBlockData(); - if (bed.getPart() == Bed.Part.HEAD) { - return block.getRelative(((Bed) block.getState().getData()).getFacing().getOppositeFace()); + if (bed.isHeadOfBed()) { + return block.getRelative(bed.getFacing().getOppositeFace()); } return block; default: From cd654df259317794fb8217668c7fe51ca10d019e Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 25 Apr 2020 01:56:12 +0200 Subject: [PATCH 178/255] Try to fix bed shit --- .../mc/citadel/ReinforcementLogic.java | 15 ++++---- .../mc/citadel/listener/BlockListener.java | 35 +++++++++---------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index da6f72d5..82b9e814 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -18,8 +18,9 @@ import vg.civcraft.mc.namelayer.group.Group; public final class ReinforcementLogic { - - private ReinforcementLogic() {} + + private ReinforcementLogic() { + } public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); @@ -159,9 +160,11 @@ public static Block getResponsibleBlock(Block block) { case LIGHT_BLUE_BED: case RED_BED: case YELLOW_BED: - Bed bed = (Bed) block.getBlockData(); - if (bed.isHeadOfBed()) { - return block.getRelative(bed.getFacing().getOppositeFace()); + if (block.getBlockData() instanceof Bed) { + Bed bed = (Bed) block.getBlockData(); + if (bed.isHeadOfBed()) { + return block.getRelative(bed.getFacing().getOppositeFace()); + } } return block; default: @@ -174,7 +177,7 @@ public static Block getResponsibleBlock(Block block) { * the player can not access due to missing perms * * @param player the player attempting to access stuff - * @param block Block to check for + * @param block Block to check for * @return True if the player can not do something like placing an adjacent * chest or comparator, false otherwise */ diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 954c2f1d..8de46770 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -36,9 +36,9 @@ public class BlockListener implements Listener { private static final Material matfire = Material.FIRE; - + private DoubleInteractFixer interactFixer; - + public BlockListener(Citadel plugin) { this.interactFixer = new DoubleInteractFixer(plugin); } @@ -128,8 +128,7 @@ public void interact(PlayerInteractEvent pie) { if (interactFixer.checkInteracted(pie.getPlayer(), pie.getClickedBlock())) { return; } - } - else if (pie.getAction() != Action.LEFT_CLICK_BLOCK) { + } else if (pie.getAction() != Action.LEFT_CLICK_BLOCK) { return; } Citadel.getInstance().getStateManager().getState(pie.getPlayer()).handleInteractBlock(pie); @@ -232,7 +231,7 @@ public void removeReinforcedAir(BlockPlaceEvent e) { rein.setHealth(-1); } } - + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventStrippingLogs(PlayerInteractEvent pie) { if (!pie.hasBlock()) { @@ -253,8 +252,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { Player p = pie.getPlayer(); if (hand == EquipmentSlot.HAND) { relevant = p.getInventory().getItemInMainHand(); - } - else { + } else { relevant = p.getInventory().getItemInOffHand(); } if (!ToolAPI.isAxe(relevant.getType())) { @@ -269,7 +267,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { pie.setCancelled(true); } } - + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventTilingGrass(PlayerInteractEvent pie) { if (!pie.hasBlock()) { @@ -290,8 +288,7 @@ public void preventTilingGrass(PlayerInteractEvent pie) { Player p = pie.getPlayer(); if (hand == EquipmentSlot.HAND) { relevant = p.getInventory().getItemInMainHand(); - } - else { + } else { relevant = p.getInventory().getItemInOffHand(); } if (!ToolAPI.isShovel(relevant.getType())) { @@ -329,8 +326,7 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { Player p = pie.getPlayer(); if (hand == EquipmentSlot.HAND) { relevant = p.getInventory().getItemInMainHand(); - } - else { + } else { relevant = p.getInventory().getItemInOffHand(); } if (!ToolAPI.isHoe(relevant.getType())) { @@ -354,17 +350,18 @@ public void openBeacon(PlayerInteractEvent pie) { if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } + if (pie.getClickedBlock().getType() != Material.BEACON) { + return; + } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(pie.getClickedBlock()); if (rein == null) { return; } - if (pie.getClickedBlock().getType() == Material.BEACON) { - if (!rein.hasPermission(pie.getPlayer(), CitadelPermissionHandler.getBeacon())) { - pie.setCancelled(true); - String msg = String.format("%s is locked with %s%s", pie.getClickedBlock().getType().name(), - ChatColor.AQUA, rein.getType().getName()); - CitadelUtility.sendAndLog(pie.getPlayer(), ChatColor.RED, msg); - } + if (!rein.hasPermission(pie.getPlayer(), CitadelPermissionHandler.getBeacon())) { + pie.setCancelled(true); + String msg = String.format("%s is locked with %s%s", pie.getClickedBlock().getType().name(), ChatColor.AQUA, + rein.getType().getName()); + CitadelUtility.sendAndLog(pie.getPlayer(), ChatColor.RED, msg); } } } From 343987be8d2063ed9d5087eb9a8ba8fcf80164fd Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 25 Apr 2020 02:02:51 +0200 Subject: [PATCH 179/255] =?UTF-8?q?Ignore=20air=20in=20acid=20raytrace?= =?UTF-8?q?=C2=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vg/civcraft/mc/citadel/command/Acid.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 022f45ed..2f91082e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -22,6 +22,7 @@ import vg.civcraft.mc.citadel.events.ReinforcementAcidBlockedEvent; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.MaterialAPI; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.civmodcore.util.TextUtil; @@ -36,6 +37,9 @@ public boolean execute(CommandSender sender, String[] args) { AcidManager acidMan = Citadel.getInstance().getAcidManager(); while (itr.hasNext()) { Block block = itr.next(); + if (MaterialAPI.isAir(block.getType())) { + continue; + } if (!acidMan.isPossibleAcidBlock(block)) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); return true; @@ -57,7 +61,7 @@ public boolean execute(CommandSender sender, String[] args) { return true; } Block topFace = block.getRelative(BlockFace.UP); - if (Material.AIR.equals(topFace.getType())) { + if (MaterialAPI.isAir(topFace.getType())) { CitadelUtility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); return true; } From 01bb8eae2cdc0fdfaf7315415dc7bfd507c8265d Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 25 Apr 2020 03:31:15 +0200 Subject: [PATCH 180/255] Properly prevent gm1 cti --- src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java index 9b4d56d4..3f749cee 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java @@ -209,7 +209,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { } return; } - if (player.getGameMode() == GameMode.CREATIVE) { + if (player.getGameMode() == GameMode.CREATIVE && e.getAction() == Action.LEFT_CLICK_BLOCK) { e.setCancelled(true); } boolean showHolo = settingMan.shouldShowHologramInCti(player.getUniqueId()); From 6f833126c117ff5160f53fc79ff032163b3e1b5f Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 25 Apr 2020 18:12:43 +0200 Subject: [PATCH 181/255] Fix breaking reinforcements without group --- .../vg/civcraft/mc/citadel/CitadelConfigManager.java | 3 ++- .../vg/civcraft/mc/citadel/ReinforcementLogic.java | 9 +++++++-- .../citadel/reinforcementtypes/ReinforcementType.java | 11 ++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index e7d16455..1803dcd2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -164,6 +164,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { long decayTimer = ConfigParsing .parseTime(config.getString("decay_timer", String.valueOf(globalDecayTimer / 1000L) + "s")); double decayMultiplier = config.getDouble("decay_multiplier", globalDecayMultiplier); + double multiplerOnDeletedGroup = config.getDouble("deleted_group_multipler", 4); int legacyId = config.getInt("legacy_id", -1); if (name == null) { logger.warning("No name specified for reinforcement type at " + config.getCurrentPath()); @@ -184,7 +185,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + gracePeriod + ", id: " + id); return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, creationEffect, damageEffect, destructionEffect, reinforceables, nonReinforceables, id, name, - globalBlackList, decayTimer, decayMultiplier, legacyId); + globalBlackList, decayTimer, decayMultiplier, multiplerOnDeletedGroup, legacyId); } private void parseReinforcementTypes(ConfigurationSection config) { diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 82b9e814..2e51ca18 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -65,8 +65,13 @@ public static float getDamageApplied(Reinforcement reinforcement) { damageAmount /= progress; damageAmount *= reinforcement.getType().getMaturationScale(); } - long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); - damageAmount *= reinforcement.getType().getDecayDamageMultipler(lastRefresh); + if (reinforcement.getGroup() != null) { + long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); + damageAmount *= reinforcement.getType().getDecayDamageMultipler(lastRefresh); + } + else { + damageAmount *= reinforcement.getType().getDeletedGroupMultiplier(); + } return damageAmount; } diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 8d729bb4..22495c39 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -26,13 +26,14 @@ public class ReinforcementType { private String name; private long decayTimer; private double decayMultiplier; + private double deletedGroupMulitplier; private int legacyId; public ReinforcementType(float health, double returnChance, ItemStack item, long maturationTime, long acidTime, double scale, long gracePeriod, ReinforcementEffect creationEffect, ReinforcementEffect damageEffect, ReinforcementEffect destructionEffect, Collection allowsReinforceables, Collection disallowedReinforceables, short id, String name, Collection globalBlackList, - long decayTimer, double decayMultiplier, int legacyId) { + long decayTimer, double decayMultiplier, double deletedGroupMulitplier, int legacyId) { this.health = health; this.name = name; this.returnChance = returnChance; @@ -44,6 +45,7 @@ public ReinforcementType(float health, double returnChance, ItemStack item, long this.damageEffect = damageEffect; this.destructionEffect = destructionEffect; this.gracePeriod = gracePeriod; + this.deletedGroupMulitplier = deletedGroupMulitplier; if (allowsReinforceables != null) { this.allowedReinforceables = new TreeSet<>(allowsReinforceables); } else { @@ -101,6 +103,13 @@ public float getHealth() { public short getID() { return id; } + + /** + * @return Damage multiplier applied if the owning group was deleted + */ + public double getDeletedGroupMultiplier() { + return deletedGroupMulitplier; + } /** * @return Item used to create instance of this item From 4324cbf10af70475e8c87eb02eaedbd95097066b Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 27 Apr 2020 16:27:08 +0200 Subject: [PATCH 182/255] Also prep block belock pressure plate for redstone --- .../java/vg/civcraft/mc/citadel/listener/RedstoneListener.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 2d0311b8..1f1d9a43 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -192,6 +192,8 @@ public void stepPressurePlate(PlayerInteractEvent e) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); + //block below + setupAdjacentDoors(e.getPlayer(), e.getClickedBlock().getRelative(BlockFace.DOWN), BlockFace.UP); } } From 11b989deb19f8fe1fcc14f8df291090987e31508 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 27 Apr 2020 16:32:35 +0200 Subject: [PATCH 183/255] Cap maximum rein health --- src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 2e51ca18..e8d4c653 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -45,6 +45,7 @@ public static void damageReinforcement(Reinforcement rein, float damage, Entity return; } } + futureHealth = Math.min(futureHealth, rein.getType().getHealth()); rein.setHealth(futureHealth); if (rein.isBroken()) { if (rein.getType().getDestructionEffect() != null) { From aeb4c8a31aecd741fb3f09a9e681b6289da95bb3 Mon Sep 17 00:00:00 2001 From: Cola Date: Sun, 3 May 2020 23:28:19 +0100 Subject: [PATCH 184/255] Fix Acid blocks Add isSolid check to iterator Return acid block reinforcement material --- .../vg/civcraft/mc/citadel/command/Acid.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 2f91082e..06d62930 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -1,20 +1,12 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.BlockIterator; - import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; @@ -27,6 +19,12 @@ import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.civmodcore.util.TextUtil; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; + @CivCommand(id = "ctacid") public class Acid extends StandaloneCommand { @@ -37,7 +35,7 @@ public boolean execute(CommandSender sender, String[] args) { AcidManager acidMan = Citadel.getInstance().getAcidManager(); while (itr.hasNext()) { Block block = itr.next(); - if (MaterialAPI.isAir(block.getType())) { + if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid())) { continue; } if (!acidMan.isPossibleAcidBlock(block)) { @@ -93,6 +91,7 @@ public boolean execute(CommandSender sender, String[] args) { // play particles for top block ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); + p.getWorld().dropItemNaturally(reinforcement.getLocation(), reinforcement.getType().getItem()); topFace.breakNaturally(); } return true; From 3332c725d4653b33d9f111dd068f5f7b1e246b1a Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 5 May 2020 22:18:59 +0200 Subject: [PATCH 185/255] Properly allow crop bypass --- .../citadel/playerstate/AbstractPlayerState.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 06f36a48..1b00394f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -44,6 +44,14 @@ public void handleBreakBlock(BlockBreakEvent e) { // no reinforcement, normal break which we dont care about return; } + if (CitadelUtility.isPlant(e.getBlock())) { + if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getCrops()) + && !e.getBlock().getLocation().equals(rein.getLocation())) { + // allow, because player has crop permission and the only reinforcement + // protecting is in the soil + return; + } + } boolean hasAccess = rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass()); BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); boolean hasByPass = setting.getValue(e.getPlayer()); @@ -60,14 +68,6 @@ public void handleBreakBlock(BlockBreakEvent e) { rein.setHealth(-1); return; } - if (CitadelUtility.isPlant(e.getBlock())) { - if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getCrops()) - && !e.getBlock().getLocation().equals(rein.getLocation())) { - // allow, because player has crop permission and the only reinforcement - // protecting is in the soil - return; - } - } if (hasAccess) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.GREEN, "You could bypass this reinforcement " + "if you turn bypass mode on with '/ctb'"); From cd8a44d37439b06650f41798241579affddeb72b Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 6 May 2020 00:45:56 +0200 Subject: [PATCH 186/255] Implement cte by hitting stuff --- .../mc/citadel/playerstate/NormalState.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 7fd7e31e..830a4968 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -1,11 +1,14 @@ package vg.civcraft.mc.citadel.playerstate; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; @@ -16,12 +19,11 @@ public class NormalState extends AbstractPlayerState { public NormalState(Player p) { super(p); - // TODO Auto-generated constructor stub } @Override public String getName() { - return "Normal mode"; + return ChatColor.GREEN + "Normal mode"; } @Override @@ -45,7 +47,24 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { - + if (e.getAction() != Action.LEFT_CLICK_BLOCK && e.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Player player = e.getPlayer(); + if (!Citadel.getInstance().getSettingManager().isInEasyMode(player.getUniqueId())) { + return; + } + ItemStack hand = player.getInventory().getItemInMainHand(); + ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(hand); + if (type == null) { + return; + } + String defaultGroupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); + Group defaultGroup = GroupManager.getGroup(defaultGroupName); + if (defaultGroup == null) { + return; + } + CitadelUtility.attemptReinforcementCreation(e.getClickedBlock(), type, defaultGroup, player); } @Override From ce43dd5d67b6caf7c7ae9e4fb3f1576d610af9fd Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 17 May 2020 00:20:01 +0200 Subject: [PATCH 187/255] Fix reinforced redstone activation for buttons mounted to floor or ceiling --- .../mc/citadel/CitadelConfigManager.java | 11 -------- .../citadel/listener/InventoryListener.java | 1 + .../mc/citadel/listener/RedstoneListener.java | 27 ++++++++++++++----- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index 1803dcd2..ec786540 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -129,17 +129,6 @@ protected boolean parseInternal(ConfigurationSection config) { return true; } - private List parseMaterialList(ConfigurationSection config, String key) { - return parseList(config, key, s -> { - try { - return Material.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - logger.warning("Failed to parse " + s + " as material at " + config.getCurrentPath()); - return null; - } - }); - } - private ReinforcementType parseReinforcementType(ConfigurationSection config) { if (!config.isItemStack("item")) { logger.warning( diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 98771133..1b33d165 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -35,6 +35,7 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { } return; } + //destRein is for sure not null at this point if (sourceRein == null) { if (!destRein.isInsecure()) { event.setCancelled(true); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 1f1d9a43..0cb3773b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -97,7 +97,23 @@ public void pressButton(PlayerInteractEvent e) { } Switch button = (Switch) (e.getClickedBlock().getBlockData()); Block buttonBlock = e.getClickedBlock(); - Block attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); + Block attachedBlock; + // needs special handling because buttons attached to ceiling and ground can be + // turned in which case the facing direction indicates this direction + switch (button.getFace()) { + case CEILING: + attachedBlock = e.getClickedBlock().getRelative(BlockFace.UP); + break; + case FLOOR: + attachedBlock = e.getClickedBlock().getRelative(BlockFace.DOWN); + break; + case WALL: + attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); + break; + default: + Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getFace()); + return; + } // prepare all sides of button itself setupAdjacentDoors(e.getPlayer(), buttonBlock, button.getFacing().getOppositeFace()); // prepare all sides of the block attached to @@ -120,7 +136,7 @@ public void redstonePower(BlockRedstoneEvent bre) { return; } if (blockData instanceof Door) { - //we always store the activation for the lower half of a door + // we always store the activation for the lower half of a door Door door = (Door) blockData; if (door.getHalf() == Bisected.Half.TOP) { block = block.getRelative(BlockFace.DOWN); @@ -153,7 +169,7 @@ public void redstonePower(BlockRedstoneEvent bre) { } private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { - for (Entry entry : BlockAPI.getAllSidesMapped(block).entrySet()) { + for (Entry entry : BlockAPI.getAllSidesMapped(block).entrySet()) { if (entry.getKey() == skip) { continue; } @@ -168,8 +184,7 @@ private void setupAdjacentDoors(Player player, Block block, BlockFace skip) { if (door.getHalf() == Bisected.Half.TOP) { // block is upper half of a door locationToSave = rel.getRelative(BlockFace.DOWN).getLocation(); - } - else { + } else { // already the lower half of the door locationToSave = rel.getLocation(); } @@ -192,7 +207,7 @@ public void stepPressurePlate(PlayerInteractEvent e) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); - //block below + // block below setupAdjacentDoors(e.getPlayer(), e.getClickedBlock().getRelative(BlockFace.DOWN), BlockFace.UP); } From 969c49a1467237cd16ced2ec926ca46b41cff483 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 21 May 2020 22:33:40 +0200 Subject: [PATCH 188/255] Properly resolve block remapping when reinforcing after placement --- pom.xml | 2 +- .../civcraft/mc/citadel/CitadelUtility.java | 47 +------------------ .../playerstate/AbstractPlayerState.java | 3 +- .../citadel/playerstate/ReinforcingState.java | 14 +++--- 4 files changed, 12 insertions(+), 54 deletions(-) diff --git a/pom.xml b/pom.xml index 05efac47..75d5cf01 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ vg.civcraft.mc.civmodcore CivModCore - 1.7.8 + 1.7.9 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index ce1c5792..7e0e3d08 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -2,14 +2,10 @@ import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; @@ -27,48 +23,6 @@ public class CitadelUtility { private CitadelUtility() { } - /** - * Overload for dropItemAtLocation(Location l, ItemStack is) that accepts a - * block parameter. - * - * @param b The block to drop it at - * @param is The item to drop - * - * @author GordonFreemanQ - */ - public static void dropItemAtLocation(Block b, ItemStack is) { - if (b == null) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Utility dropItemAtLocation block called with null"); - return; - } - dropItemAtLocation(b.getLocation(), is); - } - - /** - * A better version of dropNaturally that mimics normal drop behavior. - * - * The built-in version of Bukkit's dropItem() method places the item at the - * block vertex which can make the item jump around. This method places the item - * in the middle of the block location with a slight vertical velocity to mimic - * how normal broken blocks appear. - * - * @param l The location to drop the item - * @param is The item to drop - * - * @author GordonFreemanQ - */ - public static void dropItemAtLocation(final Location l, final ItemStack is) { - // Schedule the item to drop 1 tick later - Bukkit.getScheduler().scheduleSyncDelayedTask(Citadel.getInstance(), () -> { - try { - l.getWorld().dropItem(l.add(0.5, 0.5, 0.5), is).setVelocity(new Vector(0, 0.05, 0)); - } catch (Exception e) { - Citadel.getInstance().getLogger().log(Level.WARNING, "Utility dropItemAtLocation called but errored: ", - e); - } - }, 1); - } - public static boolean isPlant(Block plant) { switch (plant.getType()) { case DANDELION: @@ -149,6 +103,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp Citadel.getInstance().getStateManager().setState(player, null); return true; } + block = ReinforcementLogic.getResponsibleBlock(block); // check if reinforcement already exists Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); if (rein != null) { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 1b00394f..3a97dc91 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -22,6 +22,7 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.util.DelayedItemDrop; public abstract class AbstractPlayerState { @@ -93,7 +94,7 @@ public void handleBreakBlock(BlockBreakEvent e) { protected static void giveReinforcement(Location location, Player p, ReinforcementType type) { HashMap notAdded = p.getInventory().addItem(type.getItem().clone()); if (!notAdded.isEmpty()) { - CitadelUtility.dropItemAtLocation(location, type.getItem().clone()); + DelayedItemDrop.dropAt(location, type.getItem().clone()); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 5a705fae..81728f5c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -2,6 +2,7 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -63,10 +64,11 @@ public void handleInteractBlock(PlayerInteractEvent e) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); return; } + Block block = ReinforcementLogic.getResponsibleBlock(e.getClickedBlock()); // can the item reinforce the clicked block - if (!type.canBeReinforced(e.getClickedBlock().getType())) { + if (!type.canBeReinforced(block.getType())) { CitadelUtility.sendAndLog(player, ChatColor.RED, - type.getName() + " can not reinforce " + e.getClickedBlock().getType()); + type.getName() + " can not reinforce " + block.getType()); return; } // does the player have permission to reinforce on that group @@ -77,7 +79,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); return; } - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(e.getClickedBlock()); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); // if reinforcement exists, check if player has permission to edit it if (rein != null) { if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass())) { @@ -105,11 +107,11 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (Citadel.getInstance().getConfigManager().logCreation()) { Citadel.getInstance().getLogger() .info(player.getName() + " created reinforcement with " + type.getName() + " for " - + e.getClickedBlock().getType().toString() + " at " - + e.getClickedBlock().getLocation().toString()); + + block.getType().toString() + " at " + + block.getLocation().toString()); } // just create new reinforcement - ReinforcementLogic.createReinforcement(player, e.getClickedBlock(), type, group); + ReinforcementLogic.createReinforcement(player, block, type, group); } else { // replace existing one boolean changedGroup = false; From 2144b08e57ca61fef9a30c5e449994740cd7943e Mon Sep 17 00:00:00 2001 From: Cola Date: Fri, 22 May 2020 06:40:58 +0100 Subject: [PATCH 189/255] Fix resolveDoubleChestReinforcement #26 --- .../vg/civcraft/mc/citadel/ReinforcementLogic.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index e8d4c653..174617bd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -210,15 +210,11 @@ public static Reinforcement resolveDoubleChestReinforcement(Block block) { if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { return rein; } - for (Block relative : BlockAPI.getPlanarSides(block)) { - if (relative.getType() != mat) { - continue; - } - rein = getReinforcementAt(relative.getLocation()); - if (rein != null) { - return rein; - } + + Block otherHalf = BlockAPI.getOtherDoubleChestBlock(block); + if (otherHalf == null) { + return null; } - return null; + return rein = getReinforcementAt(otherHalf.getLocation()); } } From deb37ce74605aa5abfc81791a7cc569a85bf14a6 Mon Sep 17 00:00:00 2001 From: Cola Date: Fri, 22 May 2020 07:03:58 +0100 Subject: [PATCH 190/255] Remove rein --- src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 174617bd..a6b6d111 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -215,6 +215,6 @@ public static Reinforcement resolveDoubleChestReinforcement(Block block) { if (otherHalf == null) { return null; } - return rein = getReinforcementAt(otherHalf.getLocation()); + return getReinforcementAt(otherHalf.getLocation()); } } From 84fc42298621667e0435e7a67012e3c883594458 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 04:58:56 +0200 Subject: [PATCH 191/255] Add Jenkinsfile --- Jenkinsfile | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 00000000..45aa47d8 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,35 @@ +pipeline { + agent any + tools { + maven 'Maven 3.6.3' + jdk 'Java 8' + } + stages { + stage ('Build') { + steps { + sh 'mvn -U clean install deploy -P civ-jenkins' + } + } + stage ('Trigger cascading builds') { + when { + expression { + env.BRANCH_NAME == 'master' + } + } + steps { + build '../FactoryMod/master' + build '../JukeAlert/master' + build '../RailSwitch/master' + build '../SimpleAdminHacks/master' + build '../Bastion/master' + } + } + } + post { + always { + withCredentials([string(credentialsId: 'civclassic-discord-webhook', variable: 'DISCORD_WEBHOOK')]) { + discordSend description: "**Build:** [${currentBuild.id}](${env.BUILD_URL})\n**Status:** [${currentBuild.currentResult}](${env.BUILD_URL})\n", footer: 'Civclassic Jenkins', link: env.BUILD_URL, successful: currentBuild.resultIsBetterOrEqualTo('SUCCESS'), title: "${env.JOB_NAME} #${currentBuild.id}", webhookURL: DISCORD_WEBHOOK + } + } + } +} From 959712e0804c15db4b0103be00c5895774f62ae8 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 05:00:31 +0200 Subject: [PATCH 192/255] Use parent in pom --- pom.xml | 48 ++++++++++-------------------------------------- 1 file changed, 10 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 75d5cf01..0a08de48 100644 --- a/pom.xml +++ b/pom.xml @@ -3,43 +3,20 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + + com.github.civclassic + civclassic-parent + 1.0.0 + + vg.civcraft.mc.citadel Citadel jar 4.0.2 Citadel - https://github.com/Devotedmc/Citadel + https://github.com/civclassic/Citadel - - - - - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - - - - - - - - ${basedir}/src/main/resources - - *.yml - - true - - - ${basedir} - - LICENSE.txt - - - - @@ -65,21 +42,16 @@ 2.3.2 provided - - - spigot-repo - https://hub.spigotmc.org/nexus/content/groups/public/ - filoghost-repo https://ci.filoghost.me/plugin/repository/everything/ - devoted-repo - https://build.devotedmc.com/plugin/repository/everything/ + civ-jenkins + https://repo.civclassic.com/repository/internal/ From 52106f3d3ed89d8f01a65322b40165218c945753 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 05:14:37 +0200 Subject: [PATCH 193/255] Use updated holo repo --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 0a08de48..cf127c90 100644 --- a/pom.xml +++ b/pom.xml @@ -46,8 +46,8 @@ - filoghost-repo - https://ci.filoghost.me/plugin/repository/everything/ + codemc-repo + https://repo.codemc.io/repository/maven-public/ civ-jenkins From 8ed6e6cfdc13faede5c32f364df8f1b055c5b070 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 05:20:53 +0200 Subject: [PATCH 194/255] Make spigot provided --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index cf127c90..1e066e5b 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ org.spigotmc spigot-api 1.14.4-R0.1-SNAPSHOT + provided vg.civcraft.mc.civmodcore From d15ee460d7d74d181524e7d077b7a7c3af39a5bd Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 05:23:49 +0200 Subject: [PATCH 195/255] Fix javadoc --- src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java index e69696c0..eac8dca9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -32,7 +32,7 @@ public Reinforcement getReinforcement(Location location) { /** * Gets the reinforcement for the given block if one exists * - * @param location Block to get reinforcement for + * @param block Block to get reinforcement for * @return Reinforcement for the block or null if no reinforcement exists there */ public Reinforcement getReinforcement(Block block) { From 2d3533efe3bd2a8f1b1b6fa745f9ca395b933757 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 05:26:19 +0200 Subject: [PATCH 196/255] Fix more javadoc --- .../mc/citadel/reinforcementtypes/ReinforcementType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 22495c39..92491b82 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -174,7 +174,7 @@ public double getReturnChance() { } /** - * Material id the material used for the reinforcement had pre-flattening (<= 1.12.2). Needed once for + * Material id the material used for the reinforcement had pre-flattening (1.12.2 or earlier). Needed once for * proper migration of reinforcements to higher versions * @return Old item id of the reinforcement item */ From ee2a1720c71583413fff6e2f30cf1eb8f2148be9 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 29 May 2020 06:58:26 +0200 Subject: [PATCH 197/255] Trigger cascading build non-blocking --- Jenkinsfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 45aa47d8..398580ff 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -17,11 +17,11 @@ pipeline { } } steps { - build '../FactoryMod/master' - build '../JukeAlert/master' - build '../RailSwitch/master' - build '../SimpleAdminHacks/master' - build '../Bastion/master' + build job: '../FactoryMod/master', wait: false + build job: '../JukeAlert/master', wait: false + build job: '../RailSwitch/master', wait: false + build job: '../SimpleAdminHacks/master', wait: false + build job: '../Bastion/master', wait: false } } } From ac3e848070376124d247c8cbdbb288ae22eae968 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 8 Jun 2020 18:44:09 +0200 Subject: [PATCH 198/255] Tie refresh to bypass --- .../java/vg/civcraft/mc/citadel/listener/EntityListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index bf83f29c..e5c71510 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -21,6 +21,7 @@ import org.bukkit.scheduler.BukkitRunnable; import vg.civcraft.mc.citadel.Citadel; +import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.namelayer.GroupManager; @@ -103,7 +104,7 @@ public void run() { GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); for (String groupName : db.getGroupNames(uuid)) { if (NameAPI.getGroupManager().hasAccess(groupName, uuid, - PermissionType.getPermission("REINFORCE"))) { + CitadelPermissionHandler.getBypass())) { GroupManager.getGroup(groupName).updateActivityTimeStamp(); } } From 8eeb9fda6526ee82736b55769ecee026d3751f78 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 8 Jun 2020 18:49:26 +0200 Subject: [PATCH 199/255] Lookup reinforcement again if broken to make double chest protection work again --- .../citadel/playerstate/AbstractPlayerState.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 3a97dc91..4bf0e50c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -83,9 +83,14 @@ public void handleBreakBlock(BlockBreakEvent e) { damage = dre.getDamageDone(); ReinforcementLogic.damageReinforcement(rein, damage, e.getPlayer()); if (rein.getHealth() <= 0) { - e.setCancelled(false); - ReinforcedBlockBreak rbbe = new ReinforcedBlockBreak(e.getPlayer(), rein, e); - Bukkit.getPluginManager().callEvent(rbbe); + // in the case of double chests or similar there might now be another rein + // protecting this block + Reinforcement backupRein = ReinforcementLogic.getReinforcementProtecting(e.getBlock()); + if (backupRein == null) { + e.setCancelled(false); + ReinforcedBlockBreak rbbe = new ReinforcedBlockBreak(e.getPlayer(), rein, e); + Bukkit.getPluginManager().callEvent(rbbe); + } } } @@ -97,9 +102,9 @@ protected static void giveReinforcement(Location location, Player p, Reinforceme DelayedItemDrop.dropAt(location, type.getItem().clone()); } } - + public abstract String getOverlayText(); - + @Override public abstract boolean equals(Object o); From 0771c2a7785a04508b52e5eeb92c744a7390c64f Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 8 Jun 2020 18:53:42 +0200 Subject: [PATCH 200/255] Add check to ensure no reinforcements can be created with the last remaing block --- src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 7e0e3d08..a4f70ed3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -121,7 +121,12 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp } // check inventory int available = playerItems.getAmount(type.getItem()); - if (available == 0) { + int required = type.getItem().getAmount(); + if (block.getType() == type.getItem().getType()) { + //make sure they're not trying to reinforce with the single block thats also being placed + required++; + } + if (available < required) { Citadel.getInstance().getStateManager().setState(player, null); CitadelUtility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); return true; From 24d72f2c41ab9c2635d411168b7cec9ea638bd5a Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 11 Jun 2020 04:07:24 +0100 Subject: [PATCH 201/255] Fixed reinforced gravity block issue When a block breaks below a reinforced block with gravity, such as with gravel or sand, it would not only create a ghost block, but also tick damage on the reinforcement. This change fixes both of those issues. --- .../mc/citadel/listener/EntityListener.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index e5c71510..020580bb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -8,6 +8,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -17,6 +18,7 @@ import org.bukkit.event.entity.EntityBreakDoorEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.scheduler.BukkitRunnable; @@ -45,15 +47,37 @@ public void breakDoor(EntityBreakDoorEvent ebde) { } } + // For some ungodly reason, when you break a block below a block with gravity, it spawns a FallingBlock entity + // that then attempts to change the block. To prevent this change from ticking damage and creating a ghost block + // the entity needs to have its gravity disabled so it immediately lands. + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onFallingBlockSpawn(EntitySpawnEvent event) { + if (event.getEntityType() != EntityType.FALLING_BLOCK) { + return; + } + Block block = event.getLocation().getBlock(); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + if (rein == null) { + return; + } + Entity entity = event.getEntity(); + entity.setGravity(false); + event.setCancelled(true); + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void changeBlock(EntityChangeBlockEvent ecbe) { - Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(ecbe.getBlock()); - if (rein != null) { - ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), ecbe.getEntity()); - if (!rein.isBroken()) { - ecbe.setCancelled(true); - } + Block block = ecbe.getBlock(); + Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); + // Do not allow a falling block entity to damage reinforcements. + if (rein == null || ecbe.getEntityType() == EntityType.FALLING_BLOCK) { + return; + } + ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), ecbe.getEntity()); + if (rein.isBroken()) { + return; } + ecbe.setCancelled(true); } // apply explosion damage to reinforcements From 12fcdce0be9c81a04a1b4073daa1be59ca2a20e4 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sat, 27 Jun 2020 13:12:52 +0200 Subject: [PATCH 202/255] . --- src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 7936d6cd..32eaa72e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -166,7 +166,9 @@ public void setGroup(Group group) { public void setHealth(float health) { this.health = health; if (health <= 0) { - getOwningCache().remove(this); + if (getOwningCache() != null) { + getOwningCache().remove(this); + } } else { setDirty(); From 2fafa17e2c52eb12846b15d798369cebe5025542 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 27 Jun 2020 15:44:43 +0100 Subject: [PATCH 203/255] Re-added protected Item Frames (and other hanging entities) :D --- .../mc/citadel/CitadelConfigManager.java | 7 + .../mc/citadel/CitadelPermissionHandler.java | 21 +++ .../mc/citadel/listener/EntityListener.java | 145 ++++++++++++++++++ src/main/resources/config.yml | 3 + 4 files changed, 176 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index ec786540..a31a33a7 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -36,6 +36,8 @@ public class CitadelConfigManager extends CoreConfigManager { private double redstoneRange; + private boolean hangersInheritReinforcements; + public CitadelConfigManager(ACivMod plugin) { super(plugin); } @@ -56,6 +58,10 @@ public double getMaxRedstoneDistance() { return redstoneRange; } + public boolean doHangersInheritReinforcements() { + return hangersInheritReinforcements; + } + private ReinforcementEffect getReinforcementEffect(ConfigurationSection config) { if (config == null) { return null; @@ -126,6 +132,7 @@ protected boolean parseInternal(ConfigurationSection config) { globalDecayMultiplier = config.getDouble("global_decay_multiplier", 2.0); globalDecayTimer = ConfigParsing.parseTime(config.getString("global_decay_timer", "0")); parseReinforcementTypes(config.getConfigurationSection("reinforcements")); + hangersInheritReinforcements = config.getBoolean("hangers_inherit_reinforcement", false); return true; } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index 74368eff..d6cac199 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -23,6 +23,9 @@ private CitadelPermissionHandler() { private static PermissionType repairPerm; private static PermissionType modifyBlockPerm; private static PermissionType beaconPerm; + private static PermissionType hangingPlaceBreak; + private static PermissionType itemFramePutTake; + private static PermissionType itemFrameRotate; public static void setup() { List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, @@ -50,6 +53,12 @@ public static void setup() { "Allows modifying reinforced blocks like flipping levers, strippling logs etc."); beaconPerm = PermissionType.registerPermission("BEACONS", new ArrayList<>(membersAndAbove), "Allow changing beacon effects"); + hangingPlaceBreak = PermissionType.registerPermission("HANGING_PLACE_BREAK", new ArrayList<>(membersAndAbove), + "Allows placing/breaking hanging entities on reinforced blocks."); + itemFramePutTake = PermissionType.registerPermission("ITEM_FRAME_PUT_TAKE", new ArrayList<>(membersAndAbove), + "Allows the placing/removal of items into/from Item Frames."); + itemFrameRotate = PermissionType.registerPermission("ITEM_FRAME_ROTATE", new ArrayList<>(membersAndAbove), + "Allows the rotation of items placed within Item Frames."); } public static PermissionType getModifyBlocks() { @@ -96,4 +105,16 @@ public static PermissionType getBeacon() { return beaconPerm; } + public static PermissionType getHangingPlaceBreak() { + return hangingPlaceBreak; + } + + public static PermissionType getItemFramePutTake() { + return itemFramePutTake; + } + + public static PermissionType getItemFrameRotate() { + return itemFrameRotate; + } + } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 020580bb..62750d30 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -1,15 +1,21 @@ package vg.civcraft.mc.citadel.listener; +import static vg.civcraft.mc.civmodcore.util.NullCoalescing.castOrNull; + import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Hanging; +import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -17,8 +23,12 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityBreakDoorEvent; import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.scheduler.BukkitRunnable; @@ -26,6 +36,7 @@ import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.ItemAPI; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; @@ -151,4 +162,138 @@ public void spawn(CreatureSpawnEvent cse) { } } } + + // ------------------------------------------------------------ + // Hanging Entities + // ------------------------------------------------------------ + + @EventHandler(priority = EventPriority.HIGHEST) + public void hangingPlaceEvent(HangingPlaceEvent event) { + if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { + return; + } + Player player = event.getPlayer(); + if (player == null) { + return; + } + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(event.getBlock()); + if (reinforcement == null) { + return; + } + if (reinforcement.isInsecure()) { + return; + } + if (reinforcement.hasPermission(player, CitadelPermissionHandler.getHangingPlaceBreak())) { + return; + } + player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have permissions for."); + event.setCancelled(true); + Bukkit.getScheduler().runTaskLater(Citadel.getInstance(), player::updateInventory, 1L); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { + if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { + return; + } + switch (event.getCause()) { + // Allow it to break if: + // 1) The host block broke + // 2) A block was placed over it + // 3) A plugin broke it + case OBSTRUCTION: + case PHYSICS: + case DEFAULT: + return; + case ENTITY: { + Player player = castOrNull(Player.class, event.getRemover()); + if (player == null) { + break; + } + Hanging entity = event.getEntity(); + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(host); + if (reinforcement == null) { + return; + } + if (reinforcement.isInsecure()) { + return; + } + if (reinforcement.hasPermission(player, CitadelPermissionHandler.getHangingPlaceBreak())) { + return; + } + player.sendMessage(ChatColor.RED + "The host block is protecting this."); + //break; + } + } + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void entityDamageEvent(EntityDamageByEntityEvent event) { + if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { + return; + } + Hanging entity = castOrNull(Hanging.class, event.getEntity()); + if (entity == null) { + return; + } + Player player = castOrNull(Player.class, event.getDamager()); + if (player == null) { + event.setCancelled(true); + return; + } + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(host); + if (reinforcement == null) { + return; + } + if (entity instanceof ItemFrame) { + if (ItemAPI.isValidItem(((ItemFrame) entity).getItem())) { + if (reinforcement.isInsecure()) { + return; + } + if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFramePutTake())) { + return; + } + } + } + player.sendMessage(ChatColor.RED + "The host block is protecting this."); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { + if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { + return; + } + Hanging entity = castOrNull(Hanging.class, event.getRightClicked()); + if (entity == null) { + return; + } + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(host); + if (reinforcement == null) { + return; + } + Player player = event.getPlayer(); + if (entity instanceof ItemFrame) { + if (reinforcement.isInsecure()) { + return; + } + // If the Item Frame already has an item, then the only possible action is rotation + if (ItemAPI.isValidItem(((ItemFrame) entity).getItem())) { + if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFrameRotate())) { + return; + } + } + // If the Item Frame is empty, then the only possible action is placement + if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFramePutTake())) { + return; + } + } + player.sendMessage(ChatColor.RED + "You do not have permission to alter that."); + event.setCancelled(true); + } + } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6eb4a878..857ed705 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -97,6 +97,9 @@ non_reinforceables: acidblock_material: - GOLD_BLOCK +# Determines whether hanging entities (such as Item Frames) can be protected by their host block +hangers_inherit_reinforcement: false + # reinforcement_damageMultiplier is m where BlockDamage = 2 ^ (n/m) where n is equal to the number of days the group has been inactive reinforcement_damageMultiplier: 365 #database: From 5697713167e797cd412f1043f5c731d1eddcfd2d Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 27 Jun 2020 15:45:28 +0100 Subject: [PATCH 204/255] Citadel :: now creates a default config --- src/main/java/vg/civcraft/mc/citadel/Citadel.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 08bfa48c..7d880b47 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -100,6 +100,7 @@ public void onEnable() { Bukkit.shutdown(); return; } + saveDefaultConfig(); config = new CitadelConfigManager(this); if (!config.parse()) { logger.severe("Errors in config file, shutting down"); From 30c2c1046c1355b05bcdc808e9234dfda194d7a2 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 27 Jun 2020 15:45:46 +0100 Subject: [PATCH 205/255] CitadelPermissionHandler :: fixed typo --- .../java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index d6cac199..656a9deb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -50,7 +50,7 @@ public static void setup() { insecurePerm = PermissionType.registerPermission("INSECURE_REINFORCEMENT", new ArrayList<>(membersAndAbove), "Allows toggling the insecure flag on reinforcements"); modifyBlockPerm = PermissionType.registerPermission("MODIFY_BLOCK", new ArrayList<>(modAndAbove), - "Allows modifying reinforced blocks like flipping levers, strippling logs etc."); + "Allows modifying reinforced blocks like flipping levers, stripping logs etc."); beaconPerm = PermissionType.registerPermission("BEACONS", new ArrayList<>(membersAndAbove), "Allow changing beacon effects"); hangingPlaceBreak = PermissionType.registerPermission("HANGING_PLACE_BREAK", new ArrayList<>(membersAndAbove), From 5f6d7379823a0bd1bfcb54abc0d1202c7ea6a30f Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 27 Jun 2020 15:46:05 +0100 Subject: [PATCH 206/255] EntityListener :: whitespace --- .../java/vg/civcraft/mc/citadel/listener/EntityListener.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 62750d30..8c92dce0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -6,7 +6,6 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; - import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -31,7 +30,6 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.scheduler.BukkitRunnable; - import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; @@ -41,9 +39,9 @@ import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; import vg.civcraft.mc.namelayer.database.GroupManagerDao; -import vg.civcraft.mc.namelayer.permission.PermissionType; public class EntityListener implements Listener { + protected GroupManager gm = NameAPI.getGroupManager(); // prevent zombies from breaking reinforced doors From 12d9449eeb71f9ff7151de72576949ba4ba3081b Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 28 Jun 2020 20:19:37 +0100 Subject: [PATCH 207/255] Citadel :: remove save default config, as the behaviour is already present Not sure why it wasn't saving the config though... --- src/main/java/vg/civcraft/mc/citadel/Citadel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 7d880b47..08bfa48c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -100,7 +100,6 @@ public void onEnable() { Bukkit.shutdown(); return; } - saveDefaultConfig(); config = new CitadelConfigManager(this); if (!config.parse()) { logger.severe("Errors in config file, shutting down"); From 362e0ada7f0d15863bcdca6b25019236c922e21b Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 29 Jun 2020 16:15:38 +0200 Subject: [PATCH 208/255] Handle reinforcing same block type more gracefully --- .../java/vg/civcraft/mc/citadel/CitadelUtility.java | 10 +++++++--- .../vg/civcraft/mc/citadel/playerstate/PatchState.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index a4f70ed3..dda686ad 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -75,8 +75,11 @@ public static void debugLog(String msg) { } } - public static boolean consumeReinforcementItems(Player player, ReinforcementType type) { + public static boolean consumeReinforcementItems(Player player, ReinforcementType type, boolean consumeExtra) { ItemMap toRemove = new ItemMap(type.getItem()); + if (consumeExtra) { + toRemove.addItemAmount(type.getItem(), 1); + } if (!toRemove.removeSafelyFrom(player.getInventory())) { CitadelUtility.sendAndLog(player, ChatColor.RED, "Failed to remove items needed for " + type.getName() + " reinforcement from your inventory"); @@ -122,7 +125,8 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp // check inventory int available = playerItems.getAmount(type.getItem()); int required = type.getItem().getAmount(); - if (block.getType() == type.getItem().getType()) { + boolean consumeExtra = block.getType() == type.getItem().getType(); + if (consumeExtra) { //make sure they're not trying to reinforce with the single block thats also being placed required++; } @@ -132,7 +136,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp return true; } // remove from inventory - if (!CitadelUtility.consumeReinforcementItems(player, type)) { + if (!CitadelUtility.consumeReinforcementItems(player, type, consumeExtra)) { return true; } // create reinforcement diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index bef74532..cefb8467 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -68,7 +68,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } if (!rein.rollForItemReturn()) { - if (!CitadelUtility.consumeReinforcementItems(player, rein.getType())) { + if (!CitadelUtility.consumeReinforcementItems(player, rein.getType(), false)) { return; } } From ae6b43a16ce9abfb0bf2216c26123332deae4cf6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Tue, 7 Jul 2020 03:43:26 +0100 Subject: [PATCH 209/255] fixes #25 and #35 and double reinforcement --- .../mc/citadel/ReinforcementLogic.java | 215 ++++++++++-------- .../citadel/listener/InventoryListener.java | 82 +++++-- .../playerstate/FortificationState.java | 36 +-- 3 files changed, 197 insertions(+), 136 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index a6b6d111..921933ca 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -1,15 +1,15 @@ package vg.civcraft.mc.citadel; +import java.util.Objects; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.Bed; +import org.bukkit.block.data.type.Chest; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; -import org.bukkit.material.Bed; - import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDestructionEvent; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -76,17 +76,44 @@ public static float getDamageApplied(Reinforcement reinforcement) { return damageAmount; } - public static Reinforcement getReinforcementAt(Location loc) { - return Citadel.getInstance().getReinforcementManager().getReinforcement(loc); + public static Reinforcement getReinforcementAt(Location location) { + return Citadel.getInstance().getReinforcementManager().getReinforcement(location); } - public static Reinforcement getReinforcementProtecting(Block b) { - Reinforcement directReinforcement = getReinforcementAt(b.getLocation()); - if (directReinforcement != null) { - return directReinforcement; + public static Reinforcement getReinforcementProtecting(Block block) { + if (!BlockAPI.isValidBlock(block)) { + return null; + } + Reinforcement reinforcement = getReinforcementAt(block.getLocation()); + if (reinforcement != null) { + return reinforcement; + } + switch (block.getType()) { + // Chests are awkward since you can place both sides of a double chest independently, which isn't true for + // beds, plants, or doors, so this needs to be accounted for and "getResponsibleBlock()" isn't appropriate + // for the following logic: that both sides protect each other; that if either block is reinforced, then + // the chest as a whole remains protected. + case CHEST: + case TRAPPED_CHEST: { + Chest chest = (Chest) block.getBlockData(); + switch (chest.getType()) { + case LEFT: + case RIGHT: { + return getReinforcementAt(BlockAPI.getOtherDoubleChestBlock(block).getLocation()); + } + default: { + return null; + } + } + } + default: { + Block responsible = getResponsibleBlock(block); + if (Objects.equals(block, responsible)) { + return null; + } + return getReinforcementAt(responsible.getLocation()); + } } - Block actual = getResponsibleBlock(b); - return resolveDoubleChestReinforcement(actual); } /** @@ -95,93 +122,97 @@ public static Reinforcement getReinforcementProtecting(Block b) { * that source block, which may be the given block itself. It does not look at * reinforcement data at all, it merely applies logic based on block type and * physics checks - * + * * @param block Block to get responsible block for - * @return Block whichs reinforcement would protect the given block + * @return Block which reinforcement would protect the given block */ public static Block getResponsibleBlock(Block block) { + // Do not put [double] chests in here. switch (block.getType()) { - case DANDELION: - case POPPY: - case BLUE_ORCHID: - case ALLIUM: - case AZURE_BLUET: - case ORANGE_TULIP: - case RED_TULIP: - case PINK_TULIP: - case WHITE_TULIP: - case OXEYE_DAISY: - case ACACIA_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case SPRUCE_SAPLING: - case WHEAT: - case CARROTS: - case POTATOES: - case BEETROOTS: - case MELON_STEM: - case PUMPKIN_STEM: - case ATTACHED_MELON_STEM: - case ATTACHED_PUMPKIN_STEM: - case NETHER_WART_BLOCK: - return block.getRelative(BlockFace.DOWN); - case SUGAR_CANE: - case CACTUS: - case SUNFLOWER: - case LILAC: - case PEONY: - // scan downwards for first different block - Block below = block.getRelative(BlockFace.DOWN); - while (below.getType() == block.getType()) { - below = below.getRelative(BlockFace.DOWN); - } - return below; - case ACACIA_DOOR: - case BIRCH_DOOR: - case DARK_OAK_DOOR: - case IRON_DOOR: - case SPRUCE_DOOR: - case JUNGLE_DOOR: - case OAK_DOOR: - if (block.getRelative(BlockFace.UP).getType() != block.getType()) { - // block is upper half of a door + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: + case WHEAT: + case CARROTS: + case POTATOES: + case BEETROOTS: + case MELON_STEM: + case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case NETHER_WART_BLOCK: { return block.getRelative(BlockFace.DOWN); } - return block; - case BLACK_BED: - case BLUE_BED: - case BROWN_BED: - case CYAN_BED: - case GRAY_BED: - case GREEN_BED: - case MAGENTA_BED: - case LIME_BED: - case ORANGE_BED: - case PURPLE_BED: - case PINK_BED: - case WHITE_BED: - case LIGHT_GRAY_BED: - case LIGHT_BLUE_BED: - case RED_BED: - case YELLOW_BED: - if (block.getBlockData() instanceof Bed) { + case SUGAR_CANE: + case CACTUS: + case SUNFLOWER: + case LILAC: + case PEONY: { + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType()) { + below = below.getRelative(BlockFace.DOWN); + } + return below; + } + case ACACIA_DOOR: + case BIRCH_DOOR: + case DARK_OAK_DOOR: + case IRON_DOOR: + case SPRUCE_DOOR: + case JUNGLE_DOOR: + case OAK_DOOR: { + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + // block is upper half of a door + return block.getRelative(BlockFace.DOWN); + } + return block; + } + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case MAGENTA_BED: + case LIME_BED: + case ORANGE_BED: + case PURPLE_BED: + case PINK_BED: + case WHITE_BED: + case LIGHT_GRAY_BED: + case LIGHT_BLUE_BED: + case RED_BED: + case YELLOW_BED: { Bed bed = (Bed) block.getBlockData(); - if (bed.isHeadOfBed()) { + if (bed.getPart() == Bed.Part.HEAD) { return block.getRelative(bed.getFacing().getOppositeFace()); } + return block; + } + default: { + return block; } - return block; - default: - return block; } } /** * Checks if at the given block is a container, which is not insecure and which * the player can not access due to missing perms - * + * * @param player the player attempting to access stuff * @param block Block to check for * @return True if the player can not do something like placing an adjacent @@ -192,11 +223,8 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { return false; } if (block.getState() instanceof InventoryHolder) { - Reinforcement rein = ReinforcementLogic.resolveDoubleChestReinforcement(block); - if (rein == null) { - return false; - } - if (rein.isInsecure()) { + Reinforcement rein = getReinforcementProtecting(block); + if (rein == null || rein.isInsecure()) { return false; } return !rein.hasPermission(player, CitadelPermissionHandler.getChests()); @@ -204,17 +232,4 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { return false; } - public static Reinforcement resolveDoubleChestReinforcement(Block block) { - Material mat = block.getType(); - Reinforcement rein = getReinforcementAt(block.getLocation()); - if (rein != null || (mat != Material.CHEST && mat != Material.TRAPPED_CHEST)) { - return rein; - } - - Block otherHalf = BlockAPI.getOtherDoubleChestBlock(block); - if (otherHalf == null) { - return null; - } - return getReinforcementAt(otherHalf.getLocation()); - } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 1b33d165..3ae27052 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -1,50 +1,90 @@ package vg.civcraft.mc.citadel.listener; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; import org.bukkit.block.Container; +import org.bukkit.block.Dispenser; +import org.bukkit.block.DoubleChest; +import org.bukkit.block.Dropper; +import org.bukkit.block.Hopper; +import org.bukkit.block.data.Directional; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.inventory.Inventory; - +import org.bukkit.inventory.InventoryHolder; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.BlockAPI; +import vg.civcraft.mc.civmodcore.util.Iteration; public class InventoryListener implements Listener { - // prevent sucking reinforcements out of reinforced containers with hoppers on - // different groups or filling into them @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { - Inventory sourceInv = event.getSource(); - Reinforcement sourceRein = null; - if (sourceInv.getHolder() instanceof Container) { - sourceRein = ReinforcementLogic.getReinforcementProtecting(((Container) sourceInv.getHolder()).getBlock()); + Inventory fromInventory = event.getSource(); + Inventory destInventory = event.getDestination(); + InventoryHolder fromHolder = fromInventory.getHolder(); + InventoryHolder destHolder = destInventory.getHolder(); + // Determine the reinforcement of the source + Reinforcement fromReinforcement = null; + if (fromHolder instanceof Container) { + Container container = (Container) fromHolder; + fromReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); + } + else if (fromHolder instanceof DoubleChest) { + DoubleChest doubleChest = (DoubleChest) fromHolder; + Block doubleChestBlock = doubleChest.getLocation().getBlock(); + Location chestLocation = doubleChestBlock.getLocation(); // Yes this is necessary + Location otherLocation = BlockAPI.getOtherDoubleChestBlock(doubleChestBlock).getLocation(); + if (destHolder instanceof Hopper) { + Location drainedLocation = ((Hopper) destHolder).getLocation().add(0, 1, 0); + if (Iteration.contains(drainedLocation, chestLocation, otherLocation)) { + fromReinforcement = ReinforcementLogic.getReinforcementProtecting(drainedLocation.getBlock()); + } + } + } + // Determine the reinforcement of the destination + Reinforcement destReinforcement = null; + if (fromHolder instanceof Hopper || fromHolder instanceof Dropper || fromHolder instanceof Dispenser) { + Container container = (Container) fromHolder; + BlockFace direction = ((Directional) container.getBlockData()).getFacing(); + destReinforcement = ReinforcementLogic.getReinforcementProtecting( + container.getBlock().getRelative(direction)); } - Inventory destInv = event.getDestination(); - Reinforcement destRein = null; - if (destInv.getHolder() instanceof Container) { - destRein = ReinforcementLogic.getReinforcementProtecting(((Container) destInv.getHolder()).getBlock()); + else if (destHolder instanceof Container) { + Container container = (Container) destHolder; + destReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); } - if (sourceRein == null && destRein == null) { + // Allow the transfer if neither are reinforced + if (fromReinforcement == null && destReinforcement == null) { return; } - if (sourceRein != null && destRein == null) { - if (!sourceRein.isInsecure()) { + // Allow the transfer if the destination is un-reinforced and the source is insecure + if (destReinforcement == null) { + if (!fromReinforcement.isInsecure()) { event.setCancelled(true); } return; } - //destRein is for sure not null at this point - if (sourceRein == null) { - if (!destRein.isInsecure()) { + // Allow the transfer if the source is un-reinforced and the destination is insecure + if (fromReinforcement == null) { + if (!destReinforcement.isInsecure()) { event.setCancelled(true); } return; } - // both reinforced at this point - if (sourceRein.getGroup().getGroupId() != destRein.getGroup().getGroupId()) { - event.setCancelled(true); + // Allow the transfer if both the source and destination are insecure + if (fromReinforcement.isInsecure() && destReinforcement.isInsecure()) { + return; + } + // Allow the transfer if both the source and destination are on the same group + if (fromReinforcement.getGroupId() == destReinforcement.getGroupId()) { + return; } + event.setCancelled(true); } -} \ No newline at end of file + +} diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 6d6b5d31..01e93f4e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -1,22 +1,23 @@ package vg.civcraft.mc.citadel.playerstate; import org.bukkit.ChatColor; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; - import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.group.Group; public class FortificationState extends AbstractPlayerState { - private ReinforcementType type; - private Group group; + private final ReinforcementType type; + private final Group group; - public FortificationState(Player p, ReinforcementType type, Group group) { - super(p); + public FortificationState(Player player, ReinforcementType type, Group group) { + super(player); this.type = type; this.group = group; } @@ -36,24 +37,29 @@ public ReinforcementType getType() { } @Override - public void handleBlockPlace(BlockPlaceEvent e) { - boolean hadError = CitadelUtility.attemptReinforcementCreation(e.getBlock(), type, group, e.getPlayer()); - if (hadError) { - e.setCancelled(true); - Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); + public void handleBlockPlace(BlockPlaceEvent event) { + Player player = event.getPlayer(); + Block block = event.getBlock(); + // Prevent double reinforcement (double chests / slabs) + if (ReinforcementLogic.getReinforcementProtecting(block) != null) { + return; + } + if (CitadelUtility.attemptReinforcementCreation(block, type, group, player)) { // true == fail + Citadel.getInstance().getStateManager().setState(player, null); + event.setCancelled(true); + //return; } } @Override - public void handleInteractBlock(PlayerInteractEvent e) { - } + public void handleInteractBlock(PlayerInteractEvent event) { } @Override - public boolean equals(Object o) { - if (!(o instanceof FortificationState)) { + public boolean equals(Object other) { + if (!(other instanceof FortificationState)) { return false; } - FortificationState fort = (FortificationState) o; + FortificationState fort = (FortificationState) other; return fort.type == this.type && fort.group.getName().equals(this.getGroup().getName()); } From 17e1f534e7fc64ca4b7630e05d2d31eb60158265 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 8 Jul 2020 05:58:50 +0100 Subject: [PATCH 210/255] FortificationState :: remove double chest reinforcement limitation --- .../civcraft/mc/citadel/playerstate/FortificationState.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 01e93f4e..3aa6f809 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -40,8 +40,8 @@ public ReinforcementType getType() { public void handleBlockPlace(BlockPlaceEvent event) { Player player = event.getPlayer(); Block block = event.getBlock(); - // Prevent double reinforcement (double chests / slabs) - if (ReinforcementLogic.getReinforcementProtecting(block) != null) { + // Prevent double reinforcement (slabs) + if (ReinforcementLogic.getReinforcementAt(block.getLocation()) != null) { return; } if (CitadelUtility.attemptReinforcementCreation(block, type, group, player)) { // true == fail From 7449e2728713431c4357ca074163417c27bf52b6 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 8 Jul 2020 05:59:08 +0100 Subject: [PATCH 211/255] InventoryListener :: comment clarity update --- .../java/vg/civcraft/mc/citadel/listener/InventoryListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 3ae27052..096be3f6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -37,7 +37,7 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { else if (fromHolder instanceof DoubleChest) { DoubleChest doubleChest = (DoubleChest) fromHolder; Block doubleChestBlock = doubleChest.getLocation().getBlock(); - Location chestLocation = doubleChestBlock.getLocation(); // Yes this is necessary + Location chestLocation = doubleChestBlock.getLocation(); // Yes this is necessary otherwise .5 values Location otherLocation = BlockAPI.getOtherDoubleChestBlock(doubleChestBlock).getLocation(); if (destHolder instanceof Hopper) { Location drainedLocation = ((Hopper) destHolder).getLocation().add(0, 1, 0); From c3e6d028606c2b8de1a710b2785c783868f378bd Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 11 Jul 2020 21:11:33 +0100 Subject: [PATCH 212/255] Potential Chunk lag fix --- .../java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 9 +++++++-- .../civcraft/mc/citadel/listener/InventoryListener.java | 9 ++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 921933ca..382b7214 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -96,10 +96,15 @@ public static Reinforcement getReinforcementProtecting(Block block) { case CHEST: case TRAPPED_CHEST: { Chest chest = (Chest) block.getBlockData(); + BlockFace facing = chest.getFacing(); switch (chest.getType()) { - case LEFT: + case LEFT: { + BlockFace face = BlockAPI.turnClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); + } case RIGHT: { - return getReinforcementAt(BlockAPI.getOtherDoubleChestBlock(block).getLocation()); + BlockFace face = BlockAPI.turnAntiClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); } default: { return null; diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 096be3f6..a0442137 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -1,8 +1,9 @@ package vg.civcraft.mc.citadel.listener; +import java.util.Objects; import org.bukkit.Location; -import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; import org.bukkit.block.Container; import org.bukkit.block.Dispenser; import org.bukkit.block.DoubleChest; @@ -17,7 +18,6 @@ import org.bukkit.inventory.InventoryHolder; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.civmodcore.util.Iteration; public class InventoryListener implements Listener { @@ -36,9 +36,8 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { } else if (fromHolder instanceof DoubleChest) { DoubleChest doubleChest = (DoubleChest) fromHolder; - Block doubleChestBlock = doubleChest.getLocation().getBlock(); - Location chestLocation = doubleChestBlock.getLocation(); // Yes this is necessary otherwise .5 values - Location otherLocation = BlockAPI.getOtherDoubleChestBlock(doubleChestBlock).getLocation(); + Location chestLocation = Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation(); + Location otherLocation = Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation(); if (destHolder instanceof Hopper) { Location drainedLocation = ((Hopper) destHolder).getLocation().add(0, 1, 0); if (Iteration.contains(drainedLocation, chestLocation, otherLocation)) { From 9a4eec3a3e6e4cf0ce6a32474b1c9055dc01b04e Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Sun, 26 Jul 2020 21:42:36 +0200 Subject: [PATCH 213/255] Improve acid logic --- .../vg/civcraft/mc/citadel/CitadelConfigManager.java | 3 ++- .../java/vg/civcraft/mc/citadel/command/Acid.java | 6 +++++- .../vg/civcraft/mc/citadel/model/AcidManager.java | 4 +--- .../citadel/reinforcementtypes/ReinforcementType.java | 11 ++++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index a31a33a7..5e29efb8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -150,6 +150,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { long gracePeriod = ConfigParsing.parseTime(config.getString("grace_period", "0"), TimeUnit.MILLISECONDS); long maturationTime = ConfigParsing.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); long acidTime = ConfigParsing.parseTime(config.getString("acid_time", "-1"), TimeUnit.MILLISECONDS); + int acidPriority = config.getInt("acid_priority", 0); String name = config.getString("name"); double maturationScale = config.getInt("scale_amount", 1); float health = (float) config.getDouble("hit_points", 100); @@ -179,7 +180,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { + returnChance + ", maturationTime: " + TextUtil.formatDuration(maturationTime, TimeUnit.MILLISECONDS) + ", acidTime: " + TextUtil.formatDuration(acidTime, TimeUnit.MILLISECONDS) + ", gracePeriod: " + gracePeriod + ", id: " + id); - return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, maturationScale, gracePeriod, + return new ReinforcementType(health, returnChance, item, maturationTime, acidTime, acidPriority, maturationScale, gracePeriod, creationEffect, damageEffect, destructionEffect, reinforceables, nonReinforceables, id, name, globalBlackList, decayTimer, decayMultiplier, multiplerOnDeletedGroup, legacyId); } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 06d62930..8f395487 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -33,13 +33,16 @@ public boolean execute(CommandSender sender, String[] args) { Player p = (Player) sender; Iterator itr = new BlockIterator(p, 40); // Within 2.5 chunks AcidManager acidMan = Citadel.getInstance().getAcidManager(); + boolean foundAny = false; while (itr.hasNext()) { Block block = itr.next(); if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid())) { continue; } if (!acidMan.isPossibleAcidBlock(block)) { - CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); + if (!foundAny) { + CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); + } return true; } Reinforcement reinforcement = ReinforcementLogic.getReinforcementAt(block.getLocation()); @@ -87,6 +90,7 @@ public boolean execute(CommandSender sender, String[] args) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid at {0} broke {1} at {2}, activated by {3}", new Object[] { block.getLocation(), topFace.getType(), topFace.getLocation(), p.getName() }); } + foundAny = true; reinforcement.setHealth(-1); // play particles for top block ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); diff --git a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java index c2e584ef..67c6645b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/AcidManager.java @@ -26,9 +26,7 @@ public AcidManager(Collection acidMats) { * and has an acid timer configured */ public boolean canAcidBlock(ReinforcementType acidBlock, ReinforcementType victim) { - // TODO - - return true; + return acidBlock.getAcidPriority() >= victim.getAcidPriority(); } /** diff --git a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java index 92491b82..6ac88f17 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -13,6 +13,7 @@ public class ReinforcementType { private double returnChance; private ItemStack item; private long maturationTime; + private int acidPriority; private long acidTime; private double scale; private long gracePeriod; @@ -29,7 +30,7 @@ public class ReinforcementType { private double deletedGroupMulitplier; private int legacyId; - public ReinforcementType(float health, double returnChance, ItemStack item, long maturationTime, long acidTime, + public ReinforcementType(float health, double returnChance, ItemStack item, long maturationTime, long acidTime, int acidPriority, double scale, long gracePeriod, ReinforcementEffect creationEffect, ReinforcementEffect damageEffect, ReinforcementEffect destructionEffect, Collection allowsReinforceables, Collection disallowedReinforceables, short id, String name, Collection globalBlackList, @@ -40,6 +41,7 @@ public ReinforcementType(float health, double returnChance, ItemStack item, long this.item = item; this.maturationTime = maturationTime; this.acidTime = acidTime; + this.acidPriority = acidPriority; this.scale = scale; this.creationEffect = creationEffect; this.damageEffect = damageEffect; @@ -117,6 +119,13 @@ public double getDeletedGroupMultiplier() { public ItemStack getItem() { return item; } + + /** + * @return Acid priority of this type. Acid blocks can only remove blocks of lower or equal priority + */ + public int getAcidPriority() { + return acidPriority; + } /** * @return Get the scale of amount of damage a block should take when it is not From 00a4bfd34beef63c9119bd23f15267e1775da8e3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Mon, 27 Jul 2020 06:27:36 +0200 Subject: [PATCH 214/255] Most likely fix issue causing server crashes --- .../java/vg/civcraft/mc/citadel/playerstate/NormalState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 830a4968..625c82c2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -47,7 +47,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { @Override public void handleInteractBlock(PlayerInteractEvent e) { - if (e.getAction() != Action.LEFT_CLICK_BLOCK && e.getAction() != Action.RIGHT_CLICK_BLOCK) { + if (e.getAction() != Action.LEFT_CLICK_BLOCK) { return; } Player player = e.getPlayer(); From d959b1d0cb5877f45defd9caeb7bc879b72d3e6a Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 27 Jul 2020 07:04:27 +0100 Subject: [PATCH 215/255] InventoryListener :: if this doesn't fix the lag, I don't know what will --- .../citadel/listener/InventoryListener.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index a0442137..c29ebafd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -18,6 +18,8 @@ import org.bukkit.inventory.InventoryHolder; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.api.BlockAPI; +import vg.civcraft.mc.civmodcore.api.WorldAPI; import vg.civcraft.mc.civmodcore.util.Iteration; public class InventoryListener implements Listener { @@ -32,12 +34,22 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Reinforcement fromReinforcement = null; if (fromHolder instanceof Container) { Container container = (Container) fromHolder; + // [LagFix] This shouldn't be contributing to lag since there's isn't an implementation of 'Container' that + // [LagFix] spans more than one block, so the 'container.getBlock()' is permissible since we can reasonably + // [LagFix] assume that since this event was called, this block is loaded. fromReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); } else if (fromHolder instanceof DoubleChest) { DoubleChest doubleChest = (DoubleChest) fromHolder; Location chestLocation = Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation(); Location otherLocation = Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation(); + // [LagFix] If either side of the double chest is not loaded then the reinforcement cannot be retrieved + // [LagFix] without necessarily loading the chunk to check against reinforcement logic, therefore this + // [LagFix] should air on the side of caution and prevent the transfer. + if (!WorldAPI.isBlockLoaded(chestLocation) || !WorldAPI.isBlockLoaded(otherLocation)) { + event.setCancelled(true); + return; + } if (destHolder instanceof Hopper) { Location drainedLocation = ((Hopper) destHolder).getLocation().add(0, 1, 0); if (Iteration.contains(drainedLocation, chestLocation, otherLocation)) { @@ -50,11 +62,19 @@ else if (fromHolder instanceof DoubleChest) { if (fromHolder instanceof Hopper || fromHolder instanceof Dropper || fromHolder instanceof Dispenser) { Container container = (Container) fromHolder; BlockFace direction = ((Directional) container.getBlockData()).getFacing(); - destReinforcement = ReinforcementLogic.getReinforcementProtecting( - container.getBlock().getRelative(direction)); + // [LagFix] If the transfer is happening laterally and the target location is not loaded, then air on the + // [LagFix] side of caution and prevent the transfer.. though this may cause some issues with dispensers + // [LagFix] and droppers. + Location target = container.getLocation().add(direction.getDirection()); + if (BlockAPI.PLANAR_SIDES.contains(direction) && !WorldAPI.isBlockLoaded(target)) { + event.setCancelled(true); + return; + } + destReinforcement = ReinforcementLogic.getReinforcementProtecting(target.getBlock()); } else if (destHolder instanceof Container) { Container container = (Container) destHolder; + // [LagFix] Just like the other 'Container' this shouldn't be an issue. destReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); } // Allow the transfer if neither are reinforced From c1aba697d4dacdcbcc5399f10d38433b3a7271bd Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 28 Jul 2020 01:19:08 +0200 Subject: [PATCH 216/255] Call reinforcement creation event earlier --- .../civcraft/mc/citadel/CitadelUtility.java | 11 +- .../mc/citadel/ReinforcementLogic.java | 226 +++++++++--------- .../mc/citadel/command/AreaReinforce.java | 6 +- .../mc/citadel/playerstate/NormalState.java | 1 - .../citadel/playerstate/ReinforcingState.java | 10 +- 5 files changed, 141 insertions(+), 113 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index dda686ad..81a06e22 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -108,8 +108,8 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp } block = ReinforcementLogic.getResponsibleBlock(block); // check if reinforcement already exists - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); - if (rein != null) { + Reinforcement existingRein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (existingRein != null) { // something like a slab, we just ignore this return false; } @@ -135,6 +135,10 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp CitadelUtility.sendAndLog(player, ChatColor.RED, "You have no items left to reinforce with " + type.getName()); return true; } + Reinforcement newRein = ReinforcementLogic.callReinforcementCreationEvent(player, block, type, group); + if (newRein == null) { + return true; + } // remove from inventory if (!CitadelUtility.consumeReinforcementItems(player, type, consumeExtra)) { return true; @@ -144,6 +148,7 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp Citadel.getInstance().getLogger().info(player.getName() + " created reinforcement with " + type.getName() + " for " + block.getType().toString() + " at " + block.getLocation().toString()); } - return ReinforcementLogic.createReinforcement(player, block, type, group) == null; + ReinforcementLogic.createReinforcement(newRein); + return true; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 382b7214..d8e5525f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -22,17 +22,27 @@ public final class ReinforcementLogic { private ReinforcementLogic() { } - public static Reinforcement createReinforcement(Player player, Block block, ReinforcementType type, Group group) { + /** + * Inserts a new reinforcements into the cache, queues it for persistence and + * plays particle effects for creation + * + * @param rein Reinforcement just created + */ + public static void createReinforcement(Reinforcement rein) { + Citadel.getInstance().getReinforcementManager().putReinforcement(rein); + if (rein.getType().getCreationEffect() != null) { + rein.getType().getCreationEffect().playEffect(rein); + } + } + + public static Reinforcement callReinforcementCreationEvent(Player player, Block block, ReinforcementType type, + Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); ReinforcementCreationEvent event = new ReinforcementCreationEvent(player, rein); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { return null; } - Citadel.getInstance().getReinforcementManager().putReinforcement(rein); - if (type.getCreationEffect() != null) { - type.getCreationEffect().playEffect(rein); - } return rein; } @@ -69,8 +79,7 @@ public static float getDamageApplied(Reinforcement reinforcement) { if (reinforcement.getGroup() != null) { long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); damageAmount *= reinforcement.getType().getDecayDamageMultipler(lastRefresh); - } - else { + } else { damageAmount *= reinforcement.getType().getDeletedGroupMultiplier(); } return damageAmount; @@ -89,36 +98,39 @@ public static Reinforcement getReinforcementProtecting(Block block) { return reinforcement; } switch (block.getType()) { - // Chests are awkward since you can place both sides of a double chest independently, which isn't true for - // beds, plants, or doors, so this needs to be accounted for and "getResponsibleBlock()" isn't appropriate - // for the following logic: that both sides protect each other; that if either block is reinforced, then - // the chest as a whole remains protected. - case CHEST: - case TRAPPED_CHEST: { - Chest chest = (Chest) block.getBlockData(); - BlockFace facing = chest.getFacing(); - switch (chest.getType()) { - case LEFT: { - BlockFace face = BlockAPI.turnClockwise(facing); - return getReinforcementAt(block.getLocation().add(face.getDirection())); - } - case RIGHT: { - BlockFace face = BlockAPI.turnAntiClockwise(facing); - return getReinforcementAt(block.getLocation().add(face.getDirection())); - } - default: { - return null; - } - } + // Chests are awkward since you can place both sides of a double chest + // independently, which isn't true for + // beds, plants, or doors, so this needs to be accounted for and + // "getResponsibleBlock()" isn't appropriate + // for the following logic: that both sides protect each other; that if either + // block is reinforced, then + // the chest as a whole remains protected. + case CHEST: + case TRAPPED_CHEST: { + Chest chest = (Chest) block.getBlockData(); + BlockFace facing = chest.getFacing(); + switch (chest.getType()) { + case LEFT: { + BlockFace face = BlockAPI.turnClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); + } + case RIGHT: { + BlockFace face = BlockAPI.turnAntiClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); } default: { - Block responsible = getResponsibleBlock(block); - if (Objects.equals(block, responsible)) { - return null; - } - return getReinforcementAt(responsible.getLocation()); + return null; + } } } + default: { + Block responsible = getResponsibleBlock(block); + if (Objects.equals(block, responsible)) { + return null; + } + return getReinforcementAt(responsible.getLocation()); + } + } } /** @@ -134,83 +146,83 @@ public static Reinforcement getReinforcementProtecting(Block block) { public static Block getResponsibleBlock(Block block) { // Do not put [double] chests in here. switch (block.getType()) { - case DANDELION: - case POPPY: - case BLUE_ORCHID: - case ALLIUM: - case AZURE_BLUET: - case ORANGE_TULIP: - case RED_TULIP: - case PINK_TULIP: - case WHITE_TULIP: - case OXEYE_DAISY: - case ACACIA_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case SPRUCE_SAPLING: - case WHEAT: - case CARROTS: - case POTATOES: - case BEETROOTS: - case MELON_STEM: - case PUMPKIN_STEM: - case ATTACHED_MELON_STEM: - case ATTACHED_PUMPKIN_STEM: - case NETHER_WART_BLOCK: { - return block.getRelative(BlockFace.DOWN); - } - case SUGAR_CANE: - case CACTUS: - case SUNFLOWER: - case LILAC: - case PEONY: { - // scan downwards for first different block - Block below = block.getRelative(BlockFace.DOWN); - while (below.getType() == block.getType()) { - below = below.getRelative(BlockFace.DOWN); - } - return below; - } - case ACACIA_DOOR: - case BIRCH_DOOR: - case DARK_OAK_DOOR: - case IRON_DOOR: - case SPRUCE_DOOR: - case JUNGLE_DOOR: - case OAK_DOOR: { - if (block.getRelative(BlockFace.UP).getType() != block.getType()) { - // block is upper half of a door - return block.getRelative(BlockFace.DOWN); - } - return block; + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: + case WHEAT: + case CARROTS: + case POTATOES: + case BEETROOTS: + case MELON_STEM: + case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case NETHER_WART_BLOCK: { + return block.getRelative(BlockFace.DOWN); + } + case SUGAR_CANE: + case CACTUS: + case SUNFLOWER: + case LILAC: + case PEONY: { + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType()) { + below = below.getRelative(BlockFace.DOWN); } - case BLACK_BED: - case BLUE_BED: - case BROWN_BED: - case CYAN_BED: - case GRAY_BED: - case GREEN_BED: - case MAGENTA_BED: - case LIME_BED: - case ORANGE_BED: - case PURPLE_BED: - case PINK_BED: - case WHITE_BED: - case LIGHT_GRAY_BED: - case LIGHT_BLUE_BED: - case RED_BED: - case YELLOW_BED: { - Bed bed = (Bed) block.getBlockData(); - if (bed.getPart() == Bed.Part.HEAD) { - return block.getRelative(bed.getFacing().getOppositeFace()); - } - return block; + return below; + } + case ACACIA_DOOR: + case BIRCH_DOOR: + case DARK_OAK_DOOR: + case IRON_DOOR: + case SPRUCE_DOOR: + case JUNGLE_DOOR: + case OAK_DOOR: { + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + // block is upper half of a door + return block.getRelative(BlockFace.DOWN); } - default: { - return block; + return block; + } + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case MAGENTA_BED: + case LIME_BED: + case ORANGE_BED: + case PURPLE_BED: + case PINK_BED: + case WHITE_BED: + case LIGHT_GRAY_BED: + case LIGHT_BLUE_BED: + case RED_BED: + case YELLOW_BED: { + Bed bed = (Bed) block.getBlockData(); + if (bed.getPart() == Bed.Part.HEAD) { + return block.getRelative(bed.getFacing().getOppositeFace()); } + return block; + } + default: { + return block; + } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java index 75bc3b29..b4418159 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -12,6 +12,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; +import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; @@ -85,7 +86,10 @@ public boolean execute(CommandSender sender, String[] args) { continue; } count++; - ReinforcementLogic.createReinforcement(p, current, reinType, group); + Reinforcement rein = ReinforcementLogic.callReinforcementCreationEvent(p, current, reinType, group); + if (rein != null) { + ReinforcementLogic.createReinforcement(rein); + } } } } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index 625c82c2..c4856046 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -8,7 +8,6 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.namelayer.GroupManager; diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 81728f5c..2c6c049f 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -88,6 +88,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } } + Reinforcement newRein = null; if (rein == null || rein.getType() != type) { // check inventory for reinforcement item ItemMap toConsume = new ItemMap(type.getItem()); @@ -95,6 +96,13 @@ public void handleInteractBlock(PlayerInteractEvent e) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "No reinforcing item found in your inventory?"); return; } + if (rein == null) { + newRein = ReinforcementLogic.callReinforcementCreationEvent(player, block, type, group); + if (newRein == null) { + //event was cancelled, error message is up to whoever cancelled it + return; + } + } // consume item from inventory if (!toConsume.removeSafelyFrom(player.getInventory())) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, @@ -111,7 +119,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { + block.getLocation().toString()); } // just create new reinforcement - ReinforcementLogic.createReinforcement(player, block, type, group); + ReinforcementLogic.createReinforcement(newRein); } else { // replace existing one boolean changedGroup = false; From bb2cfd0a9eeb72bf2517b649bd578395347d2e16 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 28 Jul 2020 18:16:13 +0200 Subject: [PATCH 217/255] Update to 1.16 --- pom.xml | 10 +++++----- .../civcraft/mc/citadel/listener/EntityListener.java | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 1e066e5b..08aea47c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ vg.civcraft.mc.citadel Citadel jar - 4.0.2 + 4.1.0 Citadel https://github.com/civclassic/Citadel @@ -22,25 +22,25 @@ org.spigotmc spigot-api - 1.14.4-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided vg.civcraft.mc.civmodcore CivModCore - 1.7.9 + 1.8.0 provided vg.civcraft.mc.namelayer NameLayer - 2.13.1 + 2.14.0 provided com.gmail.filoghost.holographicdisplays holographicdisplays-api - 2.3.2 + 2.4.3 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 8c92dce0..4702c501 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -202,6 +202,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { case OBSTRUCTION: case PHYSICS: case DEFAULT: + case EXPLOSION: return; case ENTITY: { Player player = castOrNull(Player.class, event.getRemover()); From 0a684d93f1c91ae70807edacf89376f16d9df50c Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 28 Jul 2020 18:21:47 +0200 Subject: [PATCH 218/255] Fix big stupid --- src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 81a06e22..1c38cb3c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -149,6 +149,6 @@ public static boolean attemptReinforcementCreation(Block block, ReinforcementTyp + " for " + block.getType().toString() + " at " + block.getLocation().toString()); } ReinforcementLogic.createReinforcement(newRein); - return true; + return false; } } From e81a5045048aed606ad733344ec9f0c3e27e0175 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 29 Jul 2020 22:10:56 -0400 Subject: [PATCH 219/255] Preventing harvesting honey from reinforced blocks --- .../mc/citadel/listener/BlockListener.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 8de46770..bec74258 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -220,7 +220,6 @@ public void preventBypassChestAccess(BlockPlaceEvent e) { } } - // remove reinforced air @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void removeReinforcedAir(BlockPlaceEvent e) { if (!MaterialAPI.isAir(e.getBlockReplacedState().getType())) { @@ -342,6 +341,44 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { } } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void preventHarvestingHoney(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Block block = pie.getClickedBlock(); + Material type = block.getType(); + if (type != Material.BEE_NEST && type != Material.BEEHIVE) { + return; + } + EquipmentSlot hand = pie.getHand(); + if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + return; + } + ItemStack relevant; + Player p = pie.getPlayer(); + if (hand == EquipmentSlot.HAND) { + relevant = p.getInventory().getItemInMainHand(); + } else { + relevant = p.getInventory().getItemInOffHand(); + } + if (relevant.getType() != Material.SHEARS && relevant.getType() != Material.GLASS_BOTTLE) { + return; + } + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null) { + return; + } + if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + p.sendMessage(ChatColor.RED + "You do not have permission to harvest this block"); + pie.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = false) public void openBeacon(PlayerInteractEvent pie) { if (!pie.hasBlock()) { From 942c79d541838d478160dd711e7e2cca15a539fc Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 30 Jul 2020 14:32:46 +0100 Subject: [PATCH 220/255] InventoryListener :: move the DoubleChest check up --- .../mc/citadel/listener/InventoryListener.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index c29ebafd..da76d5bb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -32,14 +32,7 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { InventoryHolder destHolder = destInventory.getHolder(); // Determine the reinforcement of the source Reinforcement fromReinforcement = null; - if (fromHolder instanceof Container) { - Container container = (Container) fromHolder; - // [LagFix] This shouldn't be contributing to lag since there's isn't an implementation of 'Container' that - // [LagFix] spans more than one block, so the 'container.getBlock()' is permissible since we can reasonably - // [LagFix] assume that since this event was called, this block is loaded. - fromReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); - } - else if (fromHolder instanceof DoubleChest) { + if (fromHolder instanceof DoubleChest) { DoubleChest doubleChest = (DoubleChest) fromHolder; Location chestLocation = Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation(); Location otherLocation = Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation(); @@ -57,6 +50,13 @@ else if (fromHolder instanceof DoubleChest) { } } } + else if (fromHolder instanceof Container) { + Container container = (Container) fromHolder; + // [LagFix] This shouldn't be contributing to lag since there's isn't an implementation of 'Container' that + // [LagFix] spans more than one block, so the 'container.getBlock()' is permissible since we can reasonably + // [LagFix] assume that since this event was called, this block is loaded. + fromReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); + } // Determine the reinforcement of the destination Reinforcement destReinforcement = null; if (fromHolder instanceof Hopper || fromHolder instanceof Dropper || fromHolder instanceof Dispenser) { From 0b77a55a6ab8f7c967a948f25d8071e2129536fa Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 30 Jul 2020 14:35:09 +0100 Subject: [PATCH 221/255] InventoryListener :: add preliminary is-loaded check --- .../vg/civcraft/mc/citadel/listener/InventoryListener.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index da76d5bb..a7a02dfc 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -28,6 +28,12 @@ public class InventoryListener implements Listener { public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Inventory fromInventory = event.getSource(); Inventory destInventory = event.getDestination(); + // [LagFix] If either inventory's base location is unloaded, just cancel + if (!WorldAPI.isBlockLoaded(fromInventory.getLocation()) + || !WorldAPI.isBlockLoaded(destInventory.getLocation())) { + event.setCancelled(true); + return; + } InventoryHolder fromHolder = fromInventory.getHolder(); InventoryHolder destHolder = destInventory.getHolder(); // Determine the reinforcement of the source From 80c74e892a4ffc01a516cd8ff8978c9597d0ad60 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 30 Jul 2020 19:22:31 +0100 Subject: [PATCH 222/255] InventoryListener :: cleanup and more location switchover --- .../citadel/listener/InventoryListener.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index a7a02dfc..2b13f554 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -19,6 +19,7 @@ import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.BlockAPI; +import vg.civcraft.mc.civmodcore.api.LocationAPI; import vg.civcraft.mc.civmodcore.api.WorldAPI; import vg.civcraft.mc.civmodcore.util.Iteration; @@ -29,8 +30,10 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Inventory fromInventory = event.getSource(); Inventory destInventory = event.getDestination(); // [LagFix] If either inventory's base location is unloaded, just cancel - if (!WorldAPI.isBlockLoaded(fromInventory.getLocation()) - || !WorldAPI.isBlockLoaded(destInventory.getLocation())) { + Location fromLocation = LocationAPI.getBlockLocation(fromInventory.getLocation()); + Location destLocation = LocationAPI.getBlockLocation(destInventory.getLocation()); + if (!WorldAPI.isBlockLoaded(fromLocation) + || !WorldAPI.isBlockLoaded(destLocation)) { event.setCancelled(true); return; } @@ -40,38 +43,38 @@ public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Reinforcement fromReinforcement = null; if (fromHolder instanceof DoubleChest) { DoubleChest doubleChest = (DoubleChest) fromHolder; - Location chestLocation = Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation(); - Location otherLocation = Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation(); + Location chestLocation = LocationAPI.getBlockLocation( + Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation()); + Location otherLocation = LocationAPI.getBlockLocation( + Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation()); // [LagFix] If either side of the double chest is not loaded then the reinforcement cannot be retrieved // [LagFix] without necessarily loading the chunk to check against reinforcement logic, therefore this - // [LagFix] should air on the side of caution and prevent the transfer. + // [LagFix] should err on the side of caution and prevent the transfer. if (!WorldAPI.isBlockLoaded(chestLocation) || !WorldAPI.isBlockLoaded(otherLocation)) { event.setCancelled(true); return; } if (destHolder instanceof Hopper) { - Location drainedLocation = ((Hopper) destHolder).getLocation().add(0, 1, 0); + Location drainedLocation = destLocation.clone().add(0, 1, 0); if (Iteration.contains(drainedLocation, chestLocation, otherLocation)) { fromReinforcement = ReinforcementLogic.getReinforcementProtecting(drainedLocation.getBlock()); } } } else if (fromHolder instanceof Container) { - Container container = (Container) fromHolder; // [LagFix] This shouldn't be contributing to lag since there's isn't an implementation of 'Container' that // [LagFix] spans more than one block, so the 'container.getBlock()' is permissible since we can reasonably // [LagFix] assume that since this event was called, this block is loaded. - fromReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); + fromReinforcement = ReinforcementLogic.getReinforcementProtecting(fromLocation.getBlock()); } // Determine the reinforcement of the destination Reinforcement destReinforcement = null; if (fromHolder instanceof Hopper || fromHolder instanceof Dropper || fromHolder instanceof Dispenser) { - Container container = (Container) fromHolder; - BlockFace direction = ((Directional) container.getBlockData()).getFacing(); - // [LagFix] If the transfer is happening laterally and the target location is not loaded, then air on the + BlockFace direction = ((Directional) fromLocation.getBlock().getBlockData()).getFacing(); + // [LagFix] If the transfer is happening laterally and the target location is not loaded, then err on the // [LagFix] side of caution and prevent the transfer.. though this may cause some issues with dispensers // [LagFix] and droppers. - Location target = container.getLocation().add(direction.getDirection()); + Location target = fromLocation.clone().add(direction.getDirection()); if (BlockAPI.PLANAR_SIDES.contains(direction) && !WorldAPI.isBlockLoaded(target)) { event.setCancelled(true); return; @@ -79,9 +82,8 @@ else if (fromHolder instanceof Container) { destReinforcement = ReinforcementLogic.getReinforcementProtecting(target.getBlock()); } else if (destHolder instanceof Container) { - Container container = (Container) destHolder; // [LagFix] Just like the other 'Container' this shouldn't be an issue. - destReinforcement = ReinforcementLogic.getReinforcementProtecting(container.getBlock()); + destReinforcement = ReinforcementLogic.getReinforcementProtecting(destLocation.getBlock()); } // Allow the transfer if neither are reinforced if (fromReinforcement == null && destReinforcement == null) { From ef678b441f4fb44fa703875d1ed7aae24502d192 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 28 Jul 2020 18:16:13 +0200 Subject: [PATCH 223/255] Update to 1.16 --- pom.xml | 10 +++++----- .../civcraft/mc/citadel/listener/EntityListener.java | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 1e066e5b..08aea47c 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ vg.civcraft.mc.citadel Citadel jar - 4.0.2 + 4.1.0 Citadel https://github.com/civclassic/Citadel @@ -22,25 +22,25 @@ org.spigotmc spigot-api - 1.14.4-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided vg.civcraft.mc.civmodcore CivModCore - 1.7.9 + 1.8.0 provided vg.civcraft.mc.namelayer NameLayer - 2.13.1 + 2.14.0 provided com.gmail.filoghost.holographicdisplays holographicdisplays-api - 2.3.2 + 2.4.3 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 8c92dce0..4702c501 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -202,6 +202,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { case OBSTRUCTION: case PHYSICS: case DEFAULT: + case EXPLOSION: return; case ENTITY: { Player player = castOrNull(Player.class, event.getRemover()); From cbdfc4c19779dce8967c0d4b38efd5b44a21ae3b Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 31 Jul 2020 03:45:40 +0200 Subject: [PATCH 224/255] Use proper Jenkinsfile --- Jenkinsfile | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 398580ff..e8fe96e7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,35 +1,46 @@ +@Library('civ_pipeline_lib')_ + pipeline { agent any tools { maven 'Maven 3.6.3' jdk 'Java 8' + } + environment { + civ_dependent_plugins = "FactoryMod JukeAlert RailSwitch SimpleAdminHacks Bastion" } stages { stage ('Build') { steps { - sh 'mvn -U clean install deploy -P civ-jenkins' + civ_build_plugin() } } - stage ('Trigger cascading builds') { - when { - expression { - env.BRANCH_NAME == 'master' - } + stage ('Archive binaries') { + steps { + civ_archive_artifacts() } + } + stage ('Archive javadoc') { steps { - build job: '../FactoryMod/master', wait: false - build job: '../JukeAlert/master', wait: false - build job: '../RailSwitch/master', wait: false - build job: '../SimpleAdminHacks/master', wait: false - build job: '../Bastion/master', wait: false + civ_archive_javadoc() + } + } + stage ('Aggregate reports') { + steps { + civ_aggregate_reports() } } } + post { always { - withCredentials([string(credentialsId: 'civclassic-discord-webhook', variable: 'DISCORD_WEBHOOK')]) { - discordSend description: "**Build:** [${currentBuild.id}](${env.BUILD_URL})\n**Status:** [${currentBuild.currentResult}](${env.BUILD_URL})\n", footer: 'Civclassic Jenkins', link: env.BUILD_URL, successful: currentBuild.resultIsBetterOrEqualTo('SUCCESS'), title: "${env.JOB_NAME} #${currentBuild.id}", webhookURL: DISCORD_WEBHOOK - } + civ_post_always() + } + success { + civ_post_success() + } + failure { + civ_post_failure() } } } From 084b48ce3b5b40eb74cc9eda59354a6731596bf3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 6 Aug 2020 07:44:20 +0200 Subject: [PATCH 225/255] Attempt to improve performance of inventory listener --- .../citadel/listener/InventoryListener.java | 121 ++++++++++-------- 1 file changed, 67 insertions(+), 54 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java index 2b13f554..86f305b3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/InventoryListener.java @@ -1,102 +1,109 @@ package vg.civcraft.mc.citadel.listener; -import java.util.Objects; import org.bukkit.Location; -import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; import org.bukkit.block.Container; -import org.bukkit.block.Dispenser; import org.bukkit.block.DoubleChest; -import org.bukkit.block.Dropper; -import org.bukkit.block.Hopper; -import org.bukkit.block.data.Directional; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryMoveItemEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; + import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.civmodcore.api.BlockAPI; -import vg.civcraft.mc.civmodcore.api.LocationAPI; import vg.civcraft.mc.civmodcore.api.WorldAPI; -import vg.civcraft.mc.civmodcore.util.Iteration; public class InventoryListener implements Listener { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) { Inventory fromInventory = event.getSource(); - Inventory destInventory = event.getDestination(); - // [LagFix] If either inventory's base location is unloaded, just cancel - Location fromLocation = LocationAPI.getBlockLocation(fromInventory.getLocation()); - Location destLocation = LocationAPI.getBlockLocation(destInventory.getLocation()); - if (!WorldAPI.isBlockLoaded(fromLocation) - || !WorldAPI.isBlockLoaded(destLocation)) { - event.setCancelled(true); - return; - } InventoryHolder fromHolder = fromInventory.getHolder(); + boolean isFromBlock = fromHolder instanceof Container; + boolean fromAtChunkBorder = false; + Location fromLocation = null; + if (isFromBlock) { + fromLocation = fromInventory.getLocation(); + fromAtChunkBorder = isAtChunkBorder(fromLocation); + if (fromAtChunkBorder && !WorldAPI.isBlockLoaded(fromLocation)) { + event.setCancelled(true); + return; + } + } + + Inventory destInventory = event.getDestination(); InventoryHolder destHolder = destInventory.getHolder(); - // Determine the reinforcement of the source - Reinforcement fromReinforcement = null; - if (fromHolder instanceof DoubleChest) { - DoubleChest doubleChest = (DoubleChest) fromHolder; - Location chestLocation = LocationAPI.getBlockLocation( - Objects.requireNonNull((Chest) doubleChest.getLeftSide()).getLocation()); - Location otherLocation = LocationAPI.getBlockLocation( - Objects.requireNonNull((Chest) doubleChest.getRightSide()).getLocation()); - // [LagFix] If either side of the double chest is not loaded then the reinforcement cannot be retrieved - // [LagFix] without necessarily loading the chunk to check against reinforcement logic, therefore this - // [LagFix] should err on the side of caution and prevent the transfer. - if (!WorldAPI.isBlockLoaded(chestLocation) || !WorldAPI.isBlockLoaded(otherLocation)) { + boolean isDestBlock = destHolder instanceof Container; + boolean destAtChunkBorder = false; + Location destLocation = null; + if (isDestBlock) { + destLocation = destInventory.getLocation(); + destAtChunkBorder = isAtChunkBorder(destLocation); + if (destAtChunkBorder && !WorldAPI.isBlockLoaded(destLocation)) { event.setCancelled(true); return; } - if (destHolder instanceof Hopper) { - Location drainedLocation = destLocation.clone().add(0, 1, 0); - if (Iteration.contains(drainedLocation, chestLocation, otherLocation)) { - fromReinforcement = ReinforcementLogic.getReinforcementProtecting(drainedLocation.getBlock()); - } + } else { + if (!isFromBlock) { + // neither is a block, just ignore entirely + return; } } - else if (fromHolder instanceof Container) { - // [LagFix] This shouldn't be contributing to lag since there's isn't an implementation of 'Container' that - // [LagFix] spans more than one block, so the 'container.getBlock()' is permissible since we can reasonably - // [LagFix] assume that since this event was called, this block is loaded. + + // Determine the reinforcement of the source + Reinforcement fromReinforcement = null; + if (isFromBlock) { + if (fromAtChunkBorder && fromHolder instanceof DoubleChest) { + DoubleChest doubleChest = (DoubleChest) fromHolder; + Location chestLocation = ((Chest) doubleChest.getLeftSide()).getLocation(); + Location otherLocation = ((Chest) doubleChest.getRightSide()).getLocation(); + // [LagFix] If either side of the double chest is not loaded then the + // reinforcement cannot be retrieved + // [LagFix] without necessarily loading the chunk to check against reinforcement + // logic, therefore this + // [LagFix] should err on the side of caution and prevent the transfer. + if (!WorldAPI.isBlockLoaded(chestLocation) || !WorldAPI.isBlockLoaded(otherLocation)) { + event.setCancelled(true); + return; + } + } fromReinforcement = ReinforcementLogic.getReinforcementProtecting(fromLocation.getBlock()); } // Determine the reinforcement of the destination Reinforcement destReinforcement = null; - if (fromHolder instanceof Hopper || fromHolder instanceof Dropper || fromHolder instanceof Dispenser) { - BlockFace direction = ((Directional) fromLocation.getBlock().getBlockData()).getFacing(); - // [LagFix] If the transfer is happening laterally and the target location is not loaded, then err on the - // [LagFix] side of caution and prevent the transfer.. though this may cause some issues with dispensers - // [LagFix] and droppers. - Location target = fromLocation.clone().add(direction.getDirection()); - if (BlockAPI.PLANAR_SIDES.contains(direction) && !WorldAPI.isBlockLoaded(target)) { - event.setCancelled(true); - return; + if (isDestBlock) { + if (destAtChunkBorder && destHolder instanceof DoubleChest) { + DoubleChest doubleChest = (DoubleChest) destHolder; + Location chestLocation = ((Chest) doubleChest.getLeftSide()).getLocation(); + Location otherLocation = ((Chest) doubleChest.getRightSide()).getLocation(); + // [LagFix] If either side of the double chest is not loaded then the + // reinforcement cannot be retrieved + // [LagFix] without necessarily loading the chunk to check against reinforcement + // logic, therefore this + // [LagFix] should err on the side of caution and prevent the transfer. + if (!WorldAPI.isBlockLoaded(chestLocation) || !WorldAPI.isBlockLoaded(otherLocation)) { + event.setCancelled(true); + return; + } } - destReinforcement = ReinforcementLogic.getReinforcementProtecting(target.getBlock()); - } - else if (destHolder instanceof Container) { - // [LagFix] Just like the other 'Container' this shouldn't be an issue. destReinforcement = ReinforcementLogic.getReinforcementProtecting(destLocation.getBlock()); } // Allow the transfer if neither are reinforced if (fromReinforcement == null && destReinforcement == null) { return; } - // Allow the transfer if the destination is un-reinforced and the source is insecure + // Allow the transfer if the destination is un-reinforced and the source is + // insecure if (destReinforcement == null) { if (!fromReinforcement.isInsecure()) { event.setCancelled(true); } return; } - // Allow the transfer if the source is un-reinforced and the destination is insecure + // Allow the transfer if the source is un-reinforced and the destination is + // insecure if (fromReinforcement == null) { if (!destReinforcement.isInsecure()) { event.setCancelled(true); @@ -113,5 +120,11 @@ else if (destHolder instanceof Container) { } event.setCancelled(true); } + + private static boolean isAtChunkBorder(Location location) { + int xShif = location.getBlockX() & 15; + int zShif = location.getBlockZ() & 15; + return xShif == 0 || xShif == 15 || zShif == 0 || zShif == 15; + } } From a5ead0553e1d41397ce90f60b3caba2021f31d1f Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 3 Sep 2020 20:55:23 +0200 Subject: [PATCH 226/255] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e8fe96e7..2cb11c23 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ pipeline { jdk 'Java 8' } environment { - civ_dependent_plugins = "FactoryMod JukeAlert RailSwitch SimpleAdminHacks Bastion" + civ_dependent_plugins = "FactoryMod JukeAlert RailSwitch SimpleAdminHacks Bastion Brewery" } stages { stage ('Build') { From 3a3f95c677d306910175c4b8f2320e6fb3b6586b Mon Sep 17 00:00:00 2001 From: Scuwr Date: Thu, 1 Oct 2020 20:26:35 -0400 Subject: [PATCH 227/255] Updated Legacy Support Config for 1.16 --- .../mc/citadel/ReinforcementLogic.java | 1 + src/main/resources/config.yml | 46 +++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index d8e5525f..2fa7d5ba 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -143,6 +143,7 @@ public static Reinforcement getReinforcementProtecting(Block block) { * @param block Block to get responsible block for * @return Block which reinforcement would protect the given block */ + public static Block getResponsibleBlock(Block block) { // Do not put [double] chests in here. switch (block.getType()) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 857ed705..89719f36 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -19,6 +19,7 @@ debug: true reinforcements: stone: + id: 1 item: ==: org.bukkit.inventory.ItemStack type: STONE @@ -31,6 +32,7 @@ reinforcements: name: Stone hit_points: 50 iron: + id: 2 item: ==: org.bukkit.inventory.ItemStack type: IRON_INGOT @@ -43,6 +45,7 @@ reinforcements: name: Iron hit_points: 300 diamond: + id: 3 item: ==: org.bukkit.inventory.ItemStack type: DIAMOND @@ -55,6 +58,7 @@ reinforcements: name: Diamond hit_points: 2000 bedrock: + id: 4 item: ==: org.bukkit.inventory.ItemStack type: BEDROCK @@ -69,30 +73,46 @@ reinforcements: non_reinforceables: - BEDROCK - - ENDER_PORTAL_FRAME - - SAPLING - - LONG_GRASS + - END_PORTAL_FRAME + - JUNGLE_SAPLING + - OAK_SAPLING + - SPRUCE_SAPLING + - BIRCH_SAPLING + - ACACIA_SAPLING + - DARK_OAK_SAPLING + - BAMBOO_SAPLING + - TALL_GRASS - DEAD_BUSH - - PISTON_EXTENSION - - PISTON_MOVING_PIECE - - RED_ROSE - - YELLOW_FLOWER + - PISTON_HEAD + - MOVING_PISTON + - POPPY + - DANDELION - BROWN_MUSHROOM - RED_MUSHROOM - TNT - - CROPS + - WHEAT + - BEETROOT + - CARROTS + - POTATOES + - BAMBOO + - SUGAR_CANE + - SWEET_BERRIES + - BROWN_MUSHROOM + - RED_MUSHROOM + - KELP + - SEA_PICKLE + - NETHER_WART + - CHORUS_FRUIT - FIRE - SNOW - ICE - CACTUS - - SUGAR_CANE_BLOCK - - PORTAL - - CAKE_BLOCK + - NETHER_PORTAL + - CAKE - PUMPKIN_STEM - MELON_STEM - VINE - - NETHER_WARTS - - ENDER_PORTAL + - END_PORTAL acidblock_material: - GOLD_BLOCK From 5092a922368a44cda4fee5dfa4ee192161408998 Mon Sep 17 00:00:00 2001 From: Scuwr Date: Thu, 1 Oct 2020 21:56:53 -0400 Subject: [PATCH 228/255] Updated deprecated method calls --- .../mc/citadel/listener/BlockListener.java | 7 ++-- .../mc/citadel/listener/RedstoneListener.java | 4 +-- src/main/resources/config.yml | 32 +++++++++---------- src/main/resources/plugin.yml | 3 +- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index bec74258..cc68e4fd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -30,7 +30,6 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.civmodcore.api.MaterialAPI; -import vg.civcraft.mc.civmodcore.api.ToolAPI; import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; public class BlockListener implements Listener { @@ -254,7 +253,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isAxe(relevant.getType())) { + if (!MaterialAPI.isAxe(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); @@ -290,7 +289,7 @@ public void preventTilingGrass(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isShovel(relevant.getType())) { + if (!MaterialAPI.isShovel(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); @@ -328,7 +327,7 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isHoe(relevant.getType())) { + if (!MaterialAPI.isHoe(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 0cb3773b..17a67047 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -100,7 +100,7 @@ public void pressButton(PlayerInteractEvent e) { Block attachedBlock; // needs special handling because buttons attached to ceiling and ground can be // turned in which case the facing direction indicates this direction - switch (button.getFace()) { + switch (button.getAttachedFace()) { case CEILING: attachedBlock = e.getClickedBlock().getRelative(BlockFace.UP); break; @@ -111,7 +111,7 @@ public void pressButton(PlayerInteractEvent e) { attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); break; default: - Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getFace()); + Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getAttachedFace()); return; } // prepare all sides of button itself diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 89719f36..253e7143 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -24,7 +24,7 @@ reinforcements: ==: org.bukkit.inventory.ItemStack type: STONE effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 5m @@ -37,7 +37,7 @@ reinforcements: ==: org.bukkit.inventory.ItemStack type: IRON_INGOT effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 30m @@ -50,7 +50,7 @@ reinforcements: ==: org.bukkit.inventory.ItemStack type: DIAMOND effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 4h @@ -63,7 +63,7 @@ reinforcements: ==: org.bukkit.inventory.ItemStack type: BEDROCK effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 1s @@ -122,15 +122,15 @@ hangers_inherit_reinforcement: false # reinforcement_damageMultiplier is m where BlockDamage = 2 ^ (n/m) where n is equal to the number of days the group has been inactive reinforcement_damageMultiplier: 365 -#database: -# ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource -# plugin: Citadel -# user: username -# password: squidLover69 -# host: localhost -# port: 3306 -# database: citadel -# poolsize: 5 -# connection_timeout: 10000 -# idle_timeout: 600000 -# max_lifetime: 7200000 \ No newline at end of file +database: + ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource + plugin: Citadel + user: 'mc_namelayer' + password: 'minecraft' + host: localhost + port: 3306 + database: namelayer + poolsize: 5 + connection_timeout: 10000 + idle_timeout: 600000 + max_lifetime: 7200000 \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 674d1427..f9250c3f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -10,6 +10,7 @@ authors: - FeatherCrown - Lazersmoke - TealNerd +- Scuwr depend: - NameLayer - CivModCore @@ -132,4 +133,4 @@ commands: permissions: citadel.admin: default: op -api-version: 1.14 +api-version: 1.16 From 9337adf3c6f40afa4811db07239869050c2d0555 Mon Sep 17 00:00:00 2001 From: Scuwr Date: Sat, 3 Oct 2020 12:32:59 -0400 Subject: [PATCH 229/255] Added data version to ItemStack; plugin no longer invokes Legacy Material Support mode --- src/main/resources/config.yml | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 253e7143..076d723c 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -22,6 +22,7 @@ reinforcements: id: 1 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: STONE effect: type: ENCHANTING_TABLE @@ -35,6 +36,7 @@ reinforcements: id: 2 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: IRON_INGOT effect: type: ENCHANTING_TABLE @@ -48,6 +50,7 @@ reinforcements: id: 3 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: DIAMOND effect: type: ENCHANTING_TABLE @@ -61,6 +64,7 @@ reinforcements: id: 4 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: BEDROCK effect: type: ENCHANTING_TABLE @@ -122,15 +126,15 @@ hangers_inherit_reinforcement: false # reinforcement_damageMultiplier is m where BlockDamage = 2 ^ (n/m) where n is equal to the number of days the group has been inactive reinforcement_damageMultiplier: 365 -database: - ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource - plugin: Citadel - user: 'mc_namelayer' - password: 'minecraft' - host: localhost - port: 3306 - database: namelayer - poolsize: 5 - connection_timeout: 10000 - idle_timeout: 600000 - max_lifetime: 7200000 \ No newline at end of file +#database: +# ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource +# plugin: Citadel +# user: 'mc_namelayer' +# password: 'minecraft' +# host: localhost +# port: 3306 +# database: namelayer +# poolsize: 5 +# connection_timeout: 10000 +# idle_timeout: 600000 +# max_lifetime: 7200000 \ No newline at end of file From 602c6b1eae94d88c8e9bd703a96692e69b0c7b8e Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 27 Oct 2020 16:11:07 +0000 Subject: [PATCH 230/255] Add Blackstone Pad to Redstone Check --- .../vg/civcraft/mc/citadel/listener/RedstoneListener.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 0cb3773b..6f46f0a2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -202,8 +202,9 @@ public void stepPressurePlate(PlayerInteractEvent e) { return; } Material mat = e.getClickedBlock().getType(); - if (mat != Material.STONE_PRESSURE_PLATE && mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE - && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { + if (mat != Material.STONE_PRESSURE_PLATE && mat != Material.POLISHED_BLACKSTONE_PRESSURE_PLATE && + mat != Material.LIGHT_WEIGHTED_PRESSURE_PLATE && mat != Material.HEAVY_WEIGHTED_PRESSURE_PLATE + && !Tag.WOODEN_PRESSURE_PLATES.isTagged(mat)) { return; } setupAdjacentDoors(e.getPlayer(), e.getClickedBlock(), BlockFace.EAST_SOUTH_EAST); From 32d457c814a8348d6612ec6a0d3ec7938e2f65ee Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 27 Oct 2020 17:26:51 +0000 Subject: [PATCH 231/255] Fix plants missing off inheriting block reinforcement --- .../mc/citadel/ReinforcementLogic.java | 188 +++++++++++------- 1 file changed, 114 insertions(+), 74 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index d8e5525f..b1a469a1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -146,83 +146,123 @@ public static Reinforcement getReinforcementProtecting(Block block) { public static Block getResponsibleBlock(Block block) { // Do not put [double] chests in here. switch (block.getType()) { - case DANDELION: - case POPPY: - case BLUE_ORCHID: - case ALLIUM: - case AZURE_BLUET: - case ORANGE_TULIP: - case RED_TULIP: - case PINK_TULIP: - case WHITE_TULIP: - case OXEYE_DAISY: - case ACACIA_SAPLING: - case BIRCH_SAPLING: - case DARK_OAK_SAPLING: - case JUNGLE_SAPLING: - case OAK_SAPLING: - case SPRUCE_SAPLING: - case WHEAT: - case CARROTS: - case POTATOES: - case BEETROOTS: - case MELON_STEM: - case PUMPKIN_STEM: - case ATTACHED_MELON_STEM: - case ATTACHED_PUMPKIN_STEM: - case NETHER_WART_BLOCK: { - return block.getRelative(BlockFace.DOWN); - } - case SUGAR_CANE: - case CACTUS: - case SUNFLOWER: - case LILAC: - case PEONY: { - // scan downwards for first different block - Block below = block.getRelative(BlockFace.DOWN); - while (below.getType() == block.getType()) { - below = below.getRelative(BlockFace.DOWN); - } - return below; - } - case ACACIA_DOOR: - case BIRCH_DOOR: - case DARK_OAK_DOOR: - case IRON_DOOR: - case SPRUCE_DOOR: - case JUNGLE_DOOR: - case OAK_DOOR: { - if (block.getRelative(BlockFace.UP).getType() != block.getType()) { - // block is upper half of a door + case DANDELION: + case POPPY: + case BLUE_ORCHID: + case ALLIUM: + case AZURE_BLUET: + case ORANGE_TULIP: + case RED_TULIP: + case PINK_TULIP: + case WHITE_TULIP: + case OXEYE_DAISY: + case ACACIA_SAPLING: + case BIRCH_SAPLING: + case DARK_OAK_SAPLING: + case JUNGLE_SAPLING: + case OAK_SAPLING: + case SPRUCE_SAPLING: + case WARPED_FUNGUS: + case CRIMSON_FUNGUS: + case WHEAT: + case CARROTS: + case POTATOES: + case BEETROOTS: + case MELON_STEM: + case PUMPKIN_STEM: + case ATTACHED_MELON_STEM: + case ATTACHED_PUMPKIN_STEM: + case WARPED_ROOTS: + case CRIMSON_ROOTS: + case NETHER_SPROUTS: + case WITHER_ROSE: + case LILY_OF_THE_VALLEY: + case CORNFLOWER: + case SEA_PICKLE: + case FERN: + case GRASS: + case SEAGRASS: + case TUBE_CORAL: + case BRAIN_CORAL: + case BUBBLE_CORAL: + case FIRE_CORAL: + case HORN_CORAL: + case DEAD_TUBE_CORAL: + case DEAD_BRAIN_CORAL: + case DEAD_BUBBLE_CORAL: + case DEAD_FIRE_CORAL: + case DEAD_HORN_CORAL: + case NETHER_WART_BLOCK: { return block.getRelative(BlockFace.DOWN); } - return block; - } - case BLACK_BED: - case BLUE_BED: - case BROWN_BED: - case CYAN_BED: - case GRAY_BED: - case GREEN_BED: - case MAGENTA_BED: - case LIME_BED: - case ORANGE_BED: - case PURPLE_BED: - case PINK_BED: - case WHITE_BED: - case LIGHT_GRAY_BED: - case LIGHT_BLUE_BED: - case RED_BED: - case YELLOW_BED: { - Bed bed = (Bed) block.getBlockData(); - if (bed.getPart() == Bed.Part.HEAD) { - return block.getRelative(bed.getFacing().getOppositeFace()); + case SUGAR_CANE: + case BAMBOO: + case ROSE_BUSH: + case TWISTING_VINES_PLANT: + case CACTUS: + case SUNFLOWER: + case LILAC: + case TALL_GRASS: + case LARGE_FERN: + case TALL_SEAGRASS: + case PEONY: { + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType()) { + below = below.getRelative(BlockFace.DOWN); + } + return below; + } + case ACACIA_DOOR: + case BIRCH_DOOR: + case DARK_OAK_DOOR: + case IRON_DOOR: + case SPRUCE_DOOR: + case JUNGLE_DOOR: + case OAK_DOOR: { + if (block.getRelative(BlockFace.UP).getType() != block.getType()) { + // block is upper half of a door + return block.getRelative(BlockFace.DOWN); + } + return block; + } + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case MAGENTA_BED: + case LIME_BED: + case ORANGE_BED: + case PURPLE_BED: + case PINK_BED: + case WHITE_BED: + case LIGHT_GRAY_BED: + case LIGHT_BLUE_BED: + case RED_BED: + case YELLOW_BED: { + Bed bed = (Bed) block.getBlockData(); + if (bed.getPart() == Bed.Part.HEAD) { + return block.getRelative(bed.getFacing().getOppositeFace()); + } + return block; + } + case TUBE_CORAL_FAN: + case BRAIN_CORAL_FAN: + case BUBBLE_CORAL_FAN: + case FIRE_CORAL_FAN: + case HORN_CORAL_FAN: + case DEAD_TUBE_CORAL_FAN: + case DEAD_BRAIN_CORAL_FAN: + case DEAD_BUBBLE_CORAL_FAN: + case DEAD_FIRE_CORAL_FAN: + case DEAD_HORN_CORAL_FAN: { + return block.getRelative(block.getFace(block).getOppositeFace()); + } + default: { + return block; } - return block; - } - default: { - return block; - } } } From d8422654f44b41f803740c15b691422a0c158d6e Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 27 Oct 2020 19:11:59 +0000 Subject: [PATCH 232/255] Update default config + finish up --- .../mc/citadel/ReinforcementLogic.java | 48 ++++++-- src/main/resources/config.yml | 110 +++++++++++++++--- 2 files changed, 133 insertions(+), 25 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index b1a469a1..87a0fabc 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -164,6 +164,8 @@ public static Block getResponsibleBlock(Block block) { case SPRUCE_SAPLING: case WARPED_FUNGUS: case CRIMSON_FUNGUS: + case BAMBOO_SAPLING: + case TWISTING_VINES: case WHEAT: case CARROTS: case POTATOES: @@ -180,18 +182,29 @@ public static Block getResponsibleBlock(Block block) { case CORNFLOWER: case SEA_PICKLE: case FERN: + case KELP: case GRASS: case SEAGRASS: case TUBE_CORAL: + case TUBE_CORAL_FAN: case BRAIN_CORAL: + case BRAIN_CORAL_FAN: case BUBBLE_CORAL: + case BUBBLE_CORAL_FAN: case FIRE_CORAL: + case FIRE_CORAL_FAN: case HORN_CORAL: + case HORN_CORAL_FAN: case DEAD_TUBE_CORAL: + case DEAD_TUBE_CORAL_FAN: case DEAD_BRAIN_CORAL: + case DEAD_BRAIN_CORAL_FAN: case DEAD_BUBBLE_CORAL: + case DEAD_BUBBLE_CORAL_FAN: case DEAD_FIRE_CORAL: + case DEAD_FIRE_CORAL_FAN: case DEAD_HORN_CORAL: + case DEAD_HORN_CORAL_FAN: case NETHER_WART_BLOCK: { return block.getRelative(BlockFace.DOWN); } @@ -205,6 +218,7 @@ public static Block getResponsibleBlock(Block block) { case TALL_GRASS: case LARGE_FERN: case TALL_SEAGRASS: + case KELP_PLANT: case PEONY: { // scan downwards for first different block Block below = block.getRelative(BlockFace.DOWN); @@ -248,17 +262,29 @@ public static Block getResponsibleBlock(Block block) { } return block; } - case TUBE_CORAL_FAN: - case BRAIN_CORAL_FAN: - case BUBBLE_CORAL_FAN: - case FIRE_CORAL_FAN: - case HORN_CORAL_FAN: - case DEAD_TUBE_CORAL_FAN: - case DEAD_BRAIN_CORAL_FAN: - case DEAD_BUBBLE_CORAL_FAN: - case DEAD_FIRE_CORAL_FAN: - case DEAD_HORN_CORAL_FAN: { - return block.getRelative(block.getFace(block).getOppositeFace()); + case TUBE_CORAL_WALL_FAN: + case BRAIN_CORAL_WALL_FAN: + case BUBBLE_CORAL_WALL_FAN: + case FIRE_CORAL_WALL_FAN: + case HORN_CORAL_WALL_FAN: + case DEAD_TUBE_CORAL_WALL_FAN: + case DEAD_BRAIN_CORAL_WALL_FAN: + case DEAD_BUBBLE_CORAL_WALL_FAN: + case DEAD_FIRE_CORAL_WALL_FAN: + case DEAD_HORN_CORAL_WALL_FAN: { + CoralWallFan cwf = (CoralWallFan) block.getBlockData(); + return block.getRelative(cwf.getFacing().getOppositeFace()); + } + case WEEPING_VINES: { + block.getRelative(BlockFace.UP); + } + case WEEPING_VINES_PLANT: { + // scan upwards + Block above = block.getRelative(BlockFace.UP); + while (above.getType() == block.getType()) { + above = above.getRelative(BlockFace.UP); + } + return above; } default: { return block; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 857ed705..df078c49 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -69,31 +69,113 @@ reinforcements: non_reinforceables: - BEDROCK - - ENDER_PORTAL_FRAME - - SAPLING - - LONG_GRASS + - END_PORTAL + - END_PORTAL_FRAME + - OAK_SAPLING + - BIRCH_SAPLING + - SPRUCE_SAPLING + - JUNGLE_SAPLING + - DARK_OAK_SAPLING + - ACACIA_SAPLING + - BAMBOO_SAPLING + - TALL_GRASS - DEAD_BUSH - - PISTON_EXTENSION - - PISTON_MOVING_PIECE - - RED_ROSE - - YELLOW_FLOWER + - PISTON + - MOVING_PISTON + - PISTON_HEAD + - POPPY + - DANDELION + - BLUE_ORCHID + - ALLIUM + - RED_TULIP + - ORANGE_TULIP + - WHITE_TULIP + - PINK_TULIP + - OXEYE_DAISY + - CORNFLOWER + - LILY_OF_THE_VALLEY + - SUNFLOWER + - SEA_PICKLE + - LILAC + - PEONY + - ROSE_BUSH - BROWN_MUSHROOM - RED_MUSHROOM + - CRIMSON_FUNGUS + - WARPED_FUNGUS + - CRIMSON_ROOTS + - WARPED_ROOTS + - NETHER_SPROUTS + - WEEPING_VINES + - TWISTING_VINES + - TWISTING_VINES_PLANT + - WEEPING_VINES_PLANT - TNT - - CROPS + - WHEAT + - BEETROOTS + - POTATOES + - CARROTS + - FERN + - LARGE_FERN + - GRASS + - SEAGRASS + - TALL_SEAGRASS - FIRE + - SOUL_FIRE - SNOW - ICE - CACTUS - - SUGAR_CANE_BLOCK + - SUGAR_CANE + - KELP + - KELP_PLANT + - BAMBOO - PORTAL - - CAKE_BLOCK + - CAKE - PUMPKIN_STEM - MELON_STEM - VINE - - NETHER_WARTS - - ENDER_PORTAL - + - NETHER_WART + - BRAIN_CORAL + - BRAIN_CORAL_BLOCK + - BRAIN_CORAL_FAN + - BRAIN_CORAL_WALL_FAN + - BUBBLE_CORAL + - BUBBLE_CORAL_BLOCK + - BUBBLE_CORAL_FAN + - BUBBLE_CORAL_WALL_FAN + - FIRE_CORAL + - FIRE_CORAL_BLOCK + - FIRE_CORAL_FAN + - FIRE_CORAL_WALL_FAN + - HORN_CORAL + - HORN_CORAL_BLOCK + - HORN_CORAL_FAN + - HORN_CORAL_WALL_FAN + - TUBE_CORAL + - TUBE_CORAL_BLOCK + - TUBE_CORAL_FAN + - TUBE_CORAL_WALL_FAN + - DEAD_BRAIN_CORAL + - DEAD_BRAIN_CORAL_BLOCK + - DEAD_BRAIN_CORAL_FAN + - DEAD_BRAIN_CORAL_WALL_FAN + - DEAD_BUBBLE_CORAL + - DEAD_BUBBLE_CORAL_BLOCK + - DEAD_BUBBLE_CORAL_FAN + - DEAD_BUBBLE_CORAL_WALL_FAN + - DEAD_FIRE_CORAL + - DEAD_FIRE_CORAL_BLOCK + - DEAD_FIRE_CORAL_FAN + - DEAD_FIRE_CORAL_WALL_FAN + - DEAD_HORN_CORAL + - DEAD_HORN_CORAL_BLOCK + - DEAD_HORN_CORAL_FAN + - DEAD_HORN_CORAL_WALL_FAN + - DEAD_TUBE_CORAL + - DEAD_TUBE_CORAL_BLOCK + - DEAD_TUBE_CORAL_FAN + - DEAD_TUBE_CORAL_WALL_FAN + - SCAFFOLDING acidblock_material: - GOLD_BLOCK @@ -113,4 +195,4 @@ reinforcement_damageMultiplier: 365 # poolsize: 5 # connection_timeout: 10000 # idle_timeout: 600000 -# max_lifetime: 7200000 \ No newline at end of file +# max_lifetime: 7200000 From 0fccee37b736a9173bf13cf481696a3e102b86cc Mon Sep 17 00:00:00 2001 From: Diet Cola Date: Tue, 27 Oct 2020 19:23:33 +0000 Subject: [PATCH 233/255] Merge branch 'master' into plantreinforcements --- .../mc/citadel/ReinforcementLogic.java | 1 + .../mc/citadel/listener/BlockListener.java | 7 ++-- .../mc/citadel/listener/RedstoneListener.java | 4 +- src/main/resources/config.yml | 37 +++++++++++++------ src/main/resources/plugin.yml | 3 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 87a0fabc..70b14ee9 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -143,6 +143,7 @@ public static Reinforcement getReinforcementProtecting(Block block) { * @param block Block to get responsible block for * @return Block which reinforcement would protect the given block */ + public static Block getResponsibleBlock(Block block) { // Do not put [double] chests in here. switch (block.getType()) { diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index bec74258..cc68e4fd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -30,7 +30,6 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.BlockAPI; import vg.civcraft.mc.civmodcore.api.MaterialAPI; -import vg.civcraft.mc.civmodcore.api.ToolAPI; import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; public class BlockListener implements Listener { @@ -254,7 +253,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isAxe(relevant.getType())) { + if (!MaterialAPI.isAxe(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); @@ -290,7 +289,7 @@ public void preventTilingGrass(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isShovel(relevant.getType())) { + if (!MaterialAPI.isShovel(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); @@ -328,7 +327,7 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { } else { relevant = p.getInventory().getItemInOffHand(); } - if (!ToolAPI.isHoe(relevant.getType())) { + if (!MaterialAPI.isHoe(relevant.getType())) { return; } Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 6f46f0a2..4ff89aaf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -100,7 +100,7 @@ public void pressButton(PlayerInteractEvent e) { Block attachedBlock; // needs special handling because buttons attached to ceiling and ground can be // turned in which case the facing direction indicates this direction - switch (button.getFace()) { + switch (button.getAttachedFace()) { case CEILING: attachedBlock = e.getClickedBlock().getRelative(BlockFace.UP); break; @@ -111,7 +111,7 @@ public void pressButton(PlayerInteractEvent e) { attachedBlock = e.getClickedBlock().getRelative(button.getFacing().getOppositeFace()); break; default: - Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getFace()); + Citadel.getInstance().getLogger().warning("Could not handle button face " + button.getAttachedFace()); return; } // prepare all sides of button itself diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index df078c49..c4909cfe 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -19,11 +19,13 @@ debug: true reinforcements: stone: + id: 1 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: STONE effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 5m @@ -31,11 +33,13 @@ reinforcements: name: Stone hit_points: 50 iron: + id: 2 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: IRON_INGOT effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 30m @@ -43,11 +47,13 @@ reinforcements: name: Iron hit_points: 300 diamond: + id: 3 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: DIAMOND effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 4h @@ -55,11 +61,13 @@ reinforcements: name: Diamond hit_points: 2000 bedrock: + id: 4 item: ==: org.bukkit.inventory.ItemStack + v: 1 type: BEDROCK effect: - type: ENCHANTMENT_TABLE + type: ENCHANTING_TABLE speed: 0.5 particleCount: 50 mature_time: 1s @@ -120,21 +128,26 @@ non_reinforceables: - GRASS - SEAGRASS - TALL_SEAGRASS + - BAMBOO + - SUGAR_CANE + - SWEET_BERRIES + - BROWN_MUSHROOM + - RED_MUSHROOM + - KELP + - SEA_PICKLE + - NETHER_WART + - CHORUS_FRUIT - FIRE - SOUL_FIRE - SNOW - ICE - CACTUS - - SUGAR_CANE - - KELP - KELP_PLANT - - BAMBOO - - PORTAL + - NETHER_PORTAL - CAKE - PUMPKIN_STEM - MELON_STEM - VINE - - NETHER_WART - BRAIN_CORAL - BRAIN_CORAL_BLOCK - BRAIN_CORAL_FAN @@ -187,11 +200,11 @@ reinforcement_damageMultiplier: 365 #database: # ==: vg.civcraft.mc.civmodcore.dao.ManagedDatasource # plugin: Citadel -# user: username -# password: squidLover69 +# user: 'mc_namelayer' +# password: 'minecraft' # host: localhost # port: 3306 -# database: citadel +# database: namelayer # poolsize: 5 # connection_timeout: 10000 # idle_timeout: 600000 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 674d1427..f9250c3f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -10,6 +10,7 @@ authors: - FeatherCrown - Lazersmoke - TealNerd +- Scuwr depend: - NameLayer - CivModCore @@ -132,4 +133,4 @@ commands: permissions: citadel.admin: default: op -api-version: 1.14 +api-version: 1.16 From 13f06537e649000f8283a204bc2133256d682edc Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 27 Oct 2020 16:11:07 +0000 Subject: [PATCH 234/255] Add Blackstone Pad to Redstone Check From 3c1e4cc44e0cc7e8011fca93426b0b76792c0a57 Mon Sep 17 00:00:00 2001 From: Diet Cola Date: Tue, 27 Oct 2020 19:23:33 +0000 Subject: [PATCH 235/255] Merge branch 'master' into plantreinforcements From 215da3bc0b856b679f51ab225cb8166ab6af6fe0 Mon Sep 17 00:00:00 2001 From: Cola Date: Thu, 29 Oct 2020 13:53:14 +0000 Subject: [PATCH 236/255] Add Sweet berry bushes Theres always one... --- .../mc/citadel/ReinforcementLogic.java | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 70b14ee9..b624a65e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -1,12 +1,14 @@ package vg.civcraft.mc.citadel; import java.util.Objects; + import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.type.Bed; import org.bukkit.block.data.type.Chest; +import org.bukkit.block.data.type.CoralWallFan; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; @@ -25,7 +27,7 @@ private ReinforcementLogic() { /** * Inserts a new reinforcements into the cache, queues it for persistence and * plays particle effects for creation - * + * * @param rein Reinforcement just created */ public static void createReinforcement(Reinforcement rein) { @@ -36,7 +38,7 @@ public static void createReinforcement(Reinforcement rein) { } public static Reinforcement callReinforcementCreationEvent(Player player, Block block, ReinforcementType type, - Group group) { + Group group) { Reinforcement rein = new Reinforcement(block.getLocation(), type, group); ReinforcementCreationEvent event = new ReinforcementCreationEvent(player, rein); Bukkit.getPluginManager().callEvent(event); @@ -98,38 +100,38 @@ public static Reinforcement getReinforcementProtecting(Block block) { return reinforcement; } switch (block.getType()) { - // Chests are awkward since you can place both sides of a double chest - // independently, which isn't true for - // beds, plants, or doors, so this needs to be accounted for and - // "getResponsibleBlock()" isn't appropriate - // for the following logic: that both sides protect each other; that if either - // block is reinforced, then - // the chest as a whole remains protected. - case CHEST: - case TRAPPED_CHEST: { - Chest chest = (Chest) block.getBlockData(); - BlockFace facing = chest.getFacing(); - switch (chest.getType()) { - case LEFT: { - BlockFace face = BlockAPI.turnClockwise(facing); - return getReinforcementAt(block.getLocation().add(face.getDirection())); - } - case RIGHT: { - BlockFace face = BlockAPI.turnAntiClockwise(facing); - return getReinforcementAt(block.getLocation().add(face.getDirection())); + // Chests are awkward since you can place both sides of a double chest + // independently, which isn't true for + // beds, plants, or doors, so this needs to be accounted for and + // "getResponsibleBlock()" isn't appropriate + // for the following logic: that both sides protect each other; that if either + // block is reinforced, then + // the chest as a whole remains protected. + case CHEST: + case TRAPPED_CHEST: { + Chest chest = (Chest) block.getBlockData(); + BlockFace facing = chest.getFacing(); + switch (chest.getType()) { + case LEFT: { + BlockFace face = BlockAPI.turnClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); + } + case RIGHT: { + BlockFace face = BlockAPI.turnAntiClockwise(facing); + return getReinforcementAt(block.getLocation().add(face.getDirection())); + } + default: { + return null; + } + } } default: { - return null; - } - } - } - default: { - Block responsible = getResponsibleBlock(block); - if (Objects.equals(block, responsible)) { - return null; + Block responsible = getResponsibleBlock(block); + if (Objects.equals(block, responsible)) { + return null; + } + return getReinforcementAt(responsible.getLocation()); } - return getReinforcementAt(responsible.getLocation()); - } } } @@ -143,7 +145,7 @@ public static Reinforcement getReinforcementProtecting(Block block) { * @param block Block to get responsible block for * @return Block which reinforcement would protect the given block */ - + public static Block getResponsibleBlock(Block block) { // Do not put [double] chests in here. switch (block.getType()) { @@ -171,6 +173,7 @@ public static Block getResponsibleBlock(Block block) { case CARROTS: case POTATOES: case BEETROOTS: + case SWEET_BERRY_BUSH: case MELON_STEM: case PUMPKIN_STEM: case ATTACHED_MELON_STEM: @@ -300,7 +303,7 @@ public static Block getResponsibleBlock(Block block) { * @param player the player attempting to access stuff * @param block Block to check for * @return True if the player can not do something like placing an adjacent - * chest or comparator, false otherwise + * chest or comparator, false otherwise */ public static boolean isPreventingBlockAccess(Player player, Block block) { if (block == null) { From 0ddf4b743560b0776ab4912b2b7580e8282a0d57 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sun, 1 Nov 2020 11:41:53 -0500 Subject: [PATCH 237/255] Stop explosions breaking reinforced hanging entities --- .../mc/citadel/listener/EntityListener.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 4702c501..70f94caa 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -26,6 +26,7 @@ import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; @@ -129,7 +130,7 @@ private List getGolemBlocks(EntityType type, Block base) { public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); - + new BukkitRunnable() { @Override @@ -228,6 +229,26 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { event.setCancelled(true); } + @EventHandler(priority = EventPriority.HIGHEST) + public void HangingBreakEvent(HangingBreakEvent event) { + if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { + return; + } + if (event.getCause() != HangingBreakEvent.RemoveCause.EXPLOSION){ + return; + } + Hanging entity = event.getEntity(); + Block host = entity.getLocation().getBlock().getRelative(entity.getAttachedFace()); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(host); + if (reinforcement == null) { + return; + } + if (reinforcement.isInsecure()) { + return; + } + event.setCancelled(true); + } + @EventHandler(priority = EventPriority.HIGHEST) public void entityDamageEvent(EntityDamageByEntityEvent event) { if (!Citadel.getInstance().getConfigManager().doHangersInheritReinforcements()) { From e365925d12bc3630e4878e182158126dee09f455 Mon Sep 17 00:00:00 2001 From: Cola Date: Wed, 25 Nov 2020 06:40:01 +0000 Subject: [PATCH 238/255] Add isOccluding check to acid blocks --- src/main/java/vg/civcraft/mc/citadel/command/Acid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 8f395487..81e09eac 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -36,7 +36,7 @@ public boolean execute(CommandSender sender, String[] args) { boolean foundAny = false; while (itr.hasNext()) { Block block = itr.next(); - if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid())) { + if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid()) || (!block.getType().isOccluding())) { continue; } if (!acidMan.isPossibleAcidBlock(block)) { From 104a78098517e1192da1d4ab7b9652a788d909c9 Mon Sep 17 00:00:00 2001 From: Cola Date: Wed, 25 Nov 2020 06:41:50 +0000 Subject: [PATCH 239/255] Move ! --- src/main/java/vg/civcraft/mc/citadel/command/Acid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 81e09eac..d7150dfe 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -36,7 +36,7 @@ public boolean execute(CommandSender sender, String[] args) { boolean foundAny = false; while (itr.hasNext()) { Block block = itr.next(); - if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid()) || (!block.getType().isOccluding())) { + if (MaterialAPI.isAir(block.getType()) || !(block.getType().isSolid()) || !(block.getType().isOccluding())) { continue; } if (!acidMan.isPossibleAcidBlock(block)) { From 92368bfc681d8198e109b904366877dbf56f5d3e Mon Sep 17 00:00:00 2001 From: BuildTools Date: Fri, 27 Nov 2020 15:10:05 -0500 Subject: [PATCH 240/255] Show decay on /cti --- .../mc/citadel/ReinforcementLogic.java | 10 +++++--- .../citadel/model/CitadelSettingManager.java | 25 ++++++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index b624a65e..bdbd807c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -78,13 +78,17 @@ public static float getDamageApplied(Reinforcement reinforcement) { damageAmount /= progress; damageAmount *= reinforcement.getType().getMaturationScale(); } + damageAmount *= getDecayDamage(reinforcement); + return damageAmount; + } + + public static double getDecayDamage(Reinforcement reinforcement) { if (reinforcement.getGroup() != null) { long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); - damageAmount *= reinforcement.getType().getDecayDamageMultipler(lastRefresh); + return reinforcement.getType().getDecayDamageMultipler(lastRefresh); } else { - damageAmount *= reinforcement.getType().getDeletedGroupMultiplier(); + return reinforcement.getType().getDeletedGroupMultiplier(); } - return damageAmount; } public static Reinforcement getReinforcementAt(Location location) { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index b4214e37..bbda657e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -12,6 +12,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; +import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; @@ -22,6 +23,7 @@ import vg.civcraft.mc.civmodcore.playersettings.impl.DecimalFormatSetting; import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting.DisplayLocation; +import vg.civcraft.mc.civmodcore.playersettings.impl.StringSetting; public class CitadelSettingManager { @@ -41,6 +43,8 @@ public class CitadelSettingManager { // private CommandReplySetting modeSwitch; private DecimalFormatSetting ctiPercentageHealth; private DecimalFormatSetting ctiReinforcementHealth; + private DecimalFormatSetting ctiDecayMultiplier; + private StringSetting ctiDecay; private DisplayLocationSetting ctbLocationSetting; private DisplayLocationSetting modeLocationSetting; private DisplayLocationSetting ctiLocationSetting; @@ -165,9 +169,20 @@ void initSettings() { "Decimal format used for displaying a reinforcements health", 100.0 / 3); PlayerSettingAPI.registerSetting(ctiReinforcementHealth, commandSection); + ctiDecayMultiplier = new DecimalFormatSetting(Citadel.getInstance(), new DecimalFormat("#.##"), + "Reinforcement Decay Multiplier Format", "citadel_cti_decay_multiplier", + new ItemStack(Material.KNOWLEDGE_BOOK), + "Decimal format used for displaying the decay multiplier of a reinforcement", 100.0 / 3); + PlayerSettingAPI.registerSetting(ctiDecayMultiplier, commandSection); + + ctiDecay = new StringSetting(Citadel.getInstance(), " (Decayed x%%decay%%)", + "Reinforcement Decay Format", "citadel_cti_decay", new ItemStack(Material.KNOWLEDGE_BOOK), + "String format used for displaying the decay of a reinforcement"); + PlayerSettingAPI.registerSetting(ctiDecay, commandSection); + ctiEnemy = new CommandReplySetting(Citadel.getInstance(), ChatColor.RED + "Reinforced at %%health_color%%%%perc_health%%% (%%health%%/%%max_health%%)" - + ChatColor.RED + " health with " + ChatColor.AQUA + "%%type%%", + + ChatColor.RED + " health with " + ChatColor.AQUA + "%%type%%" + ChatColor.LIGHT_PURPLE + "%%decay_string%%", "CTI Message Enemy", "citadel_cti_enemy", new ItemStack(Material.RED_TERRACOTTA), "The message received when interacting with enemy reinforcements"); ctiEnemy.registerArgument("perc_health", "33.33", "the percentage health of the reinforcement"); @@ -176,6 +191,7 @@ void initSettings() { ctiEnemy.registerArgument("type", "Stone", "the type of the reinforcement"); ctiEnemy.registerArgument("health_color", ModeListener.getDamageColor(0.5).toString(), "a color representing the reinforcement health"); + ctiEnemy.registerArgument("decay_string", "", "the decay of the reinforcement"); PlayerSettingAPI.registerSetting(ctiEnemy, commandSection); } @@ -191,6 +207,13 @@ public void sendCtiEnemyMessage(Player player, Reinforcement reinforcement) { args.put("type", type.getName()); args.put("health_color", ModeListener.getDamageColor(reinforcement.getHealth() / type.getHealth()).toString()); + if (ReinforcementLogic.getDecayDamage(reinforcement) != 1) { + String ctiDecayAmountFormat = ctiDecayMultiplier.getValue(player).format(ReinforcementLogic.getDecayDamage(reinforcement)); + String ctiDecayFormat = ctiDecay.getValue(player).replaceAll("%%decay%%", ctiDecayAmountFormat); + args.put("decay_string", ctiDecayFormat); + } else { + args.put("decay_string",""); + } CitadelUtility.sendAndLog(player, ChatColor.RESET, ctiEnemy.formatReply(player.getUniqueId(), args)); } } From e551aba3033271fead116d6369b62cf2a5c1d0cd Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 8 Dec 2020 18:51:54 +0000 Subject: [PATCH 241/255] Attempt to drop items safely when acid blocking chests --- .../vg/civcraft/mc/citadel/command/Acid.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index d7150dfe..2ff2219c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -2,10 +2,13 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.Chest; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockIterator; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; @@ -96,7 +99,9 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); p.getWorld().dropItemNaturally(reinforcement.getLocation(), reinforcement.getType().getItem()); - topFace.breakNaturally(); + if (!isChestBeingAcidBlocked(topFace)) { + topFace.breakNaturally(); + } } return true; } @@ -105,4 +110,17 @@ public boolean execute(CommandSender sender, String[] args) { public List tabComplete(CommandSender sender, String[] args) { return new ArrayList<>(); } + + public boolean isChestBeingAcidBlocked (Block block) { + if (block.getType() != Material.CHEST || block.getType() != Material.TRAPPED_CHEST) { + return false; + } + Chest chest = (Chest) block.getBlockData(); + ItemStack[] items = chest.getBlockInventory().getStorageContents(); + chest.getBlockInventory().clear(); + for (ItemStack item : items) { + block.getWorld().dropItemNaturally(block.getLocation(), item); + } + return true; + } } From 49fbb9e282c6297b7ee8e06800e465b0b39d3ba9 Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 8 Dec 2020 21:05:23 +0000 Subject: [PATCH 242/255] Changes --- .../vg/civcraft/mc/citadel/command/Acid.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 2ff2219c..2819afb1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -6,6 +6,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Chest; +import org.bukkit.block.Container; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -99,7 +100,7 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); p.getWorld().dropItemNaturally(reinforcement.getLocation(), reinforcement.getType().getItem()); - if (!isChestBeingAcidBlocked(topFace)) { + if (!canDropChestContents(topFace)) { topFace.breakNaturally(); } } @@ -111,13 +112,19 @@ public List tabComplete(CommandSender sender, String[] args) { return new ArrayList<>(); } - public boolean isChestBeingAcidBlocked (Block block) { - if (block.getType() != Material.CHEST || block.getType() != Material.TRAPPED_CHEST) { + /** + * Checks if a chests contents can be dropped + * @param block an absolute URL giving the base location of the image + * @return true if contents have been successfully dropped + */ + + public boolean canDropChestContents(Block block) { + if (!(block instanceof Container)) { return false; } - Chest chest = (Chest) block.getBlockData(); - ItemStack[] items = chest.getBlockInventory().getStorageContents(); - chest.getBlockInventory().clear(); + Container container = (Container) block.getBlockData(); + ItemStack[] items = container.getInventory().getContents(); + container.getInventory().clear(); for (ItemStack item : items) { block.getWorld().dropItemNaturally(block.getLocation(), item); } From 30c7b2e43371627469a268ad7dc4054c5e15a025 Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 8 Dec 2020 21:18:12 +0000 Subject: [PATCH 243/255] Not just chests anymore --- src/main/java/vg/civcraft/mc/citadel/command/Acid.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 2819afb1..6c1e9b75 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -100,7 +100,7 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); p.getWorld().dropItemNaturally(reinforcement.getLocation(), reinforcement.getType().getItem()); - if (!canDropChestContents(topFace)) { + if (!canDropContents(topFace)) { topFace.breakNaturally(); } } @@ -118,7 +118,7 @@ public List tabComplete(CommandSender sender, String[] args) { * @return true if contents have been successfully dropped */ - public boolean canDropChestContents(Block block) { + public boolean canDropContents(Block block) { if (!(block instanceof Container)) { return false; } From 292a5d8a04f519fec1f2f0ed80e3363838618943 Mon Sep 17 00:00:00 2001 From: Diet Cola Date: Mon, 14 Dec 2020 12:58:31 +0000 Subject: [PATCH 244/255] Add icon --- .../vg/civcraft/mc/citadel/model/CitadelSettingManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java index bbda657e..f7752ab5 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -103,7 +103,7 @@ public int getHologramDuration(UUID uuid) { void initSettings() { MenuSection menu = PlayerSettingAPI.getMainMenu().createMenuSection("Citadel", - "Citadel and reinforcement related settings"); + "Citadel and reinforcement related settings", new ItemStack(Material.IRON_INGOT)); byPass = new BooleanSetting(Citadel.getInstance(), true, "Bypass", "citadelBypass", "Allows you to bypass reinforcements you have permission for and break them in a single break"); PlayerSettingAPI.registerSetting(byPass, menu); From 6e100a0a451c2867e2d3d4fdf8b48bccd1f5ab3c Mon Sep 17 00:00:00 2001 From: Cola Date: Mon, 14 Dec 2020 13:21:31 +0000 Subject: [PATCH 245/255] Update method name --- src/main/java/vg/civcraft/mc/citadel/command/Acid.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index 6c1e9b75..d7c591fb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -100,7 +100,7 @@ public boolean execute(CommandSender sender, String[] args) { ReinforcementLogic.damageReinforcement(topRein, topRein.getHealth() + 1, p); block.breakNaturally(); p.getWorld().dropItemNaturally(reinforcement.getLocation(), reinforcement.getType().getItem()); - if (!canDropContents(topFace)) { + if (!acidContainerBlock(topFace)) { topFace.breakNaturally(); } } @@ -113,12 +113,12 @@ public List tabComplete(CommandSender sender, String[] args) { } /** - * Checks if a chests contents can be dropped - * @param block an absolute URL giving the base location of the image + * Checks if a containers contents can be dropped + * @param block Container being acid blocked * @return true if contents have been successfully dropped */ - public boolean canDropContents(Block block) { + public boolean acidContainerBlock(Block block) { if (!(block instanceof Container)) { return false; } From 2e4072cfdcba27f4c9bf7d2fd07cae3e19224a63 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Tue, 15 Dec 2020 14:41:00 -0500 Subject: [PATCH 246/255] Show decay for players with group acess --- .../java/vg/civcraft/mc/citadel/listener/ModeListener.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java index 3f749cee..72eed4e2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java @@ -236,6 +236,10 @@ public void handleInteractBlock(PlayerInteractEvent e) { sb.append(ChatColor.AQUA); sb.append("(Insecure)"); } + if (ReinforcementLogic.getDecayDamage(rein) != 1) { + String ctiDecayAmountFormat = commaFormat.format(ReinforcementLogic.getDecayDamage(rein)); + sb.append(String.format("%s (Decayed x%s)", ChatColor.LIGHT_PURPLE, ctiDecayAmountFormat)); + } AcidManager acidMan = Citadel.getInstance().getAcidManager(); if (acidMan.isPossibleAcidBlock(e.getClickedBlock())) { sb.append(ChatColor.GOLD); From fadf1b53b6b8e14dc49b7a3ed6b66ef1971050e0 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Tue, 29 Dec 2020 02:31:52 +0100 Subject: [PATCH 247/255] Update to 1.16.4 --- pom.xml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 08aea47c..82d374c5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,44 +3,44 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - - com.github.civclassic - civclassic-parent - 1.0.0 - - + + + com.github.civclassic + civclassic-parent + 1.0.0 + + vg.civcraft.mc.citadel Citadel jar - 4.1.0 + 4.1.1 Citadel https://github.com/civclassic/Citadel - org.spigotmc - spigot-api - 1.16.1-R0.1-SNAPSHOT + com.destroystokyo.paper + paper-api + 1.16.4-R0.1-SNAPSHOT provided vg.civcraft.mc.civmodcore CivModCore - 1.8.0 + 1.8.1 provided vg.civcraft.mc.namelayer NameLayer - 2.14.0 + 2.14.1 provided com.gmail.filoghost.holographicdisplays holographicdisplays-api - 2.4.3 + 2.4.5 provided @@ -52,7 +52,7 @@ civ-jenkins - https://repo.civclassic.com/repository/internal/ + https://build.devotedmc.com/plugin/repository/everything/ From 2c76224fd5331868d8e84d60c5e45114855badb1 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 1 Jan 2021 02:16:52 +0100 Subject: [PATCH 248/255] Update repo to new github one --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 82d374c5..8801d1c1 100644 --- a/pom.xml +++ b/pom.xml @@ -51,8 +51,8 @@ https://repo.codemc.io/repository/maven-public/ - civ-jenkins - https://build.devotedmc.com/plugin/repository/everything/ + civ-github-repo + https://raw.githubusercontent.com/CivClassic/artifacts/master/ From e3e538fbe66c72af80c9d9aa04293d02a4a8ed29 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Fri, 1 Jan 2021 04:55:34 +0100 Subject: [PATCH 249/255] Remove Brewery from Jenkinsfile trigger --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2cb11c23..e8fe96e7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ pipeline { jdk 'Java 8' } environment { - civ_dependent_plugins = "FactoryMod JukeAlert RailSwitch SimpleAdminHacks Bastion Brewery" + civ_dependent_plugins = "FactoryMod JukeAlert RailSwitch SimpleAdminHacks Bastion" } stages { stage ('Build') { From 20e31d2428b1f20f558f6aeca5188c8f8c66b532 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Wed, 13 Jan 2021 10:55:31 +0100 Subject: [PATCH 250/255] Sharding support --- pom.xml | 14 +- .../java/vg/civcraft/mc/citadel/Citadel.java | 10 +- .../mc/citadel/CitadelPermissionHandler.java | 151 ++++++++---------- .../civcraft/mc/citadel/CitadelUtility.java | 15 +- .../mc/citadel/ReinforcementLogic.java | 8 +- .../vg/civcraft/mc/citadel/command/Acid.java | 19 ++- .../command/AdvancedFortification.java | 29 ++-- .../mc/citadel/command/AreaReinforce.java | 22 ++- .../mc/citadel/command/Fortification.java | 37 +++-- .../mc/citadel/command/Reinforce.java | 31 ++-- .../events/ReinforcementGroupChangeEvent.java | 2 +- .../mc/citadel/listener/BlockListener.java | 15 +- .../mc/citadel/listener/EntityListener.java | 35 +--- .../mc/citadel/listener/ModeListener.java | 3 +- .../mc/citadel/listener/RedstoneListener.java | 5 +- .../mc/citadel/model/HologramManager.java | 3 +- .../mc/citadel/model/Reinforcement.java | 15 +- .../playerstate/AbstractPlayerState.java | 6 +- .../AdvancedFortificationState.java | 2 +- .../playerstate/FortificationState.java | 3 +- .../mc/citadel/playerstate/InsecureState.java | 4 +- .../mc/citadel/playerstate/NormalState.java | 11 +- .../mc/citadel/playerstate/PatchState.java | 6 +- .../citadel/playerstate/ReinforcingState.java | 20 +-- 24 files changed, 204 insertions(+), 262 deletions(-) diff --git a/pom.xml b/pom.xml index 8801d1c1..94cb9605 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ vg.civcraft.mc.citadel Citadel jar - 4.1.1 + 4.1.1D Citadel https://github.com/civclassic/Citadel @@ -28,13 +28,19 @@ vg.civcraft.mc.civmodcore CivModCore - 1.8.1 + 1.8.2D provided vg.civcraft.mc.namelayer - NameLayer - 2.14.1 + namelayer-mc + 3.0.0 + provided + + + vg.civcraft.mc.namelayer + namelayer-core + 3.0.0 provided diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index 08bfa48c..88ab457a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -7,8 +7,8 @@ import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; -import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.listener.InventoryListener; +import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.listener.RedstoneListener; import vg.civcraft.mc.citadel.model.AcidManager; import vg.civcraft.mc.citadel.model.CitadelChunkData; @@ -23,6 +23,7 @@ import vg.civcraft.mc.civmodcore.locations.chunkmeta.api.ChunkMetaAPI; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; +import vg.civcraft.mc.namelayer.mc.NameLayerPlugin; public class Citadel extends ACivMod { @@ -40,6 +41,7 @@ public static Citadel getInstance() { private HologramManager holoManager; private CitadelSettingManager settingManager; private CitadelDAO dao; + private CitadelPermissionHandler permHandler; private PlayerStateManager stateManager; @@ -74,6 +76,10 @@ public HologramManager getHologramManager() { return holoManager; } + public CitadelPermissionHandler getPermissionHandler() { + return permHandler; + } + CitadelDAO getDAO() { return dao; } @@ -133,7 +139,7 @@ public void onEnable() { else { logger.info("HolographicDisplays is not loaded, no holograms available"); }}); - CitadelPermissionHandler.setup(); + permHandler = new CitadelPermissionHandler(NameLayerPlugin.getInstance().getGroupTracker().getPermissionTracker()); registerListeners(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java index 656a9deb..870aeacd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelPermissionHandler.java @@ -1,120 +1,105 @@ package vg.civcraft.mc.citadel; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import vg.civcraft.mc.namelayer.GroupManager.PlayerType; -import vg.civcraft.mc.namelayer.permission.PermissionType; +import vg.civcraft.mc.namelayer.core.DefaultPermissionLevel; +import vg.civcraft.mc.namelayer.core.PermissionTracker; +import vg.civcraft.mc.namelayer.core.PermissionType; +import vg.civcraft.mc.namelayer.mc.GroupAPI; public class CitadelPermissionHandler { - private CitadelPermissionHandler() { - } + private final static String CHEST_PERM = "CONTAINER_ACCESS"; + private final static String BYPASS_PERM = "BYPASS_REINFORCEMENT"; + private final static String CROPS_PERM = "HARVEST_CROPS"; + private final static String INSECURE_PERM = "INSECURE_REINFORCEMENT"; + private final static String REINFORCE_PERM = "REINFORCE"; + private final static String DOOR_PERM = "USE_DOORS"; + private final static String ACID_PERM = "USE_ACID_BLOCKS"; + private final static String INFO_PERM = "USE_INFORMATION_MODE"; + private final static String REPAIR_PERM = "ALLOW_REPAIR_REINFORCEMENT"; + private final static String MODIFY_PERM = "ALLOW_MODIFYING_BLOCKS"; + private final static String BEACON_PERM = "USE_BEACONS"; + private final static String HANGING_PLACE_BREAK_PERM = "ALLOWS_CHANGING_HANGING_BLOCKS"; + private final static String ITEM_FRAME_HANDLE_PERM = "ALLOWS_HANDLING_ITEM_FRAMES"; + private final static String ITEM_FRAME_ROTATE_PERM = "ALLOWS_ROTATING_ITEM_FRAMES"; - private static PermissionType chestPerm; - private static PermissionType bypassPerm; - private static PermissionType cropsPerm; - private static PermissionType insecurePerm; - private static PermissionType reinforcePerm; - private static PermissionType doorPerm; - private static PermissionType acidPerm; - private static PermissionType infoPerm; - private static PermissionType repairPerm; - private static PermissionType modifyBlockPerm; - private static PermissionType beaconPerm; - private static PermissionType hangingPlaceBreak; - private static PermissionType itemFramePutTake; - private static PermissionType itemFrameRotate; + private PermissionTracker permTracker; - public static void setup() { - List membersAndAbove = Arrays.asList(PlayerType.MEMBERS, PlayerType.MODS, PlayerType.ADMINS, - PlayerType.OWNER); - List modAndAbove = Arrays.asList(PlayerType.MODS, PlayerType.ADMINS, PlayerType.OWNER); - reinforcePerm = PermissionType.registerPermission("REINFORCE", new ArrayList<>(modAndAbove), - "Allows reinforcing blocks on this group"); - acidPerm = PermissionType.registerPermission("ACIDBLOCK", new ArrayList<>(modAndAbove), - "Allows activating acid blocks reinforced on this group"); - infoPerm = PermissionType.registerPermission("REINFORCEMENT_INFO", new ArrayList<>(membersAndAbove), - "Allows viewing information on reinforcements reinforced on this group"); - bypassPerm = PermissionType.registerPermission("BYPASS_REINFORCEMENT", new ArrayList<>(modAndAbove), - "Allows bypassing reinforcements reinforced on this group"); - repairPerm = PermissionType.registerPermission("REPAIR_REINFORCEMENT", new ArrayList<>(modAndAbove), - "Allows repairing reinforcements reinforced on this group"); - doorPerm = PermissionType.registerPermission("DOORS", new ArrayList<>(membersAndAbove), - "Allows opening doors reinforced on this group"); - chestPerm = PermissionType.registerPermission("CHESTS", new ArrayList<>(membersAndAbove), - "Allows opening containers like chests reinforced on this group"); - cropsPerm = PermissionType.registerPermission("CROPS", new ArrayList<>(membersAndAbove), - "Allows harvesting crops growing on soil reinforced on this group"); - insecurePerm = PermissionType.registerPermission("INSECURE_REINFORCEMENT", new ArrayList<>(membersAndAbove), - "Allows toggling the insecure flag on reinforcements"); - modifyBlockPerm = PermissionType.registerPermission("MODIFY_BLOCK", new ArrayList<>(modAndAbove), - "Allows modifying reinforced blocks like flipping levers, stripping logs etc."); - beaconPerm = PermissionType.registerPermission("BEACONS", new ArrayList<>(membersAndAbove), - "Allow changing beacon effects"); - hangingPlaceBreak = PermissionType.registerPermission("HANGING_PLACE_BREAK", new ArrayList<>(membersAndAbove), - "Allows placing/breaking hanging entities on reinforced blocks."); - itemFramePutTake = PermissionType.registerPermission("ITEM_FRAME_PUT_TAKE", new ArrayList<>(membersAndAbove), - "Allows the placing/removal of items into/from Item Frames."); - itemFrameRotate = PermissionType.registerPermission("ITEM_FRAME_ROTATE", new ArrayList<>(membersAndAbove), - "Allows the rotation of items placed within Item Frames."); + public CitadelPermissionHandler(PermissionTracker permTracker) { + this.permTracker = permTracker; + setup(); } - - public static PermissionType getModifyBlocks() { - return modifyBlockPerm; + + private static void setup() { + GroupAPI.registerPermission(REINFORCE_PERM, DefaultPermissionLevel.MOD, "Allows reinforcing blocks on this group"); + GroupAPI.registerPermission(ACID_PERM, DefaultPermissionLevel.MOD, "Allows activating acid blocks reinforced on this group"); + GroupAPI.registerPermission(INFO_PERM, DefaultPermissionLevel.MEMBER, "Allows viewing information on reinforcements reinforced on this group"); + GroupAPI.registerPermission(BYPASS_PERM, DefaultPermissionLevel.MOD, "Allows bypassing reinforcements reinforced on this group"); + GroupAPI.registerPermission(REPAIR_PERM, DefaultPermissionLevel.MOD, "Allows repairing reinforcements reinforced on this group"); + GroupAPI.registerPermission(DOOR_PERM, DefaultPermissionLevel.MEMBER, "Allows opening doors reinforced on this group"); + GroupAPI.registerPermission(CHEST_PERM, DefaultPermissionLevel.MEMBER, "Allows opening containers like chests reinforced on this group"); + GroupAPI.registerPermission(CROPS_PERM, DefaultPermissionLevel.MEMBER, "Allows harvesting crops growing on soil reinforced on this group"); + GroupAPI.registerPermission(INSECURE_PERM, DefaultPermissionLevel.MEMBER, "Allows toggling the insecure flag on reinforcements"); + GroupAPI.registerPermission(MODIFY_PERM, DefaultPermissionLevel.MOD, "Allows modifying reinforced blocks like flipping levers, stripping logs etc"); + GroupAPI.registerPermission(BEACON_PERM, DefaultPermissionLevel.MEMBER, "Allow changing beacon effects"); + GroupAPI.registerPermission(HANGING_PLACE_BREAK_PERM, DefaultPermissionLevel.MOD, "Allows placing/breaking hanging entities on reinforced blocks"); + GroupAPI.registerPermission(ITEM_FRAME_HANDLE_PERM, DefaultPermissionLevel.MOD, "Allows the placing/removal of items into/from Item Frames"); + GroupAPI.registerPermission(ITEM_FRAME_ROTATE_PERM, DefaultPermissionLevel.MEMBER, "Allows the rotation of items placed within Item Frames"); + } + + public PermissionType getModifyBlocks() { + return permTracker.getPermission(MODIFY_PERM); } - public static PermissionType getChests() { - return chestPerm; + public PermissionType getChests() { + return permTracker.getPermission(CHEST_PERM); } - public static PermissionType getDoors() { - return doorPerm; + public PermissionType getDoors() { + return permTracker.getPermission(DOOR_PERM); } - public static PermissionType getBypass() { - return bypassPerm; + public PermissionType getBypass() { + return permTracker.getPermission(BYPASS_PERM); } - public static PermissionType getReinforce() { - return reinforcePerm; + public PermissionType getReinforce() { + return permTracker.getPermission(REINFORCE_PERM); } - public static PermissionType getAcidblock() { - return acidPerm; + public PermissionType getAcidblock() { + return permTracker.getPermission(ACID_PERM); } - public static PermissionType getCrops() { - return cropsPerm; + public PermissionType getCrops() { + return permTracker.getPermission(CROPS_PERM); } - public static PermissionType getInsecure() { - return insecurePerm; + public PermissionType getInsecure() { + return permTracker.getPermission(INSECURE_PERM); } - public static PermissionType getInfo() { - return infoPerm; + public PermissionType getInfo() { + return permTracker.getPermission(INFO_PERM); } - public static PermissionType getRepair() { - return repairPerm; + public PermissionType getRepair() { + return permTracker.getPermission(REPAIR_PERM); } - public static PermissionType getBeacon() { - return beaconPerm; + public PermissionType getBeacon() { + return permTracker.getPermission(BEACON_PERM); } - public static PermissionType getHangingPlaceBreak() { - return hangingPlaceBreak; + public PermissionType getHangingPlaceBreak() { + return permTracker.getPermission(HANGING_PLACE_BREAK_PERM); } - public static PermissionType getItemFramePutTake() { - return itemFramePutTake; + public PermissionType getItemFramePutTake() { + return permTracker.getPermission(ITEM_FRAME_HANDLE_PERM); } - public static PermissionType getItemFrameRotate() { - return itemFrameRotate; + public PermissionType getItemFrameRotate() { + return permTracker.getPermission(ITEM_FRAME_ROTATE_PERM); } } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 1c38cb3c..6de12a0b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -10,8 +10,8 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; /** * Just a useful class with general and misplaced methods that can be called @@ -91,16 +91,9 @@ public static boolean consumeReinforcementItems(Player player, ReinforcementType public static boolean attemptReinforcementCreation(Block block, ReinforcementType type, Group group, Player player) { - // check if group still exists - if (!group.isValid()) { - CitadelUtility.sendAndLog(player, ChatColor.RED, - "The group " + group.getName() + " seems to have been deleted in the mean time"); - Citadel.getInstance().getStateManager().setState(player, null); - return true; - } // check if player still has permission - if (!NameAPI.getGroupManager().hasAccess(group, player.getUniqueId(), - CitadelPermissionHandler.getReinforce())) { + if (!GroupAPI.hasPermission(player.getUniqueId(), group, + Citadel.getInstance().getPermissionHandler().getReinforce())) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(player, null); diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index bdbd807c..ed591e6e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -12,12 +12,13 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; + import vg.civcraft.mc.citadel.events.ReinforcementCreationEvent; import vg.civcraft.mc.citadel.events.ReinforcementDestructionEvent; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.api.BlockAPI; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; public final class ReinforcementLogic { @@ -84,7 +85,8 @@ public static float getDamageApplied(Reinforcement reinforcement) { public static double getDecayDamage(Reinforcement reinforcement) { if (reinforcement.getGroup() != null) { - long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); + //long lastRefresh = reinforcement.getGroup().getActivityTimeStamp(); //TODO + long lastRefresh = System.currentTimeMillis(); return reinforcement.getType().getDecayDamageMultipler(lastRefresh); } else { return reinforcement.getType().getDeletedGroupMultiplier(); @@ -318,7 +320,7 @@ public static boolean isPreventingBlockAccess(Player player, Block block) { if (rein == null || rein.isInsecure()) { return false; } - return !rein.hasPermission(player, CitadelPermissionHandler.getChests()); + return !rein.hasPermission(player, Citadel.getInstance().getPermissionHandler().getChests()); } return false; } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java index d7c591fb..965bf080 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -1,18 +1,22 @@ package vg.civcraft.mc.citadel.command; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.Chest; import org.bukkit.block.Container; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.util.BlockIterator; + import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementAcidBlockedEvent; @@ -22,12 +26,7 @@ import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; import vg.civcraft.mc.civmodcore.util.TextUtil; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; +import vg.civcraft.mc.namelayer.mc.GroupAPI; @CivCommand(id = "ctacid") public class Acid extends StandaloneCommand { @@ -54,7 +53,7 @@ public boolean execute(CommandSender sender, String[] args) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); return true; } - if (!reinforcement.hasPermission(p, CitadelPermissionHandler.getAcidblock())) { + if (!GroupAPI.hasPermission(p, reinforcement.getGroup(), Citadel.getInstance().getPermissionHandler().getAcidblock())) { CitadelUtility.sendAndLog(p, ChatColor.RED, "You do not have sufficient permission to use acid blocks on this group."); return true; diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java index aa668858..d53fbbd5 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -10,7 +10,6 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.AdvancedFortificationState; @@ -18,10 +17,9 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; +import vg.civcraft.mc.namelayer.mc.commands.NameLayerTabCompletion; @CivCommand(id = "cta") public class AdvancedFortification extends StandaloneCommand { @@ -60,25 +58,22 @@ public boolean execute(CommandSender sender, String[] args) { type.getName() + ChatColor.RED + " can not reinforce " + mainHand.getType().name()); return true; } - String groupName = null; + Group group = null; if (args.length == 0) { - groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); - if (groupName == null) { + group = GroupAPI.getDefaultGroup(player); + if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You don't have a default group and can thus not use this command without specifying a group"); return true; } } else { - groupName = args[0]; + group = GroupAPI.getGroup(args[0]); } - - Group group = GroupManager.getGroup(groupName); if (group == null) { - CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + args[0] + " does not exist."); return true; } - boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - CitadelPermissionHandler.getReinforce()); + boolean hasAccess = GroupAPI.hasPermission(player.getUniqueId(), group, Citadel.getInstance().getPermissionHandler().getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); return true; @@ -94,11 +89,9 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { if (args.length == 0) - return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName("", (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName(args[0], (Player) sender); else { return new ArrayList<>(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java index b4418159..785c81e0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -15,13 +15,12 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; +import vg.civcraft.mc.namelayer.mc.commands.NameLayerCommand; @CivCommand(id = "ctar") -public class AreaReinforce extends StandaloneCommand { +public class AreaReinforce extends NameLayerCommand { @Override public boolean execute(CommandSender sender, String[] args) { @@ -30,26 +29,25 @@ public boolean execute(CommandSender sender, String[] args) { return true; } Player p = (Player) sender; - UUID uuid = NameAPI.getUUID(p.getName()); + UUID uuid = resolveUUID(sender); ReinforcementType reinType = Citadel.getInstance().getReinforcementTypeManager() .getByItemStack(p.getInventory().getItemInMainHand()); if (reinType == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "The item you are holding is not a possible reinforcement"); return true; } - String groupName = null; + Group group = null; if (args.length == 6) { - groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); - if (groupName == null) { + group = GroupAPI.getDefaultGroup(p); + if (group == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); return true; } } else { - groupName = args[0]; + group = GroupAPI.getGroup(args [0]); } - Group group = GroupManager.getGroup(groupName); if (group == null) { - CitadelUtility.sendAndLog(p, ChatColor.RED, "That group does not exist."); + CitadelUtility.sendAndLog(p, ChatColor.RED, "The group " + args[0] + " does not exist."); return true; } // no additional group permission check here because the player is diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java index 38959f5e..ead9915c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -16,10 +16,9 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; +import vg.civcraft.mc.namelayer.mc.commands.NameLayerTabCompletion; @CivCommand(id = "ctf") public class Fortification extends StandaloneCommand { @@ -40,29 +39,28 @@ public boolean execute(CommandSender sender, String[] args) { stateManager.setState(player, null); return true; } - - String groupName = null; + + Group group = null; if (args.length == 0) { - groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); - if (groupName == null) { + group = GroupAPI.getDefaultGroup(player); + if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to fortify to a group! Try /fortify groupname. \n Or use /create groupname if you don't have a group yet."); return true; } } else { - groupName = args[0]; + group = GroupAPI.getGroup(args[0]); } - - Group group = GroupManager.getGroup(groupName); if (group == null) { - CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + args[0] + " does not exist."); stateManager.setState(player, null); return true; } - boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - CitadelPermissionHandler.getReinforce()); + boolean hasAccess = GroupAPI.hasPermission(player.getUniqueId(), group, + Citadel.getInstance().getPermissionHandler().getReinforce()); if (!hasAccess) { - CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + CitadelUtility.sendAndLog(player, ChatColor.RED, + "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); return true; } @@ -79,12 +77,13 @@ public boolean execute(CommandSender sender, String[] args) { @Override public List tabComplete(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) + return null; + if (args.length == 0) - return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName("", (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName(args[0], (Player) sender); else { return new ArrayList<>(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java index c5a19d80..44e5692c 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -9,17 +9,15 @@ import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.playerstate.AbstractPlayerState; import vg.civcraft.mc.citadel.playerstate.PlayerStateManager; import vg.civcraft.mc.citadel.playerstate.ReinforcingState; import vg.civcraft.mc.civmodcore.command.CivCommand; import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; +import vg.civcraft.mc.namelayer.mc.commands.NameLayerTabCompletion; @CivCommand(id = "ctr") public class Reinforce extends StandaloneCommand { @@ -27,27 +25,26 @@ public class Reinforce extends StandaloneCommand { @Override public boolean execute(CommandSender sender, String[] args) { Player player = (Player) sender; - UUID uuid = NameAPI.getUUID(player.getName()); - String groupName = null; + UUID uuid = player.getUniqueId(); + Group group = null; if (args.length == 0) { - groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); - if (groupName == null) { + group = GroupAPI.getDefaultGroup(player); + if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to reinforce to a group! Try /reinforce groupname. \n Or use /create groupname if you don't have a group yet."); return true; } } else { - groupName = args[0]; + group = GroupAPI.getGroup(args[0]); } PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); - Group group = GroupManager.getGroup(groupName); if (group == null) { - CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); + CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + args[0] + " does not exist."); stateManager.setState(player, null); return true; } - boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), - CitadelPermissionHandler.getReinforce()); + boolean hasAccess = GroupAPI.hasPermission(player.getUniqueId(), group, + Citadel.getInstance().getPermissionHandler().getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); @@ -71,11 +68,9 @@ public List tabComplete(CommandSender sender, String[] args) { return null; if (args.length == 0) - return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName("", (Player) sender); else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (Player) sender); + return NameLayerTabCompletion.completeGroupName(args[0], (Player) sender); else { return new ArrayList<>(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java index fb35ac9a..3cc8a937 100644 --- a/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java +++ b/src/main/java/vg/civcraft/mc/citadel/events/ReinforcementGroupChangeEvent.java @@ -4,7 +4,7 @@ import org.bukkit.event.HandlerList; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; /** * Called when the group a reinforcement is on is changed diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index cc68e4fd..6f44c48e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -24,7 +24,6 @@ import org.bukkit.inventory.ItemStack; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -183,7 +182,7 @@ public void openContainer(PlayerInteractEvent e) { return; } if (e.getClickedBlock().getState() instanceof Container) { - if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getChests())) { + if (!rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getChests())) { e.setCancelled(true); String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), ChatColor.AQUA, rein.getType().getName()); @@ -192,7 +191,7 @@ public void openContainer(PlayerInteractEvent e) { return; } if (e.getClickedBlock().getBlockData() instanceof Openable) { - if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getDoors())) { + if (!rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getDoors())) { e.setCancelled(true); String msg = String.format("%s is locked with %s%s", e.getClickedBlock().getType().name(), ChatColor.AQUA, rein.getType().getName()); @@ -260,7 +259,7 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { if (rein == null) { return; } - if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + if (!rein.hasPermission(p, Citadel.getInstance().getPermissionHandler().getModifyBlocks())) { p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); pie.setCancelled(true); } @@ -296,7 +295,7 @@ public void preventTilingGrass(PlayerInteractEvent pie) { if (rein == null) { return; } - if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + if (!rein.hasPermission(p, Citadel.getInstance().getPermissionHandler().getModifyBlocks())) { p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); pie.setCancelled(true); } @@ -334,7 +333,7 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { if (rein == null) { return; } - if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + if (!rein.hasPermission(p, Citadel.getInstance().getPermissionHandler().getModifyBlocks())) { p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); pie.setCancelled(true); } @@ -372,7 +371,7 @@ public void preventHarvestingHoney(PlayerInteractEvent pie) { if (rein == null) { return; } - if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { + if (!rein.hasPermission(p, Citadel.getInstance().getPermissionHandler().getModifyBlocks())) { p.sendMessage(ChatColor.RED + "You do not have permission to harvest this block"); pie.setCancelled(true); } @@ -393,7 +392,7 @@ public void openBeacon(PlayerInteractEvent pie) { if (rein == null) { return; } - if (!rein.hasPermission(pie.getPlayer(), CitadelPermissionHandler.getBeacon())) { + if (!rein.hasPermission(pie.getPlayer(), Citadel.getInstance().getPermissionHandler().getBeacon())) { pie.setCancelled(true); String msg = String.format("%s is locked with %s%s", pie.getClickedBlock().getType().name(), ChatColor.AQUA, rein.getType().getName()); diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java index 70f94caa..7b2a9bf2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -6,6 +6,7 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -30,21 +31,14 @@ import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.scheduler.BukkitRunnable; + import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.ItemAPI; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.NameLayerPlugin; -import vg.civcraft.mc.namelayer.database.GroupManagerDao; public class EntityListener implements Listener { - protected GroupManager gm = NameAPI.getGroupManager(); - // prevent zombies from breaking reinforced doors @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void breakDoor(EntityBreakDoorEvent ebde) { @@ -130,20 +124,7 @@ private List getGolemBlocks(EntityType type, Block base) { public void playerJoinEvent(PlayerJoinEvent event) { Player p = event.getPlayer(); final UUID uuid = p.getUniqueId(); - - - new BukkitRunnable() { - @Override - public void run() { - GroupManagerDao db = NameLayerPlugin.getGroupManagerDao(); - for (String groupName : db.getGroupNames(uuid)) { - if (NameAPI.getGroupManager().hasAccess(groupName, uuid, - CitadelPermissionHandler.getBypass())) { - GroupManager.getGroup(groupName).updateActivityTimeStamp(); - } - } - } - }.runTaskAsynchronously(Citadel.getInstance()); + //TODO figure out decay again } // prevent creating golems from reinforced blocks @@ -182,7 +163,7 @@ public void hangingPlaceEvent(HangingPlaceEvent event) { if (reinforcement.isInsecure()) { return; } - if (reinforcement.hasPermission(player, CitadelPermissionHandler.getHangingPlaceBreak())) { + if (reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getHangingPlaceBreak())) { return; } player.sendMessage(ChatColor.RED + "You cannot place those on blocks you don't have permissions for."); @@ -219,7 +200,7 @@ public void hangingEntityBreakEvent(HangingBreakByEntityEvent event) { if (reinforcement.isInsecure()) { return; } - if (reinforcement.hasPermission(player, CitadelPermissionHandler.getHangingPlaceBreak())) { + if (reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getHangingPlaceBreak())) { return; } player.sendMessage(ChatColor.RED + "The host block is protecting this."); @@ -273,7 +254,7 @@ public void entityDamageEvent(EntityDamageByEntityEvent event) { if (reinforcement.isInsecure()) { return; } - if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFramePutTake())) { + if (reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getItemFramePutTake())) { return; } } @@ -303,12 +284,12 @@ public void playerEntityInteractEvent(PlayerInteractEntityEvent event) { } // If the Item Frame already has an item, then the only possible action is rotation if (ItemAPI.isValidItem(((ItemFrame) entity).getItem())) { - if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFrameRotate())) { + if (reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getItemFrameRotate())) { return; } } // If the Item Frame is empty, then the only possible action is placement - if (reinforcement.hasPermission(player, CitadelPermissionHandler.getItemFramePutTake())) { + if (reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getItemFramePutTake())) { return; } } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java index 72eed4e2..fb5b1520 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java @@ -17,7 +17,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementModeSwitchEvent; @@ -213,7 +212,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { e.setCancelled(true); } boolean showHolo = settingMan.shouldShowHologramInCti(player.getUniqueId()); - if (!rein.hasPermission(player, CitadelPermissionHandler.getInfo())) { + if (!rein.hasPermission(player, Citadel.getInstance().getPermissionHandler().getInfo())) { if (showChat) { Citadel.getInstance().getSettingManager().sendCtiEnemyMessage(player, rein); } diff --git a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java index 4ff89aaf..9ac55d8d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/RedstoneListener.java @@ -31,7 +31,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.api.BlockAPI; @@ -50,7 +49,7 @@ private static boolean isAuthorizedPlayerNear(Reinforcement reinforcement, doubl Collection entities = reinLocation.getWorld().getNearbyEntities(reinLocation, diameter, diameter, diameter, e -> e instanceof Player && !e.isDead() - && reinforcement.hasPermission(e.getUniqueId(), CitadelPermissionHandler.getDoors()) + && reinforcement.hasPermission(e.getUniqueId(), Citadel.getInstance().getPermissionHandler().getDoors()) && e.getLocation().distanceSquared(reinLocation) <= diameter * diameter); return !entities.isEmpty(); } @@ -159,7 +158,7 @@ public void redstonePower(BlockRedstoneEvent bre) { return; } for (UUID uuid : playersActivating) { - if (rein.hasPermission(uuid, CitadelPermissionHandler.getDoors())) { + if (rein.hasPermission(uuid, Citadel.getInstance().getPermissionHandler().getDoors())) { // single valid perm is enough to open return; } diff --git a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java index fbc1ad57..085d5d96 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/HologramManager.java @@ -18,7 +18,6 @@ import com.gmail.filoghost.holographicdisplays.api.HologramsAPI; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.listener.ModeListener; public class HologramManager { @@ -102,7 +101,7 @@ public PlayerHolo(Player player, Reinforcement reinforcement) { // we intentionally cache permission to avoid having to look it up often // showing a bit too much information if the player gets kicked while a holo is // already visible does not matter - this.hasPermission = reinforcement.hasPermission(player, CitadelPermissionHandler.getInfo()); + this.hasPermission = reinforcement.hasPermission(player, Citadel.getInstance().getPermissionHandler().getInfo()); } void show() { diff --git a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java index 32eaa72e..28447dbf 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -8,10 +8,9 @@ import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; -import vg.civcraft.mc.namelayer.permission.PermissionType; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.core.PermissionType; +import vg.civcraft.mc.namelayer.mc.GroupAPI; public class Reinforcement extends TableBasedDataObject { @@ -24,7 +23,7 @@ public class Reinforcement extends TableBasedDataObject { private boolean insecure; public Reinforcement(Location loc, ReinforcementType type, Group group) { - this(loc, type, group.getGroupId(), System.currentTimeMillis(), type.getHealth(), false, true); + this(loc, type, group.getPrimaryId(), System.currentTimeMillis(), type.getHealth(), false, true); } public Reinforcement(Location loc, ReinforcementType type, int groupID, long creationTime, float health, @@ -58,7 +57,7 @@ public long getCreationTime() { * @return Group this reinforcement is under */ public Group getGroup() { - return GroupManager.getGroup(groupId); + return GroupAPI.getGroup(groupId); } /** @@ -109,7 +108,7 @@ public boolean hasPermission(UUID uuid, PermissionType permission) { if (g == null) { return false; } - return NameAPI.getGroupManager().hasAccess(g, uuid, permission); + return GroupAPI.hasPermission(uuid, g, permission); } /** @@ -154,7 +153,7 @@ public void setGroup(Group group) { if (group == null) { throw new IllegalArgumentException("Group can not be set to null for a reinforcement"); } - this.groupId = group.getGroupId(); + this.groupId = group.getPrimaryId(); setDirty(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java index 4bf0e50c..74c5036e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -12,7 +12,7 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcedBlockBreak; @@ -46,14 +46,14 @@ public void handleBreakBlock(BlockBreakEvent e) { return; } if (CitadelUtility.isPlant(e.getBlock())) { - if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getCrops()) + if (rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getCrops()) && !e.getBlock().getLocation().equals(rein.getLocation())) { // allow, because player has crop permission and the only reinforcement // protecting is in the soil return; } } - boolean hasAccess = rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass()); + boolean hasAccess = rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getBypass()); BooleanSetting setting = (BooleanSetting) PlayerSettingAPI.getSetting("citadelBypass"); boolean hasByPass = setting.getValue(e.getPlayer()); if (hasAccess && hasByPass) { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java index c0cec432..f7117a61 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AdvancedFortificationState.java @@ -13,7 +13,7 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; public class AdvancedFortificationState extends AbstractPlayerState { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java index 3aa6f809..b0c873d8 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/FortificationState.java @@ -5,11 +5,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; + import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; public class FortificationState extends AbstractPlayerState { diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java index 91cf2fba..c71f7a9a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/InsecureState.java @@ -5,7 +5,7 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; @@ -32,7 +32,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } e.setCancelled(true); - if (rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getInsecure())) { + if (rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getInsecure())) { rein.toggleInsecure(); if (rein.isInsecure()) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.YELLOW, diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java index c4856046..54fd4816 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/NormalState.java @@ -10,9 +10,8 @@ import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.namelayer.GroupManager; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; public class NormalState extends AbstractPlayerState { @@ -36,8 +35,7 @@ public void handleBlockPlace(BlockPlaceEvent e) { if (type == null) { return; } - String defaultGroupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); - Group defaultGroup = GroupManager.getGroup(defaultGroupName); + Group defaultGroup = GroupAPI.getDefaultGroup(player); if (defaultGroup == null) { return; } @@ -58,8 +56,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { if (type == null) { return; } - String defaultGroupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); - Group defaultGroup = GroupManager.getGroup(defaultGroupName); + Group defaultGroup = GroupAPI.getDefaultGroup(player); if (defaultGroup == null) { return; } diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java index cefb8467..febed38a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -6,7 +6,7 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerInteractEvent; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; +import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.command.PatchMode; @@ -39,13 +39,13 @@ public void handleInteractBlock(PlayerInteractEvent e) { CitadelUtility.sendAndLog(player, ChatColor.RED, "This block is not reinforced"); return; } - if (!rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { + if (!rein.hasPermission(player, Citadel.getInstance().getPermissionHandler().getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to repair reinforcements on this group"); return; } if (rein.getHealth() >= rein.getType().getHealth()) { - if (rein.hasPermission(player, CitadelPermissionHandler.getRepair())) { + if (rein.hasPermission(player, Citadel.getInstance().getPermissionHandler().getRepair())) { CitadelUtility.sendAndLog(player, ChatColor.GOLD, "Reinforcement is already at " + ModeListener.formatHealth(rein) + ChatColor.GOLD + " health with " + ChatColor.AQUA + rein.getType().getName() + ChatColor.GOLD + " on " diff --git a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java index 2c6c049f..a9c0e4e3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -8,7 +8,6 @@ import org.bukkit.event.player.PlayerInteractEvent; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.events.ReinforcementChangeTypeEvent; @@ -16,8 +15,8 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; -import vg.civcraft.mc.namelayer.NameAPI; -import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.core.Group; +import vg.civcraft.mc.namelayer.mc.GroupAPI; public class ReinforcingState extends AbstractPlayerState { @@ -45,13 +44,6 @@ public void handleBlockPlace(BlockPlaceEvent e) { public void handleInteractBlock(PlayerInteractEvent e) { // always cancel e.setCancelled(true); - // does group still exist? - if (!group.isValid()) { - CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, - "The group " + group.getName() + " seems to have been deleted in the mean time"); - Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); - return; - } Player player = e.getPlayer(); // does the player have an item? if (e.getItem() == null) { @@ -72,8 +64,8 @@ public void handleInteractBlock(PlayerInteractEvent e) { return; } // does the player have permission to reinforce on that group - if (!NameAPI.getGroupManager().hasAccess(group, e.getPlayer().getUniqueId(), - CitadelPermissionHandler.getReinforce())) { + if (!GroupAPI.hasPermission(e.getPlayer(), group, + Citadel.getInstance().getPermissionHandler().getReinforce())) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You seem to have lost permission to reinforce on " + group.getName()); Citadel.getInstance().getStateManager().setState(e.getPlayer(), null); @@ -82,7 +74,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(block); // if reinforcement exists, check if player has permission to edit it if (rein != null) { - if (!rein.hasPermission(e.getPlayer(), CitadelPermissionHandler.getBypass())) { + if (!rein.hasPermission(e.getPlayer(), Citadel.getInstance().getPermissionHandler().getBypass())) { CitadelUtility.sendAndLog(e.getPlayer(), ChatColor.RED, "You do not have permission to bypass reinforcements on " + group.getName()); return; @@ -123,7 +115,7 @@ public void handleInteractBlock(PlayerInteractEvent e) { } else { // replace existing one boolean changedGroup = false; - if (group.getGroupId() != rein.getGroup().getGroupId()) { + if (group.getPrimaryId() != rein.getGroup().getPrimaryId()) { // switch group ReinforcementGroupChangeEvent rgce = new ReinforcementGroupChangeEvent(player, rein, group); Bukkit.getPluginManager().callEvent(rgce); From 400f16a9506b1c9b19598c5598c1881c338345a3 Mon Sep 17 00:00:00 2001 From: Maxopoly Date: Thu, 14 Jan 2021 12:56:37 +0100 Subject: [PATCH 251/255] Always query groups of loaded reins --- src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java index 11e5d2d1..d4f3dd35 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java @@ -9,7 +9,9 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; +import java.util.TreeSet; import java.util.concurrent.Callable; import java.util.function.Consumer; import java.util.logging.Level; @@ -29,6 +31,7 @@ import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableStorageEngine; import vg.civcraft.mc.civmodcore.locations.global.WorldIDManager; +import vg.civcraft.mc.namelayer.mc.GroupAPI; public class CitadelDAO extends TableStorageEngine { @@ -268,6 +271,7 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer groupIDs = new TreeSet<>(); try (Connection insertConn = db.getConnection(); PreparedStatement selectRein = insertConn.prepareStatement( "select x_offset, y, z_offset, type_id, group_id, creation_time, health, insecure " @@ -290,6 +294,7 @@ public void fill(TableBasedBlockChunkMeta chunkData, Consumer chunkData, Consumer Date: Wed, 20 Jan 2021 03:57:00 +0000 Subject: [PATCH 252/255] Add Nether doors to responsible block check --- src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index ed591e6e..523e7134 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -243,6 +243,8 @@ public static Block getResponsibleBlock(Block block) { case IRON_DOOR: case SPRUCE_DOOR: case JUNGLE_DOOR: + case WARPED_DOOR: + case CRIMSON_DOOR: case OAK_DOOR: { if (block.getRelative(BlockFace.UP).getType() != block.getType()) { // block is upper half of a door From 0e2cf4e7ed191406476c942c4e76d8f5f59360f6 Mon Sep 17 00:00:00 2001 From: Cola Date: Sun, 24 Jan 2021 19:13:57 +0000 Subject: [PATCH 253/255] Fix for Nether Vines Responsible block --- .../mc/citadel/ReinforcementLogic.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 523e7134..b63408f2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -4,6 +4,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.type.Bed; @@ -174,7 +175,6 @@ public static Block getResponsibleBlock(Block block) { case WARPED_FUNGUS: case CRIMSON_FUNGUS: case BAMBOO_SAPLING: - case TWISTING_VINES: case WHEAT: case CARROTS: case POTATOES: @@ -215,9 +215,17 @@ public static Block getResponsibleBlock(Block block) { case DEAD_FIRE_CORAL_FAN: case DEAD_HORN_CORAL: case DEAD_HORN_CORAL_FAN: - case NETHER_WART_BLOCK: { + case NETHER_WART: { return block.getRelative(BlockFace.DOWN); } + case TWISTING_VINES: { + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType() || below.getType() == Material.TWISTING_VINES_PLANT) { + below = below.getRelative(BlockFace.DOWN); + } + return below; + } case SUGAR_CANE: case BAMBOO: case ROSE_BUSH: @@ -288,7 +296,12 @@ public static Block getResponsibleBlock(Block block) { return block.getRelative(cwf.getFacing().getOppositeFace()); } case WEEPING_VINES: { - block.getRelative(BlockFace.UP); + // scan upwards + Block above = block.getRelative(BlockFace.UP); + while (above.getType() == block.getType() || above.getType() == Material.WEEPING_VINES_PLANT) { + above = above.getRelative(BlockFace.UP); + } + return above; } case WEEPING_VINES_PLANT: { // scan upwards From 5ccf9ef9ab3857e13ed5112012af3be5be291ec2 Mon Sep 17 00:00:00 2001 From: Cola Date: Wed, 27 Jan 2021 15:29:18 +0000 Subject: [PATCH 254/255] Fix Nether Wart on Crop check --- src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index 6de12a0b..c11520f1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -49,7 +49,7 @@ public static boolean isPlant(Block plant) { case PUMPKIN_STEM: case ATTACHED_MELON_STEM: case ATTACHED_PUMPKIN_STEM: - case NETHER_WART_BLOCK: + case NETHER_WART: case SUGAR_CANE: case CACTUS: case SUNFLOWER: From 111703cb91b5de1d5496c52f6113316cae0f34f0 Mon Sep 17 00:00:00 2001 From: Cola Date: Sat, 30 Jan 2021 20:56:26 +0000 Subject: [PATCH 255/255] Add nether crops --- src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index c11520f1..8dfb62d2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -55,6 +55,12 @@ public static boolean isPlant(Block plant) { case SUNFLOWER: case LILAC: case PEONY: + case TWISTING_VINES: + case TWISTING_VINES_PLANT: + case WEEPING_VINES: + case WEEPING_VINES_PLANT: + case KELP: + case KELP_PLANT: return true; default: return false;