diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 467172d..6b4745f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,7 +4,7 @@ stages: variables: name: "UltimateTimber" path: "/builds/$CI_PROJECT_PATH" - version: "1.0.14" + version: "2.0.0" build: stage: build diff --git a/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java b/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java index 84e3c82..d2bcabf 100644 --- a/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java +++ b/src/main/java/com/songoda/ultimatetimber/UltimateTimber.java @@ -11,11 +11,16 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; +import java.util.HashSet; +import java.util.Set; + public class UltimateTimber extends JavaPlugin { private static final CommandSender console = Bukkit.getConsoleSender(); private static UltimateTimber INSTANCE; + private Set managers; + private VersionAdapter versionAdapter; private ConfigurationManager configurationManager; private DisabledWorldManager disabledWorldManager; @@ -24,6 +29,7 @@ public class UltimateTimber extends JavaPlugin { private SettingsManager settingsManager; private TreeAnimationManager treeAnimationManager; private TreeDefinitionManager treeDefinitionManager; + private TreeDetectionManager treeDetectionManager; private TreeFallManager treeFallManager; public static UltimateTimber getInstance() { @@ -38,14 +44,16 @@ public class UltimateTimber extends JavaPlugin { console.sendMessage(Methods.formatText("&7" + this.getDescription().getName() + " " + this.getDescription().getVersion() + " by &5Songoda <3&7!")); console.sendMessage(Methods.formatText("&7Action: &aEnabling&7...")); - this.configurationManager = new ConfigurationManager(this); - this.disabledWorldManager = new DisabledWorldManager(this); - this.hookManager = new HookManager(this); - this.messageManager = new MessageManager(this); - this.settingsManager = new SettingsManager(this); - this.treeAnimationManager = new TreeAnimationManager(this); - this.treeDefinitionManager = new TreeDefinitionManager(this); - this.treeFallManager = new TreeFallManager(this); + this.managers = new HashSet<>(); + this.configurationManager = this.registerManager(ConfigurationManager.class); + this.disabledWorldManager = this.registerManager(DisabledWorldManager.class); + this.hookManager = this.registerManager(HookManager.class); + this.messageManager = this.registerManager(MessageManager.class); + this.settingsManager = this.registerManager(SettingsManager.class); + this.treeAnimationManager = this.registerManager(TreeAnimationManager.class); + this.treeDefinitionManager = this.registerManager(TreeDefinitionManager.class); + this.treeDetectionManager = this.registerManager(TreeDetectionManager.class); + this.treeFallManager = this.registerManager(TreeFallManager.class); this.setupVersionAdapter(); this.reload(); @@ -61,7 +69,7 @@ public class UltimateTimber extends JavaPlugin { console.sendMessage(Methods.formatText("&7" + this.getDescription().getName() + " " + this.getDescription().getVersion() + " by &5Songoda <3&7!")); console.sendMessage(Methods.formatText("&7Action: &cDisabling&7...")); - + this.disable(); console.sendMessage(Methods.formatText("&a=============================")); } @@ -70,7 +78,14 @@ public class UltimateTimber extends JavaPlugin { * Reloads the plugin's settings */ public void reload() { + this.managers.forEach(Manager::reload); + } + /** + * Disables most of the plugin + */ + public void disable() { + this.managers.forEach(Manager::disable); } /** @@ -84,6 +99,28 @@ public class UltimateTimber extends JavaPlugin { } } + /** + * Registers a manager + * + * @param managerClass The class of the manager to create a new instance of + * @param extends Manager + * @return A new instance of the given manager class + */ + private T registerManager(Class managerClass) { + try { + T newManager = managerClass.getConstructor(UltimateTimber.class).newInstance(this); + this.managers.add(newManager); + return newManager; + } catch (Exception ignored) { + return null; + } + } + + /** + * Gets the active version adapter being used + * + * @return The VersionAdapter being used for the plugin + */ public VersionAdapter getVersionAdapter() { return this.versionAdapter; } @@ -151,6 +188,15 @@ public class UltimateTimber extends JavaPlugin { return treeDefinitionManager; } + /** + * Gets the tree detection manager + * + * @return The TreeDetectionManager instance + */ + public TreeDetectionManager getTreeDetectionManager() { + return treeDetectionManager; + } + /** * Gets the tree fall manager * diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java index 571cf45..34a7a81 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/VersionAdapter.java @@ -1,8 +1,10 @@ package com.songoda.ultimatetimber.adapter; +import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; import com.songoda.ultimatetimber.tree.TreeDefinition; -import jdk.nashorn.internal.ir.Block; +import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import java.util.Set; @@ -33,6 +35,30 @@ public interface VersionAdapter { * @param treeBlocks The Set of tree blocks that are being broken * @param tool The tool to apply damage to */ - void applyToolDurability(Set treeBlocks, ItemStack tool); + void applyToolDurability(TreeBlockSet treeBlocks, ItemStack tool); + + /** + * Plays particles to indicate a tree has started falling + */ + void playFallingParticles(TreeBlockSet treeBlocks); + + /** + * Plays particles to indicate a tree block has hit the ground + */ + void playLandingParticles(FallingTreeBlock treeBlock); + + /** + * Plays a sound to indicate a tree block has started falling + * + * @param treeBlocks The TreeBlocks to play the sound for + */ + void playFallingSound(TreeBlockSet treeBlocks); + + /** + * Plays a sound to indicate a tree block has hit the ground + * + * @param treeBlock The FallingTreeBlock to play the sound for + */ + void playLandingSound(FallingTreeBlock treeBlock); } diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java index f516396..585872f 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/current/CurrentAdapter.java @@ -2,8 +2,11 @@ package com.songoda.ultimatetimber.adapter.current; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.adapter.VersionAdapterType; +import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; import com.songoda.ultimatetimber.tree.TreeDefinition; +import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import java.util.Set; @@ -26,7 +29,27 @@ public class CurrentAdapter implements VersionAdapter { } @Override - public void applyToolDurability(Set blocks, ItemStack tool) { + public void applyToolDurability(TreeBlockSet treeBlocks, ItemStack tool) { + + } + + @Override + public void playFallingParticles(TreeBlockSet treeBlocks) { + + } + + @Override + public void playLandingParticles(FallingTreeBlock treeBlock) { + + } + + @Override + public void playFallingSound(TreeBlockSet treeBlocks) { + + } + + @Override + public void playLandingSound(FallingTreeBlock treeBlock) { } diff --git a/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java index 0574c4b..763364d 100644 --- a/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java +++ b/src/main/java/com/songoda/ultimatetimber/adapter/legacy/LegacyAdapter.java @@ -2,8 +2,11 @@ package com.songoda.ultimatetimber.adapter.legacy; import com.songoda.ultimatetimber.adapter.VersionAdapter; import com.songoda.ultimatetimber.adapter.VersionAdapterType; +import com.songoda.ultimatetimber.tree.FallingTreeBlock; import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; import com.songoda.ultimatetimber.tree.TreeDefinition; +import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; import java.util.Set; @@ -26,7 +29,27 @@ public class LegacyAdapter implements VersionAdapter { } @Override - public void applyToolDurability(Set blocks, ItemStack tool) { + public void applyToolDurability(TreeBlockSet treeBlocks, ItemStack tool) { + + } + + @Override + public void playFallingParticles(TreeBlockSet treeBlocks) { + + } + + @Override + public void playLandingParticles(FallingTreeBlock treeBlock) { + + } + + @Override + public void playFallingSound(TreeBlockSet treeBlocks) { + + } + + @Override + public void playLandingSound(FallingTreeBlock treeBlock) { } diff --git a/src/main/java/com/songoda/ultimatetimber/commands/ReloadCommand.java b/src/main/java/com/songoda/ultimatetimber/commands/ReloadCommand.java index 3b941c9..4d341bb 100644 --- a/src/main/java/com/songoda/ultimatetimber/commands/ReloadCommand.java +++ b/src/main/java/com/songoda/ultimatetimber/commands/ReloadCommand.java @@ -3,7 +3,7 @@ package com.songoda.ultimatetimber.commands; import org.bukkit.command.CommandSender; import com.songoda.ultimatetimber.UltimateTimber; -import com.songoda.ultimatetimber.treefall.CustomLoot; +import com.songoda.ultimatetimber.old_code.CustomLoot; import com.songoda.ultimatetimber.utils.Methods; class ReloadCommand { diff --git a/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java b/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java index f6a2065..cd9757f 100644 --- a/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java +++ b/src/main/java/com/songoda/ultimatetimber/events/TreeEvent.java @@ -4,7 +4,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerEvent; -import com.songoda.ultimatetimber.treefall.TreeChecker; +import com.songoda.ultimatetimber.old_code.TreeChecker; /** * Abstract tree event containing tree's blocks and broke block diff --git a/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java b/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java index a739115..0c1550c 100644 --- a/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java +++ b/src/main/java/com/songoda/ultimatetimber/events/TreeFallEvent.java @@ -5,7 +5,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.HandlerList; -import com.songoda.ultimatetimber.treefall.TreeChecker; +import com.songoda.ultimatetimber.old_code.TreeChecker; /** * Called when a tree will fall diff --git a/src/main/java/com/songoda/ultimatetimber/events/TreeFellEvent.java b/src/main/java/com/songoda/ultimatetimber/events/TreeFellEvent.java index 868f595..21ba1e1 100644 --- a/src/main/java/com/songoda/ultimatetimber/events/TreeFellEvent.java +++ b/src/main/java/com/songoda/ultimatetimber/events/TreeFellEvent.java @@ -4,7 +4,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import com.songoda.ultimatetimber.treefall.TreeChecker; +import com.songoda.ultimatetimber.old_code.TreeChecker; /** * Called when a tree fell diff --git a/src/main/java/com/songoda/ultimatetimber/hooks/JobsHook.java b/src/main/java/com/songoda/ultimatetimber/hooks/JobsHook.java index f034dd0..9f42658 100644 --- a/src/main/java/com/songoda/ultimatetimber/hooks/JobsHook.java +++ b/src/main/java/com/songoda/ultimatetimber/hooks/JobsHook.java @@ -1,23 +1,19 @@ package com.songoda.ultimatetimber.hooks; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; - -import org.bukkit.GameMode; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; - import com.gamingmesh.jobs.Jobs; import com.gamingmesh.jobs.actions.BlockActionInfo; import com.gamingmesh.jobs.container.ActionType; import com.gamingmesh.jobs.container.JobsPlayer; -import com.songoda.ultimatetimber.utils.WoodToLogConverter; +import com.songoda.ultimatetimber.tree.ITreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import org.bukkit.GameMode; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; public class JobsHook implements TimberHook { @Override - public void apply(Player player, HashSet treeBlocks) throws Exception { + public void apply(Player player, TreeBlockSet treeBlocks) throws Exception { if (player.getGameMode().equals(GameMode.CREATIVE)) return; @@ -26,10 +22,10 @@ public class JobsHook implements TimberHook { if (jPlayer == null) return; - Set logs = treeBlocks.stream().filter(x -> WoodToLogConverter.convert(x.getType()).name().endsWith("LOG")).collect(Collectors.toSet()); - for (Block log : logs) { - BlockActionInfo bInfo = new BlockActionInfo(log, ActionType.BREAK); - Jobs.action(jPlayer, bInfo, log); + for (ITreeBlock treeBlock : treeBlocks.getLogBlocks()) { + Block block = treeBlock.getBlock(); + BlockActionInfo bInfo = new BlockActionInfo(block, ActionType.BREAK); + Jobs.action(jPlayer, bInfo, block); } } diff --git a/src/main/java/com/songoda/ultimatetimber/hooks/McMMOHook.java b/src/main/java/com/songoda/ultimatetimber/hooks/McMMOHook.java index 29b9059..a65a976 100644 --- a/src/main/java/com/songoda/ultimatetimber/hooks/McMMOHook.java +++ b/src/main/java/com/songoda/ultimatetimber/hooks/McMMOHook.java @@ -1,16 +1,15 @@ package com.songoda.ultimatetimber.hooks; -import java.lang.reflect.Method; -import java.util.Set; - -import com.songoda.ultimatetimber.tree.TreeBlock; +import com.gmail.nossr50.api.ExperienceAPI; +import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.songoda.ultimatetimber.tree.ITreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Player; -import com.gmail.nossr50.api.ExperienceAPI; -import com.gmail.nossr50.config.experience.ExperienceConfig; +import java.lang.reflect.Method; public class McMMOHook implements TimberHook { @@ -42,13 +41,14 @@ public class McMMOHook implements TimberHook { } @Override - public void apply(Player player, Set treeBlocks) throws Exception { + public void apply(Player player, TreeBlockSet treeBlocks) throws Exception { if (player.getGameMode().equals(GameMode.CREATIVE)) return; int xp = 0; - for (Block block : treeBlocks) { - Material material = WoodToLogConverter.convert(block.getType()); + for (ITreeBlock treeBlock : treeBlocks.getLogBlocks()) { + Block block = treeBlock.getBlock(); + Material material = block.getType(); if (!material.name().endsWith("LOG")) continue; xp += (int) getXpMethod.invoke(ExperienceConfig.getInstance(), woodcuttingEnum, material); } diff --git a/src/main/java/com/songoda/ultimatetimber/hooks/TimberHook.java b/src/main/java/com/songoda/ultimatetimber/hooks/TimberHook.java index 61d6b27..5d02b2b 100644 --- a/src/main/java/com/songoda/ultimatetimber/hooks/TimberHook.java +++ b/src/main/java/com/songoda/ultimatetimber/hooks/TimberHook.java @@ -1,6 +1,8 @@ package com.songoda.ultimatetimber.hooks; import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import org.bukkit.block.Block; import org.bukkit.entity.Player; import java.util.Set; @@ -10,6 +12,6 @@ public interface TimberHook { /** * Applies the hook */ - void apply(Player player, Set treeBlocks) throws Exception; + void apply(Player player, TreeBlockSet treeBlocks) throws Exception; } diff --git a/src/main/java/com/songoda/ultimatetimber/manager/HookManager.java b/src/main/java/com/songoda/ultimatetimber/manager/HookManager.java index 21dd0b8..cc3d756 100644 --- a/src/main/java/com/songoda/ultimatetimber/manager/HookManager.java +++ b/src/main/java/com/songoda/ultimatetimber/manager/HookManager.java @@ -7,6 +7,7 @@ import com.songoda.ultimatetimber.UltimateTimber; import com.songoda.ultimatetimber.hooks.JobsHook; import com.songoda.ultimatetimber.hooks.McMMOHook; import com.songoda.ultimatetimber.hooks.TimberHook; +import com.songoda.ultimatetimber.tree.TreeBlockSet; import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -21,20 +22,15 @@ public class HookManager extends Manager { @Override public void reload() { + this.hooks.clear(); + this.tryHook("mcMMO", McMMOHook.class); + this.tryHook("Jobs", JobsHook.class); } @Override public void disable() { - - } - - /** - * Hooks into compatible plugins - */ - public void hook() { - this.tryHook("mcMMO", McMMOHook.class); - this.tryHook("Jobs", JobsHook.class); + this.hooks.clear(); } /** @@ -61,7 +57,7 @@ public class HookManager extends Manager { * @param player The player to apply the hook for * @param treeBlocks The blocks of the tree that were broken */ - public void applyHooks(Player player, HashSet treeBlocks) { + public void applyHooks(Player player, TreeBlockSet treeBlocks) { Set invalidHooks = new HashSet<>(); for (TimberHook hook : this.hooks) { try { diff --git a/src/main/java/com/songoda/ultimatetimber/manager/Manager.java b/src/main/java/com/songoda/ultimatetimber/manager/Manager.java index 40123f5..98a93f1 100644 --- a/src/main/java/com/songoda/ultimatetimber/manager/Manager.java +++ b/src/main/java/com/songoda/ultimatetimber/manager/Manager.java @@ -2,7 +2,7 @@ package com.songoda.ultimatetimber.manager; import com.songoda.ultimatetimber.UltimateTimber; -abstract class Manager { +public abstract class Manager { protected UltimateTimber ultimateTimber; @@ -13,11 +13,11 @@ abstract class Manager { /** * Reloads the Manager's settings */ - abstract void reload(); + public abstract void reload(); /** * Cleans up the Manager's resources */ - abstract void disable(); + public abstract void disable(); } diff --git a/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java b/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java new file mode 100644 index 0000000..867f1d1 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/manager/TreeDetectionManager.java @@ -0,0 +1,23 @@ +package com.songoda.ultimatetimber.manager; + +import com.songoda.ultimatetimber.UltimateTimber; + +public class TreeDetectionManager extends Manager { + + private UltimateTimber ultimateTimber; + + public TreeDetectionManager(UltimateTimber ultimateTimber) { + super(ultimateTimber); + } + + @Override + public void reload() { + + } + + @Override + public void disable() { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/AxeDurability.java b/src/main/java/com/songoda/ultimatetimber/old_code/AxeDurability.java similarity index 96% rename from src/main/java/com/songoda/ultimatetimber/treefall/AxeDurability.java rename to src/main/java/com/songoda/ultimatetimber/old_code/AxeDurability.java index 1eadcef..1d81a55 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/AxeDurability.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/AxeDurability.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.HashSet; import java.util.Random; @@ -49,7 +49,7 @@ public class AxeDurability { item.setItemMeta((ItemMeta) damageableMeta); - if (item.getDurability() >= item.getType().getMaxDurability()) + if (damageableMeta.getDamage() >= item.getType().getMaxDurability()) player.getInventory().setItemInMainHand(new ItemStack(Material.AIR)); } diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/CustomLoot.java b/src/main/java/com/songoda/ultimatetimber/old_code/CustomLoot.java similarity index 98% rename from src/main/java/com/songoda/ultimatetimber/treefall/CustomLoot.java rename to src/main/java/com/songoda/ultimatetimber/old_code/CustomLoot.java index 1da233b..f428936 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/CustomLoot.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/CustomLoot.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import com.songoda.ultimatetimber.UltimateTimber; import com.songoda.ultimatetimber.configurations.DefaultConfig; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/EventFilter.java b/src/main/java/com/songoda/ultimatetimber/old_code/EventFilter.java similarity index 97% rename from src/main/java/com/songoda/ultimatetimber/treefall/EventFilter.java rename to src/main/java/com/songoda/ultimatetimber/old_code/EventFilter.java index 51ea3a6..af521f8 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/EventFilter.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/EventFilter.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import com.songoda.ultimatetimber.UltimateTimber; import com.songoda.ultimatetimber.configurations.DefaultConfig; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/NoAnimationTreeDestroyer.java b/src/main/java/com/songoda/ultimatetimber/old_code/NoAnimationTreeDestroyer.java similarity index 92% rename from src/main/java/com/songoda/ultimatetimber/treefall/NoAnimationTreeDestroyer.java rename to src/main/java/com/songoda/ultimatetimber/old_code/NoAnimationTreeDestroyer.java index bebe492..86e83f8 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/NoAnimationTreeDestroyer.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/NoAnimationTreeDestroyer.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.HashSet; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeChecker.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java similarity index 99% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeChecker.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java index 5a09976..f86fd93 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeChecker.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeChecker.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.Arrays; import java.util.Comparator; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeEntityDamage.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeEntityDamage.java similarity index 89% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeEntityDamage.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeEntityDamage.java index cf91543..1cbd63d 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeEntityDamage.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeEntityDamage.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import org.bukkit.entity.Entity; import org.bukkit.entity.FallingBlock; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeFallAnimation.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeFallAnimation.java similarity index 99% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeFallAnimation.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeFallAnimation.java index 8b20db8..c9fbe6e 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeFallAnimation.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeFallAnimation.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeFallListener.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeFallListener.java similarity index 98% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeFallListener.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeFallListener.java index a3df057..cbd2ac1 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeFallListener.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeFallListener.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.HashSet; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeLoot.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeLoot.java similarity index 98% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeLoot.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeLoot.java index 0b25f24..372f109 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeLoot.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeLoot.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.Random; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeReplant.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeReplant.java similarity index 99% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeReplant.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeReplant.java index 5b4ea34..83817d1 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeReplant.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeReplant.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/songoda/ultimatetimber/treefall/TreeSounds.java b/src/main/java/com/songoda/ultimatetimber/old_code/TreeSounds.java similarity index 95% rename from src/main/java/com/songoda/ultimatetimber/treefall/TreeSounds.java rename to src/main/java/com/songoda/ultimatetimber/old_code/TreeSounds.java index 810ef40..b09331b 100644 --- a/src/main/java/com/songoda/ultimatetimber/treefall/TreeSounds.java +++ b/src/main/java/com/songoda/ultimatetimber/old_code/TreeSounds.java @@ -1,4 +1,4 @@ -package com.songoda.ultimatetimber.treefall; +package com.songoda.ultimatetimber.old_code; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/com/songoda/ultimatetimber/tree/FallingTreeBlock.java b/src/main/java/com/songoda/ultimatetimber/tree/FallingTreeBlock.java new file mode 100644 index 0000000..f023bf4 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/FallingTreeBlock.java @@ -0,0 +1,25 @@ +package com.songoda.ultimatetimber.tree; + +import org.bukkit.entity.FallingBlock; + +public class FallingTreeBlock implements ITreeBlock { + + private final FallingBlock fallingBlock; + private final TreeBlockType treeBlockType; + + public FallingTreeBlock(FallingBlock fallingBlock, TreeBlockType treeBlockType) { + this.fallingBlock = fallingBlock; + this.treeBlockType = treeBlockType; + } + + @Override + public FallingBlock getBlock() { + return this.fallingBlock; + } + + @Override + public TreeBlockType getTreeBlockType() { + return this.treeBlockType; + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/ITreeBlock.java b/src/main/java/com/songoda/ultimatetimber/tree/ITreeBlock.java new file mode 100644 index 0000000..be455d6 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/ITreeBlock.java @@ -0,0 +1,19 @@ +package com.songoda.ultimatetimber.tree; + +public interface ITreeBlock { + + /** + * Gets the block this TreeBlock represents + * + * @return The Block for this TreeBlock + */ + BlockType getBlock(); + + /** + * Gets what type of TreeBlock this is + * + * @return The TreeBlockType + */ + TreeBlockType getTreeBlockType(); + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeAnimationType.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeAnimationType.java deleted file mode 100644 index 934f0fe..0000000 --- a/src/main/java/com/songoda/ultimatetimber/tree/TreeAnimationType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.songoda.ultimatetimber.tree; - -public enum TreeAnimationType { - FANCY, - DISENTIGRATE, - CHAOS, - NONE -} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeBlock.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeBlock.java index fc4c7cd..e07237a 100644 --- a/src/main/java/com/songoda/ultimatetimber/tree/TreeBlock.java +++ b/src/main/java/com/songoda/ultimatetimber/tree/TreeBlock.java @@ -2,7 +2,7 @@ package com.songoda.ultimatetimber.tree; import org.bukkit.block.Block; -public class TreeBlock { +public class TreeBlock implements ITreeBlock { private final Block block; private final TreeBlockType treeBlockType; @@ -12,10 +12,12 @@ public class TreeBlock { this.treeBlockType = treeBlockType; } + @Override public Block getBlock() { return this.block; } + @Override public TreeBlockType getTreeBlockType() { return this.treeBlockType; } diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeBlockSet.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeBlockSet.java index a380041..567f39f 100644 --- a/src/main/java/com/songoda/ultimatetimber/tree/TreeBlockSet.java +++ b/src/main/java/com/songoda/ultimatetimber/tree/TreeBlockSet.java @@ -2,14 +2,27 @@ package com.songoda.ultimatetimber.tree; import java.util.*; -public class TreeBlockSet implements Collection { +public class TreeBlockSet implements Collection { - private Set logBlocks; - private Set leafBlocks; + private final ITreeBlock initialLogBlock; + private final Set> logBlocks; + private final Set> leafBlocks; - public TreeBlockSet() { + public TreeBlockSet(ITreeBlock initialLogBlock) { + this.initialLogBlock = initialLogBlock; this.logBlocks = new HashSet<>(); this.leafBlocks = new HashSet<>(); + + this.logBlocks.add(initialLogBlock); + } + + /** + * Gets the TreeBlock that initiated the tree topple + * + * @return The TreeBlock of the initial topple point + */ + public ITreeBlock getInitialLogBlock() { + return this.initialLogBlock; } /** @@ -17,7 +30,7 @@ public class TreeBlockSet implements Collection { * * @return A Set of TreeBlocks */ - public Set getLogBlocks() { + public Set> getLogBlocks() { return Collections.unmodifiableSet(this.logBlocks); } @@ -26,7 +39,7 @@ public class TreeBlockSet implements Collection { * * @return A Set of TreeBlocks */ - public Set getLeafBlocks() { + public Set> getLeafBlocks() { return Collections.unmodifiableSet(this.leafBlocks); } @@ -35,8 +48,8 @@ public class TreeBlockSet implements Collection { * * @return A Set of all TreeBlocks */ - public Set getAllTreeBlocks() { - Set treeBlocks = new HashSet<>(); + public Set> getAllTreeBlocks() { + Set> treeBlocks = new HashSet<>(); treeBlocks.addAll(this.logBlocks); treeBlocks.addAll(this.leafBlocks); return treeBlocks; @@ -69,8 +82,7 @@ public class TreeBlockSet implements Collection { @Override public boolean add(Object o) { - if (!(o instanceof TreeBlock)) return false; - TreeBlock treeBlock = (TreeBlock) o; + ITreeBlock treeBlock = (ITreeBlock) o; switch (treeBlock.getTreeBlockType()) { case LOG: return this.logBlocks.add(treeBlock); @@ -82,8 +94,7 @@ public class TreeBlockSet implements Collection { @Override public boolean remove(Object o) { - if (!(o instanceof TreeBlock)) return false; - TreeBlock treeBlock = (TreeBlock) o; + ITreeBlock treeBlock = (ITreeBlock) o; switch (treeBlock.getTreeBlockType()) { case LOG: return this.logBlocks.remove(treeBlock); @@ -146,10 +157,10 @@ public class TreeBlockSet implements Collection { @Override public Object[] toArray(Object[] a) { - Set treeBlocks = new HashSet<>(); + Set> treeBlocks = new HashSet<>(); for (Object o : a) - if (o instanceof TreeBlock) - treeBlocks.add((TreeBlock)o); + if (o instanceof ITreeBlock) + treeBlocks.add((ITreeBlock)o); return treeBlocks.toArray(); } diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java index 0f7d515..241ee78 100644 --- a/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java +++ b/src/main/java/com/songoda/ultimatetimber/tree/TreeDefinition.java @@ -1,9 +1,124 @@ package com.songoda.ultimatetimber.tree; +import org.bukkit.block.BlockState; +import org.bukkit.inventory.ItemStack; + +import java.util.Collections; +import java.util.Set; + public class TreeDefinition { - public TreeDefinition() { + private final String key; + private final Set logBlockStates, leafBlockStates; + private final BlockState saplingBlockState; + private final int maxLeafDistanceFromLog; + private final boolean dropOriginalLog, dropOriginalLeaf; + private final Set customLogLoot, customLeafLoot; + private final Set requiredTools; + public TreeDefinition(String key, Set logBlocks, Set leafBlocks, BlockState saplingBlockState, + int maxLeafDistanceFromLog, boolean dropOriginalLog, boolean dropOriginalLeaf, + Set customLogLoot, Set customLeafLoot, Set requiredTools) { + this.key = key; + this.logBlockStates = logBlocks; + this.leafBlockStates = leafBlocks; + this.saplingBlockState = saplingBlockState; + this.maxLeafDistanceFromLog = maxLeafDistanceFromLog; + this.dropOriginalLog = dropOriginalLog; + this.dropOriginalLeaf = dropOriginalLeaf; + this.customLogLoot = customLogLoot; + this.customLeafLoot = customLeafLoot; + this.requiredTools = requiredTools; + } + + /** + * Gets the key of this TreeDefinition in the config + * + * @return The key + */ + public String getKey() { + return this.key; + } + + /** + * Gets a set of valid log block states for this TreeDefinition + * + * @return A Set of BlockStates + */ + public Set getLogBlockStates() { + return Collections.unmodifiableSet(this.logBlockStates); + } + + /** + * Gets a set of valid leaf block states for this TreeDefinition + * + * @return A Set of BlockStates + */ + public Set getLeafBlockStates() { + return Collections.unmodifiableSet(this.leafBlockStates); + } + + /** + * Gets the sapling block state of this TreeDefinition + * + * @return A BlockState for the sapling + */ + public BlockState getSaplingBlockState() { + return this.saplingBlockState; + } + + /** + * Gets the max distance away a leaf can be from a log in order to be part of the tree + * + * @return The max distance a leaf can be from a log + */ + public int getMaxLeafDistanceFromLog() { + return this.maxLeafDistanceFromLog; + } + + /** + * Gets if the logs of this tree should drop their original block + * + * @return True if the original log block should be dropped, otherwise false + */ + public boolean shouldDropOriginalLog() { + return this.dropOriginalLog; + } + + /** + * Gets if the leaves of this tree should drop their original block + * + * @return True if the original leaf block should be dropped, otherwise false + */ + public boolean shouldDropOriginalLeaf() { + return this.dropOriginalLeaf; + } + + /** + * Gets the custom log loot for this TreeDefinition + * + * @return A Set of TreeLoot + */ + public Set getCustomLogLoot() { + return Collections.unmodifiableSet(this.customLogLoot); + } + + /** + * Gets the custom leaf loot for this TreeDefinition + * + * @return A Set of TreeLoot + */ + public Set getCustomLeafLoot() { + return Collections.unmodifiableSet(this.customLeafLoot); + } + + /** + * Gets the tools that can be used to activate this tree topple + * + * @return A Set of ItemStacks + */ + public Set getRequiredTools() { + return Collections.unmodifiableSet(this.requiredTools); } } diff --git a/src/main/java/com/songoda/ultimatetimber/tree/TreeLoot.java b/src/main/java/com/songoda/ultimatetimber/tree/TreeLoot.java new file mode 100644 index 0000000..50c28d3 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/TreeLoot.java @@ -0,0 +1,23 @@ +package com.songoda.ultimatetimber.tree; + +import org.bukkit.inventory.ItemStack; + +public class TreeLoot { + + private final TreeBlockType treeBlockType; + private final ItemStack item; + private final String command; + private final double chance; + + public TreeLoot(TreeBlockType treeBlockType, ItemStack item, String command, double chance) { + this.treeBlockType = treeBlockType; + this.item = item; + this.command = command; + this.chance = chance; + } + + public void tryDropLoot(ITreeBlock treeBlock) { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimation.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimation.java new file mode 100644 index 0000000..ccbb836 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimation.java @@ -0,0 +1,21 @@ +package com.songoda.ultimatetimber.tree.animation; + +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import com.songoda.ultimatetimber.tree.TreeDefinition; +import org.bukkit.block.Block; + +public abstract class TreeAnimation { + + protected final TreeAnimationType treeAnimationType; + protected final TreeBlockSet treeBlocks; + protected final TreeDefinition treeDefinition; + + TreeAnimation(TreeAnimationType treeAnimationType, TreeBlockSet treeBlocks, TreeDefinition treeDefinition) { + this.treeAnimationType = treeAnimationType; + this.treeBlocks = treeBlocks; + this.treeDefinition = treeDefinition; + } + + abstract void playAnimation(); + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationChaos.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationChaos.java new file mode 100644 index 0000000..4e7a669 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationChaos.java @@ -0,0 +1,18 @@ +package com.songoda.ultimatetimber.tree.animation; + +import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import com.songoda.ultimatetimber.tree.TreeDefinition; + +public class TreeAnimationChaos extends TreeAnimation { + + public TreeAnimationChaos(TreeBlockSet treeBlocks, TreeDefinition treeDefinition) { + super(TreeAnimationType.CHAOS, treeBlocks, treeDefinition); + } + + @Override + public void playAnimation() { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationDisintegrate.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationDisintegrate.java new file mode 100644 index 0000000..cd93129 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationDisintegrate.java @@ -0,0 +1,18 @@ +package com.songoda.ultimatetimber.tree.animation; + +import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import com.songoda.ultimatetimber.tree.TreeDefinition; + +public class TreeAnimationDisintegrate extends TreeAnimation { + + public TreeAnimationDisintegrate(TreeBlockSet treeBlocks, TreeDefinition treeDefinition) { + super(TreeAnimationType.DISINTIGRATE, treeBlocks, treeDefinition); + } + + @Override + public void playAnimation() { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationFancy.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationFancy.java new file mode 100644 index 0000000..f2451f7 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationFancy.java @@ -0,0 +1,18 @@ +package com.songoda.ultimatetimber.tree.animation; + +import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import com.songoda.ultimatetimber.tree.TreeDefinition; + +public class TreeAnimationFancy extends TreeAnimation { + + public TreeAnimationFancy(TreeBlockSet treeBlocks, TreeDefinition treeDefinition) { + super(TreeAnimationType.FANCY, treeBlocks, treeDefinition); + } + + @Override + public void playAnimation() { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationNone.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationNone.java new file mode 100644 index 0000000..89331ba --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationNone.java @@ -0,0 +1,18 @@ +package com.songoda.ultimatetimber.tree.animation; + +import com.songoda.ultimatetimber.tree.TreeBlock; +import com.songoda.ultimatetimber.tree.TreeBlockSet; +import com.songoda.ultimatetimber.tree.TreeDefinition; + +public class TreeAnimationNone extends TreeAnimation { + + public TreeAnimationNone(TreeBlockSet treeBlocks, TreeDefinition treeDefinition) { + super(TreeAnimationType.NONE, treeBlocks, treeDefinition); + } + + @Override + public void playAnimation() { + + } + +} diff --git a/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationType.java b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationType.java new file mode 100644 index 0000000..8b8eb76 --- /dev/null +++ b/src/main/java/com/songoda/ultimatetimber/tree/animation/TreeAnimationType.java @@ -0,0 +1,11 @@ +package com.songoda.ultimatetimber.tree.animation; + +/** + * The types of tree animations that are available + */ +public enum TreeAnimationType { + FANCY, + DISINTIGRATE, + CHAOS, + NONE +} diff --git a/src/main/resources/config-current.yml b/src/main/resources/config-current.yml index eec9867..16b61b5 100644 --- a/src/main/resources/config-current.yml +++ b/src/main/resources/config-current.yml @@ -11,7 +11,7 @@ server-type: CURRENT # A list of worlds that the plugin is disabled in # Default: -# - 'disabled_world_name' +# - disabled_world_name disabled-worlds: - disabled_world_name @@ -51,6 +51,10 @@ allow-creative-mode: true # Default: true require-chop-permission: true +# Allow players to topple trees regardless of what they are holding in their hand +# Default: false +ignore-required-tools: false + # Automatically replant saplings when a tree is toppled # Default: true replant-saplings: true @@ -98,6 +102,7 @@ scatter-tree-blocks-on-ground: false # Mix all the tree types below and consider all of them as a single tree type # Useful for EpicWorldGenerator and similar plugins that make custom trees +# Warning: Custom loot can get messy with this enabled # Default: false mix-all-tree-types: false @@ -266,7 +271,7 @@ global-custom-log-loot: chance: 0 2: material: GOLDEN_APPLE - command: 'broadcast %player% found a golden apple in a tree!' + command: 'broadcast %player% found a golden apple in a %type% tree!' chance: 0 # Custom loot that is available for all tree types diff --git a/src/main/resources/config-legacy.yml b/src/main/resources/config-legacy.yml index 535d4f0..7d20ff9 100644 --- a/src/main/resources/config-legacy.yml +++ b/src/main/resources/config-legacy.yml @@ -12,7 +12,7 @@ server-type: LEGACY # A list of worlds that the plugin is disabled in # Default: -# - 'disabled_world_name' +# - disabled_world_name disabled-worlds: - disabled_world_name @@ -52,6 +52,10 @@ allow-creative-mode: true # Default: true require-chop-permission: true +# Allow players to topple trees regardless of what they are holding in their hand +# Default: false +ignore-required-tools: false + # Automatically replant saplings when a tree is toppled # Default: true replant-saplings: true @@ -92,13 +96,13 @@ use-custom-sounds: true # Types: FANCY, DISINTEGRATE, CHAOS, NONE tree-animation-type: FANCY -# If the tree-animation-type is FANCY, make the blocks stick to the ground -# Does nothing if tree-animation-type is not FANCY +# If the tree-animation-type uses falling block entities, make the falling blocks stick to the ground # Default: false scatter-tree-blocks-on-ground: false # Mix all the tree types below and consider all of them as a single tree type # Useful for EpicWorldGenerator and similar plugins that make custom trees +# Warning: Custom loot can get messy with this enabled # Default: false mix-all-tree-types: false @@ -303,11 +307,11 @@ global-custom-log-loot: material: DIAMOND chance: 0 1: - command: 'eco give %player% 5' + command: 'eco give %player 5' chance: 0 2: material: GOLDEN_APPLE - command: 'broadcast %player% found a golden apple in a tree!' + command: 'broadcast %player% found a golden apple in a %type tree!' chance: 0 # Custom loot that is available for all tree types