diff --git a/pom.xml b/pom.xml index f3522065..006e8c11 100644 --- a/pom.xml +++ b/pom.xml @@ -7,10 +7,10 @@ com.github.civclassic civclassic-parent - 1.0.0 + 1.0.1 - vg.civcraft.mc.citadel + com.github.civclassic Citadel jar 4.2.0 @@ -19,27 +19,27 @@ - com.destroystokyo.paper - paper-api - 1.16.4-R0.1-SNAPSHOT + io.papermc.paper + paper + 1.17.1-R0.1-SNAPSHOT provided - vg.civcraft.mc.civmodcore + com.github.civclassic CivModCore - 1.8.2 + 1.9.0 provided - vg.civcraft.mc.namelayer + com.github.civclassic NameLayer - 2.14.1 + 2.15.0 provided com.gmail.filoghost.holographicdisplays holographicdisplays-api - 2.4.5 + 2.4.8 provided @@ -49,6 +49,10 @@ codemc-repo https://repo.codemc.io/repository/maven-public/ + + papermc + https://papermc.io/repo/repository/maven-public/ + civ-github-repo https://raw.githubusercontent.com/CivClassic/artifacts/master/ diff --git a/src/main/java/vg/civcraft/mc/citadel/Citadel.java b/src/main/java/vg/civcraft/mc/citadel/Citadel.java index b092dba2..78fde2dd 100644 --- a/src/main/java/vg/civcraft/mc/citadel/Citadel.java +++ b/src/main/java/vg/civcraft/mc/citadel/Citadel.java @@ -3,6 +3,7 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.event.HandlerList; +import vg.civcraft.mc.citadel.command.CitadelCommandManager; import vg.civcraft.mc.citadel.listener.BlockListener; import vg.civcraft.mc.citadel.listener.EntityListener; import vg.civcraft.mc.citadel.listener.InventoryListener; @@ -17,10 +18,10 @@ 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.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.civmodcore.world.locations.chunkmeta.api.BlockBasedChunkMetaView; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.api.ChunkMetaAPI; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableBasedDataObject; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableStorageEngine; public class Citadel extends ACivMod { @@ -38,6 +39,7 @@ public static Citadel getInstance() { private HologramManager holoManager; private CitadelSettingManager settingManager; private CitadelDAO dao; + private CitadelCommandManager commandManager; private PlayerStateManager stateManager; @@ -114,7 +116,7 @@ public void onEnable() { Bukkit.shutdown(); return; } - BlockBasedChunkMetaView> chunkMetaData = + BlockBasedChunkMetaView> chunkMetaData = ChunkMetaAPI.registerBlockBasedPlugin(this, () -> new CitadelChunkData(false, dao),dao, true); if (chunkMetaData == null) { logger.severe("Errors setting up chunk metadata API, shutting down"); @@ -133,6 +135,7 @@ public void onEnable() { else { logger.info("HolographicDisplays is not loaded, no holograms available"); }}); + commandManager = new CitadelCommandManager(this); CitadelPermissionHandler.setup(); registerListeners(); } diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java index b64d2deb..730f6d5d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelConfigManager.java @@ -10,12 +10,13 @@ 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.config.ConfigHelper; +import vg.civcraft.mc.civmodcore.config.ConfigParser; +import vg.civcraft.mc.civmodcore.dao.DatabaseCredentials; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; -import vg.civcraft.mc.civmodcore.util.ConfigParsing; -import vg.civcraft.mc.civmodcore.util.TextUtil; +import vg.civcraft.mc.civmodcore.utilities.TextUtil; -public class CitadelConfigManager extends CoreConfigManager { +public class CitadelConfigManager extends ConfigParser { private ManagedDatasource database; private List reinforcementTypes; @@ -106,7 +107,7 @@ public boolean logMessages() { } private void parseAcidMaterials(ConfigurationSection config) { - acidMaterials = parseMaterialList(config, "acidblock_material"); + acidMaterials = ConfigHelper.parseMaterialList(config, "acidblock_material"); if (acidMaterials == null) { logger.info("No valid acid materials found in config"); acidMaterials = new LinkedList<>(); @@ -118,8 +119,8 @@ private void parseAcidMaterials(ConfigurationSection config) { @Override protected boolean parseInternal(ConfigurationSection config) { - database = (ManagedDatasource) config.get("database"); - globalBlackList = parseMaterialList(config, "non_reinforceables"); + database = ManagedDatasource.construct((ACivMod) plugin, (DatabaseCredentials) config.get("database")); + globalBlackList = ConfigHelper.parseMaterialList(config, "non_reinforceables"); parseAcidMaterials(config); logHostileBreaks = config.getBoolean("logHostileBreaks", true); logFriendlyBreaks = config.getBoolean("logFriendlyBreaks", true); @@ -128,7 +129,7 @@ protected boolean parseInternal(ConfigurationSection config) { logMessages = config.getBoolean("logMessages", true); redstoneRange = config.getDouble("redstoneDistance", 3); globalDecayMultiplier = config.getDouble("global_decay_multiplier", 2.0); - globalDecayTimer = ConfigParsing.parseTime(config.getString("global_decay_timer", "0")); + globalDecayTimer = ConfigHelper.parseTime(config.getString("global_decay_timer", "0")); parseReinforcementTypes(config.getConfigurationSection("reinforcements")); hangersInheritReinforcements = config.getBoolean("hangers_inherit_reinforcement", false); return true; @@ -145,18 +146,18 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { 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); + long gracePeriod = ConfigHelper.parseTime(config.getString("grace_period", "0"), TimeUnit.MILLISECONDS); + long maturationTime = ConfigHelper.parseTime(config.getString("mature_time", "0"), TimeUnit.MILLISECONDS); + long acidTime = ConfigHelper.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); double returnChance = config.getDouble("return_chance", 1.0); - List reinforceables = parseMaterialList(config, "reinforceables"); - List nonReinforceables = parseMaterialList(config, "non_reinforceables"); + List reinforceables = ConfigHelper.parseMaterialList(config, "reinforceables"); + List nonReinforceables = ConfigHelper.parseMaterialList(config, "non_reinforceables"); short id = (short) config.getInt("id", -1); - long decayTimer = ConfigParsing + long decayTimer = ConfigHelper .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); @@ -169,7 +170,7 @@ private ReinforcementType parseReinforcementType(ConfigurationSection config) { logger.warning("Reinforcement type at " + config.getCurrentPath() + " had no id, it was ignored"); return null; } - if (reinforceables != null && nonReinforceables != null) { + if (!reinforceables.isEmpty() && !nonReinforceables.isEmpty()) { 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; diff --git a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java index c5ca9440..eb25b027 100644 --- a/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java +++ b/src/main/java/vg/civcraft/mc/citadel/CitadelUtility.java @@ -12,7 +12,7 @@ import org.bukkit.entity.Player; 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.civmodcore.inventory.items.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; @@ -43,6 +43,7 @@ public static boolean isPlant(Block plant) { case JUNGLE_SAPLING: case OAK_SAPLING: case SPRUCE_SAPLING: + case FLOWERING_AZALEA: case WHEAT: case CARROTS: case POTATOES: @@ -65,6 +66,11 @@ public static boolean isPlant(Block plant) { case WEEPING_VINES_PLANT: case KELP: case KELP_PLANT: + case BIG_DRIPLEAF: + case BIG_DRIPLEAF_STEM: + case CAVE_VINES: + case CAVE_VINES_PLANT: + case SMALL_DRIPLEAF: case SWEET_BERRY_BUSH: case BAMBOO: case BAMBOO_SAPLING: diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java index 684fc0ee..3d6e1160 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementLogic.java @@ -6,9 +6,11 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.block.data.type.AmethystCluster; import org.bukkit.block.data.type.Bed; import org.bukkit.block.data.type.Chest; import org.bukkit.block.data.type.CoralWallFan; +import org.bukkit.block.data.type.PointedDripstone; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryHolder; @@ -172,6 +174,7 @@ public static Block getResponsibleBlock(Block block) { case WARPED_FUNGUS: case CRIMSON_FUNGUS: case BAMBOO_SAPLING: + case FLOWERING_AZALEA: case WHEAT: case CARROTS: case POTATOES: @@ -212,21 +215,15 @@ public static Block getResponsibleBlock(Block block) { case DEAD_FIRE_CORAL_FAN: case DEAD_HORN_CORAL: case DEAD_HORN_CORAL_FAN: + case SMALL_DRIPLEAF: 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: case TWISTING_VINES_PLANT: + case BIG_DRIPLEAF_STEM: case CACTUS: case SUNFLOWER: case LILAC: @@ -242,6 +239,10 @@ public static Block getResponsibleBlock(Block block) { } return below; } + case SPORE_BLOSSOM: + case HANGING_ROOTS: { + return block.getRelative(BlockFace.UP); + } case ACACIA_DOOR: case BIRCH_DOOR: case DARK_OAK_DOOR: @@ -292,6 +293,12 @@ public static Block getResponsibleBlock(Block block) { CoralWallFan cwf = (CoralWallFan) block.getBlockData(); return block.getRelative(cwf.getFacing().getOppositeFace()); } + case SMALL_AMETHYST_BUD: + case MEDIUM_AMETHYST_BUD: + case LARGE_AMETHYST_BUD: { + AmethystCluster amethyst = (AmethystCluster) block.getBlockData(); + return block.getRelative(amethyst.getFacing().getOppositeFace()); + } case WEEPING_VINES: { // scan upwards Block above = block.getRelative(BlockFace.UP); @@ -300,14 +307,46 @@ public static Block getResponsibleBlock(Block block) { } return above; } + case CAVE_VINES: { + // scan upwards for first different block + Block above = block.getRelative(BlockFace.UP); + while (above.getType() == block.getType() || above.getType() == Material.CAVE_VINES_PLANT) { + above = above.getRelative(BlockFace.UP); + } + return above; + } + case CAVE_VINES_PLANT: case WEEPING_VINES_PLANT: { - // scan upwards + // scan upwards for first different block Block above = block.getRelative(BlockFace.UP); while (above.getType() == block.getType()) { above = above.getRelative(BlockFace.UP); } return above; } + 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 BIG_DRIPLEAF: { + // scan downwards for first different block + Block below = block.getRelative(BlockFace.DOWN); + while (below.getType() == block.getType() || below.getType() == Material.BIG_DRIPLEAF_STEM) { + below = below.getRelative(BlockFace.DOWN); + } + return below; + } + case POINTED_DRIPSTONE: + PointedDripstone dripstone = (PointedDripstone) block.getBlockData(); + Block direction = block.getRelative(dripstone.getVerticalDirection().getOppositeFace()); + while (direction.getType() == block.getType()) { + direction = direction.getRelative(dripstone.getVerticalDirection().getOppositeFace()); + } + return direction; default: { return block; } diff --git a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java index acc40a44..6d5e50bb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/ReinforcementManager.java @@ -4,9 +4,9 @@ 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; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.api.BlockBasedChunkMetaView; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableBasedDataObject; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableStorageEngine; public class ReinforcementManager { 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 eaf837e8..0ca7d1d6 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Acid.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Acid.java @@ -1,8 +1,9 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import java.util.Iterator; -import java.util.List; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.bukkit.Bukkit; @@ -10,7 +11,6 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; 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; @@ -21,17 +21,14 @@ 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.civmodcore.inventory.items.MaterialUtils; -import vg.civcraft.mc.civmodcore.util.TextUtil; +import vg.civcraft.mc.civmodcore.utilities.TextUtil; -@CivCommand(id = "ctacid") -public class Acid extends StandaloneCommand { +public class Acid extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player p = (Player) sender; + @CommandAlias("ctacid|acid") + @Description("Removes the block above it if used on an acid block") + public void execute(Player p) { Iterator itr = new BlockIterator(p, 40); // Within 2.5 chunks AcidManager acidMan = Citadel.getInstance().getAcidManager(); boolean foundAny = false; @@ -44,45 +41,38 @@ public boolean execute(CommandSender sender, String[] args) { if (!foundAny) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not a valid acid block"); } - return true; + return; } Reinforcement reinforcement = ReinforcementLogic.getReinforcementAt(block.getLocation()); if (reinforcement == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That block is not reinforced."); - return true; + return; } 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; + return; } long neededTime = acidMan.getRemainingAcidMaturationTime(reinforcement); if (neededTime > 0) { - CitadelUtility.sendAndLog(p, ChatColor.RED, - "That acid block will be mature in " - + TextUtil.formatDuration(neededTime, TimeUnit.MILLISECONDS), - block.getLocation()); - return true; + CitadelUtility.sendAndLog(p, ChatColor.RED, "That acid block will be mature in " + + TextUtil.formatDuration(neededTime, TimeUnit.MILLISECONDS)); + return; } Block topFace = block.getRelative(BlockFace.UP); if (MaterialUtils.isAir(topFace.getType())) { - CitadelUtility.sendAndLog(p, ChatColor.RED, - "There is no block above to acid block.", - block.getLocation()); - return true; + CitadelUtility.sendAndLog(p, ChatColor.RED, "There is no block above to acid block."); + return; } Reinforcement topRein = ReinforcementLogic.getReinforcementProtecting(topFace); if (topRein == null) { - CitadelUtility.sendAndLog(p, ChatColor.RED, - "The block above doesn't have a reinforcement.", - block.getLocation()); - return true; + CitadelUtility.sendAndLog(p, ChatColor.RED, "The block above doesn't have a reinforcement."); + return; } if (!acidMan.canAcidBlock(reinforcement.getType(), topRein.getType())) { CitadelUtility.sendAndLog(p, ChatColor.RED, - reinforcement.getType().getName() + " can not acid away " + topRein.getType().getName(), - block.getLocation()); - return true; + reinforcement.getType().getName() + " can not acid away " + topRein.getType().getName()); + return; } ReinforcementAcidBlockedEvent event = new ReinforcementAcidBlockedEvent(p, reinforcement, topRein); Bukkit.getPluginManager().callEvent(event); @@ -91,7 +81,7 @@ public boolean execute(CommandSender sender, String[] args) { Citadel.getInstance().getLogger().log(Level.INFO, "Acid block event cancelled for acid at " + reinforcement.getLocation()); } - return true; + return; } if (Citadel.getInstance().getConfigManager().logHostileBreaks()) { @@ -108,12 +98,6 @@ public boolean execute(CommandSender sender, String[] args) { topFace.breakNaturally(); } } - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - 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 9b348d97..2235cd93 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AdvancedFortification.java @@ -1,10 +1,13 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; 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; @@ -14,92 +17,76 @@ 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; -@CivCommand(id = "cta") -public class AdvancedFortification extends StandaloneCommand { +public class AdvancedFortification extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("cta|advfort") + @Syntax("") + @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") + @CommandCompletion("@CT_Groups") + public void execute(Player player, @Optional String targetGroup) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); AbstractPlayerState currentState = stateManager.getState(player); AdvancedFortificationState advFortState = null; if (currentState instanceof AdvancedFortificationState) { advFortState = (AdvancedFortificationState) currentState; - if (args.length == 0) { + if (targetGroup.isEmpty()) { stateManager.setState(player, null); - return true; + return; } } ItemStack mainHand = player.getInventory().getItemInMainHand(); if (mainHand.getType() == Material.AIR) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to hold an item in your main hand to specify the block type to reinforce"); - return true; + return; } ItemStack offHand = player.getInventory().getItemInOffHand(); if (offHand.getType() == Material.AIR) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You need to hold a reinforcement item in your off hand"); - return true; + return; } ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager().getByItemStack(offHand); if (type == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with the item in your off hand"); - return true; + return; } if (!type.canBeReinforced(mainHand.getType())) { CitadelUtility.sendAndLog(player, ChatColor.AQUA, type.getName() + ChatColor.RED + " can not reinforce " + mainHand.getType().name()); - return true; + return; } String groupName = null; - if (args.length == 0) { + if (targetGroup.isEmpty()) { groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == 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; + return; } } else { - groupName = args[0]; + groupName = targetGroup; } Group group = GroupManager.getGroup(groupName); if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); - return true; + return; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), CitadelPermissionHandler.getReinforce()); if (!hasAccess) { - CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); - return true; + CitadelUtility + .sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); + return; } if (advFortState == null) { - advFortState = new AdvancedFortificationState(player); + advFortState = new AdvancedFortificationState(player); 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, CitadelPermissionHandler.getReinforce(), - (Player) sender); - else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (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 43c7c522..dbcc9081 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/AreaReinforce.java @@ -1,70 +1,63 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; import java.util.UUID; import org.bukkit.ChatColor; 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.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; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; -@CivCommand(id = "ctar") -public class AreaReinforce extends StandaloneCommand { +public class AreaReinforce extends BaseCommand { - @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; + @CommandAlias("ctar") + @Syntax(" ") + @Description("Using the reinforcement item in your main hand, reinforces an area to your default or a target group.") + @CommandCompletion("@CT_Groups @nothing @nothing @nothing @nothing @nothing @nothing") + public void execute(Player p, @Optional String targetGroup, String minX, String minY, String minZ, String maxX, String maxY, String maxZ) { UUID uuid = NameAPI.getUUID(p.getName()); 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; + return; } String groupName = null; - if (args.length == 6) { + if (targetGroup == null) { groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "You need to set a default group \n Use /nlsdg to do so"); - return true; + return; } } else { - if (args.length == 0) { - p.sendMessage(ChatColor.RED + "Please input a valid group"); - return true; - } - groupName = args[0]; + groupName = targetGroup; } Group group = GroupManager.getGroup(groupName); if (group == null) { CitadelUtility.sendAndLog(p, ChatColor.RED, "That group does not exist."); - return true; + return; } // no additional group permission check here because the player is // admin/op anyway int xMin, yMin, zMin, xMax, yMax, zMax; - int offset = args.length == 7 ? 1 : 0; try { - int x1 = Integer.parseInt(args[offset]); - int y1 = Integer.parseInt(args[offset + 1]); - int z1 = Integer.parseInt(args[offset + 2]); - int x2 = Integer.parseInt(args[offset + 3]); - int y2 = Integer.parseInt(args[offset + 4]); - int z2 = Integer.parseInt(args[offset + 5]); + int x1 = Integer.parseInt(minX); + int y1 = Integer.parseInt(minY); + int z1 = Integer.parseInt(minZ); + int x2 = Integer.parseInt(maxX); + int y2 = Integer.parseInt(maxY); + int z2 = Integer.parseInt(maxZ); xMin = Math.min(x1, x2); yMin = Math.min(y1, y2); zMin = Math.min(z1, z2); @@ -73,7 +66,7 @@ public boolean execute(CommandSender sender, String[] args) { zMax = Math.max(z1, z2); } catch (NumberFormatException e) { CitadelUtility.sendAndLog(p, ChatColor.RED, "One of the arguments you provided was not a number"); - return false; + return; } int count = 0; for (int x = xMin; x <= xMax; x++) { @@ -99,12 +92,6 @@ public boolean execute(CommandSender sender, String[] args) { } } - CitadelUtility.sendAndLog(p, ChatColor.GREEN, "Successfully created " + count + " reinforcements"); - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList<>(); + CitadelUtility.sendAndLog(p, ChatColor.GREEN, "Successfully created " + count + "reinforcements"); } } 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 8e480e21..165b733e 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Bypass.java @@ -1,22 +1,19 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; 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; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; -@CivCommand(id = "ctb") -public class Bypass extends StandaloneCommand { +public class Bypass extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("ctb|bypass") + @Description("Toggles bypass state. In bypass state you can break blocks reinforced on groups you have access to in a single break") + public void execute(Player player) { BooleanSetting setting = Citadel.getInstance().getSettingManager().getBypass(); boolean enabled = setting.getValue(player); if (enabled) { @@ -26,11 +23,5 @@ public boolean execute(CommandSender sender, String[] args) { "Bypass mode has been enabled. You will be able to break reinforced blocks if you are on the group."); } 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/command/CitadelCommandManager.java b/src/main/java/vg/civcraft/mc/citadel/command/CitadelCommandManager.java new file mode 100644 index 00000000..ba4c3461 --- /dev/null +++ b/src/main/java/vg/civcraft/mc/citadel/command/CitadelCommandManager.java @@ -0,0 +1,39 @@ +package vg.civcraft.mc.citadel.command; + +import co.aikar.commands.BukkitCommandCompletionContext; +import co.aikar.commands.CommandCompletions; +import javax.annotation.Nonnull; +import org.bukkit.plugin.Plugin; +import vg.civcraft.mc.civmodcore.commands.CommandManager; +import vg.civcraft.mc.namelayer.command.TabCompleters.GroupTabCompleter; + +public class CitadelCommandManager extends CommandManager { + + public CitadelCommandManager(Plugin plugin) { + super(plugin); + init(); + } + + @Override + public void registerCommands() { + registerCommand(new Acid()); + registerCommand(new AdvancedFortification()); + registerCommand(new AreaReinforce()); + registerCommand(new Bypass()); + registerCommand(new EasyMode()); + registerCommand(new Fortification()); + registerCommand(new Information()); + registerCommand(new Insecure()); + registerCommand(new Off()); + registerCommand(new PatchMode()); + registerCommand(new Reinforce()); + registerCommand(new ReinforcementsGUI()); + registerCommand(new Reload()); + } + + @Override + public void registerCompletions(@Nonnull CommandCompletions completions) { + super.registerCompletions(completions); + completions.registerCompletion("CT_Groups", (context) -> GroupTabCompleter.complete(context.getInput(), null, context.getPlayer())); + } +} 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 da0a5bf5..becefda3 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/EasyMode.java @@ -1,22 +1,19 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; 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; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; -@CivCommand(id = "cte") -public class EasyMode extends StandaloneCommand { +public class EasyMode extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("cte|easymode") + @Description("Reinforces to your default group using materials from your offhand.") + public void execute(Player player) { BooleanSetting setting = Citadel.getInstance().getSettingManager().getEasyMode(); boolean enabled = setting.getValue(player); if (enabled) { @@ -26,11 +23,5 @@ public boolean execute(CommandSender sender, String[] args) { "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; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - 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 9e9198a3..258f0323 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Fortification.java @@ -1,9 +1,12 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; 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.CitadelPermissionHandler; @@ -12,79 +15,63 @@ import vg.civcraft.mc.citadel.playerstate.FortificationState; 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; -@CivCommand(id = "ctf") -public class Fortification extends StandaloneCommand { +public class Fortification extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("ctf|reinforce|fortify") + @Syntax("") + @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") + @CommandCompletion("@CT_Groups") + public void execute(Player player, @Optional String targetGroup) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); AbstractPlayerState currentState = stateManager.getState(player); - if (args.length == 0 && currentState instanceof FortificationState) { + if (targetGroup == null && currentState instanceof FortificationState) { stateManager.setState(player, null); - return true; + return; } ReinforcementType type = Citadel.getInstance().getReinforcementTypeManager() .getByItemStack(player.getInventory().getItemInMainHand()); if (type == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You can not reinforce with this item"); stateManager.setState(player, null); - return true; + return; } String groupName = null; - if (args.length == 0) { + if (targetGroup == null) { groupName = NameAPI.getGroupManager().getDefaultGroup(player.getUniqueId()); if (groupName == 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; + return; } } else { - groupName = args[0]; + groupName = targetGroup; } Group group = GroupManager.getGroup(groupName); if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); - return true; + return; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), CitadelPermissionHandler.getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); - return true; + return; } if (currentState instanceof FortificationState) { FortificationState fortState = (FortificationState) currentState; if (fortState.getGroup() == group && fortState.getType() == type) { stateManager.setState(player, null); - return true; + return; } } stateManager.setState(player, new FortificationState(player, type, group)); - return true; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - if (args.length == 0) - return GroupTabCompleter.complete(null, CitadelPermissionHandler.getReinforce(), - (Player) sender); - else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (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 b91b8e8f..de5ee849 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Information.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Information.java @@ -1,30 +1,21 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; -@CivCommand(id = "cti") -public class Information extends StandaloneCommand { +public class Information extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("cti|ctinfo|info") + @Description("Enters information mode. Interacting with blocks in information mode will show information on their reinforcement") + public void execute(Player 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; - } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - 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 cd59de0a..75d0cb3d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Insecure.java @@ -1,22 +1,19 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; -import org.bukkit.command.CommandSender; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.Citadel; 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; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "ctin") -public class Insecure extends StandaloneCommand { +public class Insecure extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("ctin|insecure") + @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") + public void execute(Player player) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof InsecureState) { @@ -24,12 +21,5 @@ public boolean execute(CommandSender sender, String[] args) { } else { stateManager.setState(player, new InsecureState(player)); } - return true; } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - 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 78ab6924..cab93ced 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Off.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Off.java @@ -1,35 +1,26 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; 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; -@CivCommand(id = "cto") -public class Off extends StandaloneCommand { +public class Off extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Citadel.getInstance().getStateManager().setState((Player) sender, null); + @CommandAlias("cto") + @Description("Leaves all reinforcement modes") + public void execute(Player sender) { + Citadel.getInstance().getStateManager().setState(sender, null); CitadelSettingManager settings = Citadel.getInstance().getSettingManager(); - UUID uuid = ((Player) sender).getUniqueId(); + UUID uuid = 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; } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return new ArrayList<>(); - } - } 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 b9e9ccf5..367b0715 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/PatchMode.java @@ -1,22 +1,21 @@ package vg.civcraft.mc.citadel.command; -import java.util.LinkedList; -import java.util.List; -import org.bukkit.command.CommandSender; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; 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{ +public class PatchMode extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("ctp|patchmode|patch") + @Description("Enters patch mode, which allows you to repair reinforcements. Note that repairing reinforcements will also reset their maturation cycle") + @CommandCompletion("@CT_Groups") + public void execute(Player player) { PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof PatchState) { @@ -24,12 +23,5 @@ public boolean execute(CommandSender sender, String[] args) { } else { stateManager.setState(player, new PatchState(player)); } - return true; } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return new LinkedList<>(); - } - } 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 62fdbe62..53863f3a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reinforce.java @@ -1,10 +1,13 @@ package vg.civcraft.mc.citadel.command; -import java.util.ArrayList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; import java.util.UUID; 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.CitadelPermissionHandler; @@ -12,70 +15,51 @@ 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; -@CivCommand(id = "ctr") -public class Reinforce extends StandaloneCommand { +public class Reinforce extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { - Player player = (Player) sender; + @CommandAlias("ctr") + @Syntax("") + @Description("Enters reinforcing mode. Interacting with blocks in reinforcing mode will reinforce them or modify their reinforcement") + @CommandCompletion("@CT_Groups") + public void execute(Player player, @Optional String targetGroup) { UUID uuid = NameAPI.getUUID(player.getName()); String groupName = null; - if (args.length == 0) { + if (targetGroup == null) { groupName = NameAPI.getGroupManager().getDefaultGroup(uuid); if (groupName == 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; + return; } } else { - groupName = args[0]; + groupName = targetGroup; } PlayerStateManager stateManager = Citadel.getInstance().getStateManager(); Group group = GroupManager.getGroup(groupName); if (group == null) { CitadelUtility.sendAndLog(player, ChatColor.RED, "The group " + groupName + " does not exist."); stateManager.setState(player, null); - return true; + return; } boolean hasAccess = NameAPI.getGroupManager().hasAccess(group.getName(), player.getUniqueId(), CitadelPermissionHandler.getReinforce()); if (!hasAccess) { CitadelUtility.sendAndLog(player, ChatColor.RED, "You do not have permission to reinforce on " + group.getName()); stateManager.setState(player, null); - return true; + return; } AbstractPlayerState currentState = Citadel.getInstance().getStateManager().getState(player); if (currentState instanceof ReinforcingState) { ReinforcingState reinState = (ReinforcingState) currentState; if (reinState.getGroup() == group) { stateManager.setState(player, null); - return true; + return; } } stateManager.setState(player, new ReinforcingState(player, 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, CitadelPermissionHandler.getReinforce(), - (Player) sender); - else if (args.length == 1) - return GroupTabCompleter.complete(args[0], CitadelPermissionHandler.getReinforce(), - (Player) sender); - else { - 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 38e74908..c1506bed 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/ReinforcementsGUI.java @@ -1,31 +1,31 @@ package vg.civcraft.mc.citadel.command; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import java.text.DecimalFormat; import java.util.Collections; 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 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.StandaloneCommand; +import vg.civcraft.mc.civmodcore.inventory.gui.DecorationStack; +import vg.civcraft.mc.civmodcore.inventory.gui.IClickable; +import vg.civcraft.mc.civmodcore.inventory.gui.MultiPageView; import vg.civcraft.mc.civmodcore.inventory.items.ItemUtils; -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.util.TextUtil; +import vg.civcraft.mc.civmodcore.utilities.TextUtil; -@CivCommand(id = "ctdl") -public class ReinforcementsGUI extends StandaloneCommand { +public class ReinforcementsGUI extends BaseCommand { private DecimalFormat format = new DecimalFormat("##.##"); - @Override - public boolean execute(CommandSender sender, String[] arg1) { + @CommandAlias("ctdl|reinforcements") + @Description("Opens a GUI displaying all reinforcement materials") + public void execute(Player sender) { List types = new LinkedList<>( Citadel.getInstance().getReinforcementTypeManager().getAllTypes()); // sort ascending by health @@ -48,14 +48,7 @@ public boolean execute(CommandSender sender, String[] arg1) { IClickable click = new DecorationStack(is); clicks.add(click); } - MultiPageView pageView = new MultiPageView((Player) sender, clicks, ChatColor.BLUE + "Reinforcements", true); + MultiPageView pageView = new MultiPageView(sender, clicks, ChatColor.BLUE + "Reinforcements", true); pageView.showScreen(); - return true; } - - @Override - public List tabComplete(CommandSender arg0, String[] arg1) { - return null; - } - } diff --git a/src/main/java/vg/civcraft/mc/citadel/command/Reload.java b/src/main/java/vg/civcraft/mc/citadel/command/Reload.java index 4c8d1f4a..9cc35018 100644 --- a/src/main/java/vg/civcraft/mc/citadel/command/Reload.java +++ b/src/main/java/vg/civcraft/mc/citadel/command/Reload.java @@ -1,26 +1,20 @@ package vg.civcraft.mc.citadel.command; -import java.util.LinkedList; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; 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 { +public class Reload extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { + @CommandAlias("citadelreload") + @CommandPermission("citadel.admin") + @Description("Reloads Citadel entirely") + public void execute(CommandSender sender) { 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/listener/BlockListener.java b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index 11e31e09..9799039d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -1,12 +1,15 @@ package vg.civcraft.mc.citadel.listener; import com.destroystokyo.paper.MaterialTags; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Container; +import org.bukkit.block.data.Lightable; import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Comparator; import org.bukkit.block.data.type.Lectern; @@ -18,10 +21,12 @@ import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockFertilizeEvent; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerHarvestBlockEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerTakeLecternBookEvent; import org.bukkit.event.world.StructureGrowEvent; @@ -34,7 +39,7 @@ import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.inventory.items.MaterialUtils; import vg.civcraft.mc.civmodcore.inventory.items.MoreTags; -import vg.civcraft.mc.civmodcore.util.DoubleInteractFixer; +import vg.civcraft.mc.civmodcore.utilities.DoubleInteractFixer; import vg.civcraft.mc.civmodcore.world.WorldUtils; public class BlockListener implements Listener { @@ -155,7 +160,7 @@ public void liquidDumpEvent(PlayerBucketEmptyEvent event) { @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onBlockFromToEvent(BlockFromToEvent event) { // prevent water/lava from spilling reinforced blocks away - if (event.getToBlock().getY() < 0) { + if (event.getToBlock().getY() < event.getToBlock().getWorld().getMinHeight()) { return; } Reinforcement rein = ReinforcementLogic.getReinforcementProtecting(event.getToBlock()); @@ -272,6 +277,40 @@ public void preventStrippingLogs(PlayerInteractEvent pie) { } } + @EventHandler(priority = EventPriority.NORMAL) + public void rightClickCaveVines(PlayerHarvestBlockEvent event) { + Block harvestedBlock = event.getHarvestedBlock(); + Reinforcement reinforcement = ReinforcementLogic.getReinforcementProtecting(harvestedBlock); + if (reinforcement == null) { + return; + } + if (!reinforcement.hasPermission(event.getPlayer(), CitadelPermissionHandler.getCrops())) { + event.getPlayer().sendMessage(Component.text("You do not have permission to harvest this crop").color(NamedTextColor.RED)); + event.setCancelled(true); + } + } + + /* + For some stupid reason, Waxing / Stripping copper blocks calls a BlockPlaceEvent instead of PlayerInteractEvent, + this obviously might change in future so heres a warning note + Reminder: This is retarded + */ + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void preventWaxingCopper(BlockPlaceEvent event) { + if (!MoreTags.COPPER_BLOCKS.isTagged(event.getBlockPlaced().getType())) { + return; + } + Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(event.getBlockPlaced()); + if (reinforcement == null) { + return; + } + Player player = event.getPlayer(); + if (!reinforcement.hasPermission(player, CitadelPermissionHandler.getModifyBlocks())) { + player.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void preventTilingGrass(PlayerInteractEvent pie) { if (!pie.hasBlock()) { @@ -319,7 +358,7 @@ public void preventTillingDirtIntoFarmland(PlayerInteractEvent pie) { Block block = pie.getClickedBlock(); Material type = block.getType(); if (type != Material.GRASS_BLOCK && type != Material.DIRT && type != Material.COARSE_DIRT - && type != Material.GRASS_PATH) { + && type != Material.DIRT_PATH) { return; } EquipmentSlot hand = pie.getHand(); @@ -383,6 +422,57 @@ public void preventHarvestingHoney(PlayerInteractEvent pie) { } } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void preventLightingCandles(PlayerInteractEvent pie) { + if (!pie.hasBlock()) { + return; + } + if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + Block block = pie.getClickedBlock(); + Material type = block.getType(); + if (!MoreTags.LIGHTABLE_CANDLES.isTagged(type)) { + return; + } + if (!pie.hasItem()) { + Lightable candles = (Lightable) block.getBlockData(); + if (candles.isLit()) { + Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null) { + return; + } + if (!rein.hasPermission(pie.getPlayer(), CitadelPermissionHandler.getModifyBlocks())) { + pie.getPlayer().sendMessage(ChatColor.RED + "You do not have permission to modify this block"); + pie.setCancelled(true); + 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.FLINT_AND_STEEL) { + 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.LOW, ignoreCancelled = false) public void openBeacon(PlayerInteractEvent pie) { if (!pie.hasBlock()) { @@ -446,4 +536,15 @@ private void INTERNAL_checkLecternModificationPermission(final Cancellable event event.setCancelled(true); CitadelUtility.sendAndLog(clicker, ChatColor.RED, "You cannot modify that lectern.", lecternLocation); } + + @EventHandler(ignoreCancelled = true) + public void onMossSpread(BlockFertilizeEvent event) { + for (BlockState block : event.getBlocks()) { + if (Citadel.getInstance().getReinforcementManager().getReinforcement(block.getBlock()) != null) { + event.getPlayer().sendMessage(Component.text("You can't do that while their are reinforced blocks around!").color(NamedTextColor.RED)); + event.setCancelled(true); + return; + } + } + } } 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 41e41716..76d03df1 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/EntityListener.java @@ -4,6 +4,8 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -26,15 +28,17 @@ import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.hanging.HangingPlaceEvent; +import org.bukkit.event.player.PlayerBucketFillEvent; 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.events.ReinforcementBypassEvent; import vg.civcraft.mc.citadel.model.Reinforcement; import vg.civcraft.mc.civmodcore.inventory.items.ItemUtils; -import vg.civcraft.mc.civmodcore.util.MoreClassUtils; +import vg.civcraft.mc.civmodcore.utilities.MoreClassUtils; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.NameLayerPlugin; @@ -82,6 +86,12 @@ public void changeBlock(EntityChangeBlockEvent ecbe) { if (rein == null || ecbe.getEntityType() == EntityType.FALLING_BLOCK) { return; } + if (ecbe.getBlock().getType() == Material.BIG_DRIPLEAF) { + return; + } + if (ecbe.getBlock().getType() == Material.CAVE_VINES || ecbe.getBlock().getType() == Material.CAVE_VINES_PLANT) { + return; + } ReinforcementLogic.damageReinforcement(rein, ReinforcementLogic.getDamageApplied(rein), ecbe.getEntity()); if (rein.isBroken()) { return; @@ -145,6 +155,32 @@ public void run() { }.runTaskAsynchronously(Citadel.getInstance()); } + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void powderedSnowPickup(PlayerBucketFillEvent event) { + if (event.getBlockClicked().getType() != Material.POWDER_SNOW) { + return; + } + + Block clickedBlock = event.getBlockClicked(); + Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(clickedBlock); + if (reinforcement == null) { + return; + } + Player player = event.getPlayer(); + if (!reinforcement.hasPermission(player, CitadelPermissionHandler.getBypass())) { + player.sendMessage(Component.text("You do not have permission to bypass this block!").color(NamedTextColor.RED)); + event.setCancelled(true); + return; + } + ReinforcementBypassEvent bypassEvent = new ReinforcementBypassEvent(player, reinforcement); + Bukkit.getPluginManager().callEvent(bypassEvent); + if (event.isCancelled()) { + event.setCancelled(true); + return; + } + reinforcement.setHealth(-1); + } + // prevent creating golems from reinforced blocks @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void spawn(CreatureSpawnEvent cse) { 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 f8f3e746..e1e67a2b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java +++ b/src/main/java/vg/civcraft/mc/citadel/listener/ModeListener.java @@ -25,15 +25,15 @@ 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; -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; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLine; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLineAPI; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.CivScoreBoard; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.ScoreBoardAPI; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSetting; +import vg.civcraft.mc.civmodcore.players.settings.SettingChangeListener; +import vg.civcraft.mc.civmodcore.players.settings.impl.DisplayLocationSetting; +import vg.civcraft.mc.civmodcore.utilities.DoubleInteractFixer; +import vg.civcraft.mc.civmodcore.utilities.TextUtil; public class ModeListener implements Listener { @@ -124,7 +124,7 @@ private void setReinModeOverlay(Player player, AbstractPlayerState state) { } private static void updateDisplaySetting(Player player, DisplayLocationSetting locSetting, boolean state, String text, - BottomLine bottomLine, CivScoreBoard scoreBoard) { + BottomLine bottomLine, CivScoreBoard scoreBoard) { if (player == null) { return; } 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 d812c729..8e871cc0 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelChunkData.java @@ -1,6 +1,7 @@ package vg.civcraft.mc.citadel.model; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; + +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; public class CitadelChunkData extends TableBasedBlockChunkMeta { 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 afd911ef..676e9656 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelDAO.java @@ -14,6 +14,7 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.inventory.meta.ItemMeta; @@ -22,11 +23,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.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; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.XZWCoord; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.BlockBasedChunkMeta; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableBasedBlockChunkMeta; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableStorageEngine; +import vg.civcraft.mc.civmodcore.world.locations.global.WorldIDManager; public class CitadelDAO extends TableStorageEngine { @@ -151,7 +152,7 @@ public Boolean call() throws Exception { int maturationTime = rs.getInt(11); String lore = rs.getString(12); - short worldID = worldMan.getInternalWorldIdByName(worldName); + short worldID = worldMan.getInternalWorldId(Bukkit.getWorld(worldName)); if (worldID == -1) { logger.severe("Failed to find world id for world with name " + worldName); return false; 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 cf6a126a..5327926b 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/CitadelSettingManager.java @@ -14,15 +14,14 @@ 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; -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; -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; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.players.settings.gui.MenuSection; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.BoundedIntegerSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.CommandReplySetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.DecimalFormatSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.DisplayLocationSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.StringSetting; public class CitadelSettingManager { @@ -128,16 +127,16 @@ 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" + + ctbLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocationSetting.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" + + ctiLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocationSetting.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" + + modeLocationSetting = new DisplayLocationSetting(Citadel.getInstance(), DisplayLocationSetting.DisplayLocation.SIDEBAR, "Citadel mode display location" , "citadelReinModeDisplayLocation", new ItemStack(Material.NETHER_STAR), "Citadel mode"); PlayerSettingAPI.registerSetting(modeLocationSetting, 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 bf934274..bc7024a2 100644 --- a/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java +++ b/src/main/java/vg/civcraft/mc/citadel/model/Reinforcement.java @@ -5,7 +5,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import vg.civcraft.mc.citadel.reinforcementtypes.ReinforcementType; -import vg.civcraft.mc.civmodcore.locations.chunkmeta.block.table.TableBasedDataObject; +import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.block.table.TableBasedDataObject; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; 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 87f960c4..425e7a6d 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/AbstractPlayerState.java @@ -18,9 +18,9 @@ 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; -import vg.civcraft.mc.civmodcore.util.DelayedItemDrop; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.utilities.DelayedItemDrop; public abstract class AbstractPlayerState { 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 288b2dfb..4963d73a 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/PatchState.java @@ -12,7 +12,7 @@ import vg.civcraft.mc.citadel.events.ReinforcementRepairEvent; import vg.civcraft.mc.citadel.listener.ModeListener; import vg.civcraft.mc.citadel.model.Reinforcement; -import vg.civcraft.mc.civmodcore.itemHandling.ItemMap; +import vg.civcraft.mc.civmodcore.inventory.items.ItemMap; public class PatchState extends AbstractPlayerState { 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 fbdb6279..d68447cb 100644 --- a/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java +++ b/src/main/java/vg/civcraft/mc/citadel/playerstate/ReinforcingState.java @@ -14,7 +14,7 @@ import vg.civcraft.mc.citadel.events.ReinforcementGroupChangeEvent; 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.civmodcore.inventory.items.ItemMap; import vg.civcraft.mc.namelayer.NameAPI; import vg.civcraft.mc.namelayer.group.Group; 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 b4d57aa6..29c86007 100644 --- a/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java +++ b/src/main/java/vg/civcraft/mc/citadel/reinforcementtypes/ReinforcementType.java @@ -47,16 +47,16 @@ public ReinforcementType(float health, double returnChance, ItemStack item, long this.destructionEffect = destructionEffect; this.gracePeriod = gracePeriod; this.deletedGroupMulitplier = deletedGroupMulitplier; - if (allowsReinforceables != null) { + if (!allowsReinforceables.isEmpty()) { this.allowedReinforceables = new TreeSet<>(allowsReinforceables); } else { // can only black list OR white list - if (disallowedReinforceables != null) { + if (!disallowedReinforceables.isEmpty()) { this.disallowedReinforceables = new TreeSet<>(disallowedReinforceables); } } this.globalBlackList = new TreeSet<>(); - if (globalBlackList != null) { + if (!globalBlackList.isEmpty()) { this.globalBlackList.addAll(globalBlackList); } this.id = id; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c4909cfe..4c415119 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -197,15 +197,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 +database: + ==: vg.civcraft.mc.civmodcore.dao.DatabaseCredentials + plugin: Citadel + user: 'mc_namelayer' + password: 'minecraft' + host: localhost + port: 3306 + database: namelayer + poolsize: 5 + connection_timeout: 10000 + idle_timeout: 600000 + max_lifetime: 7200000 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 95628c04..61fdbd40 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,120 +17,7 @@ depend: 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. -api-version: 1.16 -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 - 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 +api-version: 1.17 permissions: citadel.admin: default: op