Hook system rewrite

This commit is contained in:
Esophose 2019-04-27 20:04:45 -06:00
parent a52ba616fe
commit 5ce176841e
28 changed files with 460 additions and 252 deletions

View File

@ -1,10 +1,6 @@
/*
* This file was generated by the Gradle 'init' task.
*/
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.13.2'
compileOnly 'org.spigotmc:spigot:1.14'
compileOnly 'com.gmail.nossr50:mcmmo:1.5.09'
compileOnly 'com.gamingmesh:jobs:4.6.0'
compileOnly 'com.gamingmesh:jobs:4.10.3'
}

View File

@ -1,59 +0,0 @@
package com.songoda.ultimatetimber.adapter.current.hooks;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.songoda.ultimatetimber.hook.TimberHook;
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 java.lang.reflect.Method;
public class CurrentMcMMOHook implements TimberHook {
private Enum<?> woodcuttingEnum;
private Method getXpMethod;
public CurrentMcMMOHook() throws NoSuchMethodException, SecurityException, ClassNotFoundException {
try { // Try to find mcMMO Overhaul
Class<?> primarySkillTypeClass = Class.forName("com.gmail.nossr50.datatypes.skills.PrimarySkillType");
for (Object enumValue : primarySkillTypeClass.getEnumConstants()) {
Enum<?> primarySkillTypeEnum = (Enum<?>) enumValue;
if (primarySkillTypeEnum.name().equals("WOODCUTTING")) {
this.woodcuttingEnum = primarySkillTypeEnum;
break;
}
}
this.getXpMethod = ExperienceConfig.class.getMethod("getXp", this.woodcuttingEnum.getClass(), Material.class);
} catch (Exception ex) {
Class<?> skillTypeClass = Class.forName("com.gmail.nossr50.datatypes.skills.SkillType");
for (Object enumValue : skillTypeClass.getEnumConstants()) {
Enum<?> skillTypeEnum = (Enum<?>) enumValue;
if (skillTypeEnum.name().equals("WOODCUTTING")) {
this.woodcuttingEnum = skillTypeEnum;
break;
}
}
this.getXpMethod = ExperienceConfig.class.getMethod("getXp", this.woodcuttingEnum.getClass(), Material.class);
}
}
@Override
public void apply(Player player, TreeBlockSet<Block> treeBlocks) throws Exception {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
Material material = block.getType();
xp += (int) this.getXpMethod.invoke(ExperienceConfig.getInstance(), this.woodcuttingEnum, material);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
}

View File

@ -1,10 +1,6 @@
/*
* This file was generated by the Gradle 'init' task.
*/
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.12.2'
compileOnly 'com.gmail.nossr50:mcmmo:1.5.09'
compileOnly 'com.gamingmesh:jobs:4.6.0'
compileOnly 'com.gamingmesh:jobs:4.10.3'
}

View File

@ -1,33 +0,0 @@
package com.songoda.ultimatetimber.adapter.legacy.hooks;
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.hook.TimberHook;
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 LegacyJobsHook implements TimberHook {
@Override
public void apply(Player player, TreeBlockSet<Block> treeBlocks) throws Exception {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
// Replicate the same code that Jobs Reborn uses
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
if (jPlayer == null)
return;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
BlockActionInfo bInfo = new BlockActionInfo(block, ActionType.BREAK);
Jobs.action(jPlayer, bInfo, block);
}
}
}

View File

@ -1,60 +0,0 @@
package com.songoda.ultimatetimber.adapter.legacy.hooks;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.songoda.ultimatetimber.hook.TimberHook;
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 java.lang.reflect.Method;
public class LegacyMcMMOHook implements TimberHook {
private Enum<?> woodcuttingEnum;
private Method getXpMethod;
public LegacyMcMMOHook() throws NoSuchMethodException, SecurityException, ClassNotFoundException {
try { // Try to find mcMMO Overhaul
Class<?> primarySkillTypeClass = Class.forName("com.gmail.nossr50.datatypes.skills.PrimarySkillType");
for (Object enumValue : primarySkillTypeClass.getEnumConstants()) {
Enum<?> primarySkillTypeEnum = (Enum<?>) enumValue;
if (primarySkillTypeEnum.name().equals("WOODCUTTING")) {
this.woodcuttingEnum = primarySkillTypeEnum;
break;
}
}
this.getXpMethod = ExperienceConfig.class.getMethod("getXp", this.woodcuttingEnum.getClass(), Material.class);
} catch (Exception ex) {
Class<?> skillTypeClass = Class.forName("com.gmail.nossr50.datatypes.skills.SkillType");
for (Object enumValue : skillTypeClass.getEnumConstants()) {
Enum<?> skillTypeEnum = (Enum<?>) enumValue;
if (skillTypeEnum.name().equals("WOODCUTTING")) {
this.woodcuttingEnum = skillTypeEnum;
break;
}
}
this.getXpMethod = ExperienceConfig.class.getMethod("getXp", this.woodcuttingEnum.getClass(), Material.class);
}
}
@Override
public void apply(Player player, TreeBlockSet<Block> treeBlocks) throws Exception {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
Material material = block.getType();
if (!material.name().endsWith("LOG")) continue;
xp += (int) this.getXpMethod.invoke(ExperienceConfig.getInstance(), this.woodcuttingEnum, material);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
}

View File

@ -0,0 +1,5 @@
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.14'
compileOnly 'com.gamingmesh:jobs:4.10.3'
}

View File

@ -1,24 +1,22 @@
package com.songoda.ultimatetimber.adapter.current.hooks;
package com.songoda.ultimatetimber.hook;
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.hook.TimberHook;
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 CurrentJobsHook implements TimberHook {
public class JobsHook implements TimberHook {
@Override
public void apply(Player player, TreeBlockSet<Block> treeBlocks) {
public void applyExperience(Player player, TreeBlockSet<Block> treeBlocks) {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
// Replicate the same code that Jobs Reborn uses
JobsPlayer jPlayer = Jobs.getPlayerManager().getJobsPlayer(player);
if (jPlayer == null)
return;
@ -30,4 +28,14 @@ public class CurrentJobsHook implements TimberHook {
}
}
@Override
public boolean shouldApplyDoubleDrops(Player player) {
return false;
}
@Override
public boolean isUsingAbility(Player player) {
return true;
}
}

View File

@ -0,0 +1,5 @@
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.14'
compileOnly 'com.gmail.nossr50:mcmmo:2.1.50'
}

View File

@ -0,0 +1,57 @@
package com.songoda.ultimatetimber.hook;
import com.gmail.nossr50.api.AbilityAPI;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import com.gmail.nossr50.util.skills.PerksUtils;
import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillActivationType;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.songoda.ultimatetimber.tree.ITreeBlock;
import com.songoda.ultimatetimber.tree.TreeBlockSet;
import org.bukkit.GameMode;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
public class McMMOHook implements TimberHook {
@Override
public void applyExperience(Player player, TreeBlockSet<Block> treeBlocks) {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
BlockData blockData = block.getBlockData();
xp += ExperienceConfig.getInstance().getXp(PrimarySkillType.WOODCUTTING, blockData);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
@Override
public boolean shouldApplyDoubleDrops(Player player) {
if (PrimarySkillType.WOODCUTTING.getDoubleDropsDisabled())
return false;
return Permissions.isSubSkillEnabled(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER)
&& RankUtils.hasReachedRank(1, player, SubSkillType.WOODCUTTING_HARVEST_LUMBER)
&& RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.WOODCUTTING_HARVEST_LUMBER, player);
}
@Override
public boolean isUsingAbility(Player player) {
return AbilityAPI.treeFellerEnabled(player);
}
}

View File

@ -0,0 +1,5 @@
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.12.2'
compileOnly 'com.gmail.nossr50:mcmmo:1.5.10'
}

View File

@ -0,0 +1,52 @@
package com.songoda.ultimatetimber.hook;
import com.gmail.nossr50.api.AbilityAPI;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.PerksUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
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;
import org.bukkit.material.MaterialData;
public class McMMOClassic12Hook implements TimberHook {
@Override
public void applyExperience(Player player, TreeBlockSet<Block> treeBlocks) {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
MaterialData materialData = block.getState().getData();
xp += ExperienceConfig.getInstance().getXp(SkillType.WOODCUTTING, materialData);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
@Override
public boolean shouldApplyDoubleDrops(Player player) {
if (SkillType.WOODCUTTING.getDoubleDropsDisabled())
return false;
int skillLevel = UserManager.getPlayer(player).getSkillLevel(SkillType.WOODCUTTING);
int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.WOODCUTTING);
return Permissions.secondaryAbilityEnabled(player, SecondaryAbility.WOODCUTTING_DOUBLE_DROPS)
&& SkillUtils.activationSuccessful(SecondaryAbility.WOODCUTTING_DOUBLE_DROPS, player, skillLevel, activationChance);
}
@Override
public boolean isUsingAbility(Player player) {
return AbilityAPI.treeFellerEnabled(player);
}
}

View File

@ -0,0 +1,5 @@
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.14'
compileOnly 'com.gmail.nossr50:mcmmo:1.6.0'
}

View File

@ -0,0 +1,53 @@
package com.songoda.ultimatetimber.hook;
import com.gmail.nossr50.api.AbilityAPI;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.PerksUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import com.songoda.ultimatetimber.tree.ITreeBlock;
import com.songoda.ultimatetimber.tree.TreeBlockSet;
import org.bukkit.GameMode;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
public class McMMOClassic13Hook implements TimberHook {
@Override
public void applyExperience(Player player, TreeBlockSet<Block> treeBlocks) {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
BlockData blockData = block.getBlockData();
xp += ExperienceConfig.getInstance().getXp(SkillType.WOODCUTTING, blockData);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
@Override
public boolean shouldApplyDoubleDrops(Player player) {
if (SkillType.WOODCUTTING.getDoubleDropsDisabled())
return false;
int skillLevel = UserManager.getPlayer(player).getSkillLevel(SkillType.WOODCUTTING);
int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.WOODCUTTING);
return Permissions.secondaryAbilityEnabled(player, SecondaryAbility.WOODCUTTING_DOUBLE_DROPS)
&& SkillUtils.activationSuccessful(SecondaryAbility.WOODCUTTING_DOUBLE_DROPS, player, skillLevel, activationChance);
}
@Override
public boolean isUsingAbility(Player player) {
return AbilityAPI.treeFellerEnabled(player);
}
}

View File

@ -0,0 +1,5 @@
dependencies {
compile project(':UltimateTimber-Core')
compileOnly 'org.spigotmc:spigot:1.8.8'
compileOnly 'com.gmail.nossr50:mcmmo:1.5.04'
}

View File

@ -0,0 +1,52 @@
package com.songoda.ultimatetimber.hook;
import com.gmail.nossr50.api.AbilityAPI;
import com.gmail.nossr50.api.ExperienceAPI;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.PerksUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
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;
public class McMMOClassic8Hook implements TimberHook {
@Override
public void applyExperience(Player player, TreeBlockSet<Block> treeBlocks) {
if (player.getGameMode().equals(GameMode.CREATIVE))
return;
int xp = 0;
for (ITreeBlock<Block> treeBlock : treeBlocks.getLogBlocks()) {
Block block = treeBlock.getBlock();
Material material = block.getType();
xp += ExperienceConfig.getInstance().getXp(SkillType.WOODCUTTING, material);
}
ExperienceAPI.addXP(player, "woodcutting", xp, "pve");
}
@Override
public boolean shouldApplyDoubleDrops(Player player) {
if (SkillType.WOODCUTTING.getDoubleDropsDisabled())
return false;
int skillLevel = UserManager.getPlayer(player).getSkillLevel(SkillType.WOODCUTTING);
int activationChance = PerksUtils.handleLuckyPerks(player, SkillType.WOODCUTTING);
return Permissions.secondaryAbilityEnabled(player, SecondaryAbility.WOODCUTTING_DOUBLE_DROPS)
&& SkillUtils.activationSuccessful(SecondaryAbility.WOODCUTTING_DOUBLE_DROPS, player, skillLevel, activationChance);
}
@Override
public boolean isUsingAbility(Player player) {
return AbilityAPI.treeFellerEnabled(player);
}
}

View File

@ -1,7 +1,3 @@
/*
* This file was generated by the Gradle 'init' task.
*/
dependencies {
compileOnly 'org.spigotmc:spigot:1.13.2'
compileOnly 'org.spigotmc:spigot:1.14'
}

View File

@ -5,10 +5,29 @@ import org.bukkit.block.Block;
import org.bukkit.entity.Player;
public interface TimberHook {
/**
* Applies the hook
* Applies experience to a player for a fallen tree
*
* @param player The player
* @param treeBlocks The tree blocks that were broken
*/
void apply(Player player, TreeBlockSet<Block> treeBlocks) throws Exception;
void applyExperience(Player player, TreeBlockSet<Block> treeBlocks);
/**
* Checks if double drops should be applied
*
* @param player The player
* @return True if double drops should be applied, otherwise false
*/
boolean shouldApplyDoubleDrops(Player player);
/**
* Checks if a player is using an ability
*
* @param player The player
* @return True if an ability is being used, otherwise false
*/
boolean isUsingAbility(Player player);
}

View File

@ -4,10 +4,14 @@ dependencies {
compile project(':UltimateTimber-Core')
compile project(':UltimateTimber-CurrentAdapter')
compile project(':UltimateTimber-LegacyAdapter')
compileOnly 'org.spigotmc:spigot:1.13.2'
compile project(':UltimateTimber-Jobs')
compile project(':UltimateTimber-McMMO')
compile project(':UltimateTimber-McMMOClassic13')
compile project(':UltimateTimber-McMMOClassic12')
compile project(':UltimateTimber-McMMOClassic8')
compileOnly 'org.spigotmc:spigot:1.14'
}
processResources {
from (sourceSets.main.resources.srcDirs) {
include '**/*.yml'

View File

@ -7,5 +7,18 @@ public enum TreeAnimationType {
FANCY,
DISINTIGRATE,
CRUMBLE,
NONE
NONE;
/**
* Gets a TreeAnimationType from a given string
*
* @param string The string
* @return The TreeAnimationType, returns FANCY if the string is an invalid type
*/
public static TreeAnimationType fromString(String string) {
for (TreeAnimationType value : values())
if (value.name().equalsIgnoreCase(string))
return value;
return TreeAnimationType.FANCY;
}
}

View File

@ -36,6 +36,9 @@ public class ConfigurationManager extends Manager {
USE_CUSTOM_SOUNDS(SettingType.BOOLEAN),
USE_CUSTOM_PARTICLES(SettingType.BOOLEAN),
BONUS_LOOT_MULTIPLIER(SettingType.DOUBLE),
HOOKS_APPLY_EXPERIENCE(SettingType.BOOLEAN),
HOOKS_APPLY_EXTRA_DROPS(SettingType.BOOLEAN),
HOOKS_REQUIRE_ABILITY_ACTIVE(SettingType.BOOLEAN),
TREE_ANIMATION_TYPE(SettingType.STRING),
SCATTER_TREE_BLOCKS_ON_GROUND(SettingType.BOOLEAN),
MIX_ALL_TREE_TYPES(SettingType.BOOLEAN);

View File

@ -2,15 +2,18 @@ package com.songoda.ultimatetimber.manager;
import com.songoda.ultimatetimber.UltimateTimber;
import com.songoda.ultimatetimber.adapter.VersionAdapterType;
import com.songoda.ultimatetimber.adapter.current.hooks.CurrentJobsHook;
import com.songoda.ultimatetimber.adapter.current.hooks.CurrentMcMMOHook;
import com.songoda.ultimatetimber.adapter.legacy.hooks.LegacyJobsHook;
import com.songoda.ultimatetimber.adapter.legacy.hooks.LegacyMcMMOHook;
import com.songoda.ultimatetimber.hook.JobsHook;
import com.songoda.ultimatetimber.hook.McMMOClassic12Hook;
import com.songoda.ultimatetimber.hook.McMMOClassic13Hook;
import com.songoda.ultimatetimber.hook.McMMOClassic8Hook;
import com.songoda.ultimatetimber.hook.McMMOHook;
import com.songoda.ultimatetimber.utils.NMSUtil;
import com.songoda.ultimatetimber.hook.TimberHook;
import com.songoda.ultimatetimber.tree.TreeBlockSet;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.HashSet;
import java.util.Set;
@ -28,12 +31,24 @@ public class HookManager extends Manager {
public void reload() {
this.hooks.clear();
this.tryHook("Jobs", JobsHook.class);
if (this.ultimateTimber.getVersionAdapter().getVersionAdapterType().equals(VersionAdapterType.CURRENT)) {
this.tryHook("mcMMO", CurrentMcMMOHook.class);
this.tryHook("Jobs", CurrentJobsHook.class);
Plugin mcMMO = Bukkit.getPluginManager().getPlugin("mcMMO");
if (mcMMO != null) {
String version = mcMMO.getDescription().getVersion();
if (version.startsWith("2")) {
this.tryHook("mcMMO", McMMOHook.class);
} else {
this.tryHook("mcMMO", McMMOClassic13Hook.class);
}
}
} else {
this.tryHook("mcMMO", LegacyMcMMOHook.class);
this.tryHook("Jobs", LegacyJobsHook.class);
if (NMSUtil.getVersionNumber() == 12) {
this.tryHook("mcMMO", McMMOClassic12Hook.class);
} else if (NMSUtil.getVersionNumber() == 8) {
this.tryHook("mcMMO", McMMOClassic8Hook.class);
}
}
}
@ -61,23 +76,47 @@ public class HookManager extends Manager {
}
/**
* Applies the loaded hooks
*
* @param player The player to apply the hook for
* Applies experience to the loaded hooks
*
* @param player The player to apply experience to
* @param treeBlocks The blocks of the tree that were broken
*/
public void applyHooks(Player player, TreeBlockSet<Block> treeBlocks) {
Set<TimberHook> invalidHooks = new HashSet<>();
for (TimberHook hook : this.hooks) {
try {
hook.apply(player, treeBlocks);
} catch (Exception ex) {
invalidHooks.add(hook);
}
}
for (TimberHook hook : invalidHooks)
this.hooks.remove(hook);
public void applyExperienceHooks(Player player, TreeBlockSet<Block> treeBlocks) {
if (!ConfigurationManager.Setting.HOOKS_APPLY_EXPERIENCE.getBoolean())
return;
for (TimberHook hook : this.hooks)
hook.applyExperience(player, treeBlocks);
}
/**
* Checks if double drops should be applied from the loaded hooks
*
* @param player The player to check
*/
public boolean shouldApplyDoubleDropsHooks(Player player) {
if (!ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean())
return false;
for (TimberHook hook : this.hooks)
if (hook.shouldApplyDoubleDrops(player))
return true;
return false;
}
/**
* Checks if a player is using an ability from the loaded hooks
*
* @param player The player to check
*/
public boolean isUsingAbilityHooks(Player player) {
if (!ConfigurationManager.Setting.HOOKS_APPLY_EXTRA_DROPS.getBoolean() || this.hooks.isEmpty())
return true;
for (TimberHook hook : this.hooks)
if (hook.isUsingAbility(player))
return true;
return false;
}
}

View File

@ -217,6 +217,7 @@ public class TreeDefinitionManager extends Manager {
*/
public void dropTreeLoot(TreeDefinition treeDefinition, ITreeBlock treeBlock, Player player, boolean hasSilkTouch) {
VersionAdapter versionAdapter = this.ultimateTimber.getVersionAdapter();
HookManager hookManager = this.ultimateTimber.getHookManager();
boolean addToInventory = ConfigurationManager.Setting.ADD_ITEMS_TO_INVENTORY.getBoolean();
boolean hasBonusChance = player.hasPermission("ultimatetimber.bonusloot");
@ -250,10 +251,18 @@ public class TreeDefinitionManager extends Manager {
double chance = hasBonusChance ? treeLoot.getChance() * bonusLootMultiplier : treeLoot.getChance();
if (this.random.nextDouble() > chance / 100)
continue;
if (treeLoot.hasItem())
if (treeLoot.hasItem()) {
if (hookManager.shouldApplyDoubleDropsHooks(player))
lootedItems.add(treeLoot.getItem());
lootedItems.add(treeLoot.getItem());
if (treeLoot.hasCommand())
}
if (treeLoot.hasCommand()) {
if (hookManager.shouldApplyDoubleDropsHooks(player))
lootedCommands.add(treeLoot.getCommand());
lootedCommands.add(treeLoot.getCommand());
}
}
// Add to inventory or drop on ground

View File

@ -12,8 +12,11 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TreeDetectionManager extends Manager {
@ -21,8 +24,8 @@ public class TreeDetectionManager extends Manager {
private final Set<Vector> VALID_TRUNK_OFFSETS, VALID_BRANCH_OFFSETS, VALID_LEAF_OFFSETS;
private TreeDefinitionManager treeDefinitionManager;
private int maxBranchBlocksAllowed, numLeavesRequiredForTree;
private boolean onlyBreakLogsUpwards, destroyBaseLog, entireTreeBase, destroyLeaves;
private int maxLogBlocksAllowed, numLeavesRequiredForTree;
private boolean onlyBreakLogsUpwards, entireTreeBase, destroyLeaves;
public TreeDetectionManager(UltimateTimber ultimateTimber) {
super(ultimateTimber);
@ -32,14 +35,14 @@ public class TreeDetectionManager extends Manager {
this.VALID_LEAF_OFFSETS = new HashSet<>();
// 3x2x3 centered around log, excluding -y axis
for (int x = -1; x <= 1; x++)
for (int y = 0; y <= 1; y++)
for (int y = 0; y <= 1; y++)
for (int x = -1; x <= 1; x++)
for (int z = -1; z <= 1; z++)
this.VALID_BRANCH_OFFSETS.add(new Vector(x, y, z));
// 3x3x3 centered around log
for (int x = -1; x <= 1; x++)
for (int y = -1; y <= 1; y++)
for (int y = -1; y <= 1; y++)
for (int x = -1; x <= 1; x++)
for (int z = -1; z <= 1; z++)
this.VALID_TRUNK_OFFSETS.add(new Vector(x, y, z));
@ -54,10 +57,9 @@ public class TreeDetectionManager extends Manager {
@Override
public void reload() {
this.treeDefinitionManager = this.ultimateTimber.getTreeDefinitionManager();
this.maxBranchBlocksAllowed = ConfigurationManager.Setting.MAX_LOGS_PER_CHOP.getInt();
this.maxLogBlocksAllowed = ConfigurationManager.Setting.MAX_LOGS_PER_CHOP.getInt();
this.numLeavesRequiredForTree = ConfigurationManager.Setting.LEAVES_REQUIRED_FOR_TREE.getInt();
this.onlyBreakLogsUpwards = ConfigurationManager.Setting.ONLY_DETECT_LOGS_UPWARDS.getBoolean();
this.destroyBaseLog = ConfigurationManager.Setting.DESTROY_INITIATED_BLOCK.getBoolean();
this.entireTreeBase = ConfigurationManager.Setting.BREAK_ENTIRE_TREE_BASE.getBoolean();
this.destroyLeaves = ConfigurationManager.Setting.DESTROY_LEAVES.getBoolean();
}
@ -84,18 +86,19 @@ public class TreeDetectionManager extends Manager {
return null;
// Detect tree trunk
Set<Block> trunkBlocks = new HashSet<>();
List<Block> trunkBlocks = new ArrayList<>();
trunkBlocks.add(initialBlock);
Block targetBlock = initialBlock;
while (this.isValidLogType(possibleTreeDefinitions, (targetBlock = targetBlock.getRelative(BlockFace.UP)))) {
TreeBlock treeBlock = new TreeBlock(targetBlock, TreeBlockType.LOG);
detectedTreeBlocks.add(treeBlock);
trunkBlocks.add(targetBlock);
possibleTreeDefinitions.retainAll(this.treeDefinitionManager.narrowTreeDefinition(possibleTreeDefinitions, targetBlock, TreeBlockType.LOG));
}
// Lowest blocks at the front of the list
Collections.reverse(trunkBlocks);
// Tree must be at least 2 blocks tall
if (detectedTreeBlocks.size() < 2)
if (trunkBlocks.size() < 2)
return null;
// Detect branches off the main trunk
@ -137,10 +140,6 @@ public class TreeDetectionManager extends Manager {
}
}
// Delete the starting block if applicable
if (this.destroyBaseLog)
detectedTreeBlocks.remove(initialTreeBlock);
// Remove all leaves if applicable
if (!this.destroyLeaves)
detectedTreeBlocks.removeAll(TreeBlockType.LEAF);
@ -157,7 +156,7 @@ public class TreeDetectionManager extends Manager {
* @param startingBlockY The Y coordinate of the initial block
*/
private void recursiveBranchSearch(Set<TreeDefinition> treeDefinitions, TreeBlockSet<Block> treeBlocks, Block block, int startingBlockY) {
if (treeBlocks.size() > this.maxBranchBlocksAllowed)
if (treeBlocks.size() > this.maxLogBlocksAllowed)
return;
for (Vector offset : this.onlyBreakLogsUpwards ? this.VALID_BRANCH_OFFSETS : this.VALID_TRUNK_OFFSETS) {

View File

@ -7,6 +7,7 @@ import com.songoda.ultimatetimber.events.TreeFellEvent;
import com.songoda.ultimatetimber.tree.DetectedTree;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -32,11 +33,8 @@ public class TreeFallManager extends Manager implements Listener {
}
@EventHandler(priority = EventPriority.HIGHEST)
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled())
return;
TreeDefinitionManager treeDefinitionManager = this.ultimateTimber.getTreeDefinitionManager();
TreeDetectionManager treeDetectionManager = this.ultimateTimber.getTreeDetectionManager();
TreeAnimationManager treeAnimationManager = this.ultimateTimber.getTreeAnimationManager();
@ -79,6 +77,9 @@ public class TreeFallManager extends Manager implements Listener {
if (!treeDefinitionManager.isToolValidForAnyTreeDefinition(tool))
isValid = false;
if (!hookManager.isUsingAbilityHooks(player))
isValid = false;
boolean alwaysReplantSapling = ConfigurationManager.Setting.ALWAYS_REPLANT_SAPLING.getBoolean();
if (!isValid && !alwaysReplantSapling)
return;
@ -111,9 +112,15 @@ public class TreeFallManager extends Manager implements Listener {
// Valid tree and meets all conditions past this point
event.setCancelled(true);
// Destroy initiated block if enabled
if (ConfigurationManager.Setting.DESTROY_INITIATED_BLOCK.getBoolean()) {
detectedTree.getDetectedTreeBlocks().getInitialLogBlock().getBlock().setType(Material.AIR);
detectedTree.getDetectedTreeBlocks().remove(detectedTree.getDetectedTreeBlocks().getInitialLogBlock());
}
if (!player.getGameMode().equals(GameMode.CREATIVE)) {
versionAdapter.applyToolDurability(player, toolDamage);
hookManager.applyHooks(player, detectedTree.getDetectedTreeBlocks());
hookManager.applyExperienceHooks(player, detectedTree.getDetectedTreeBlocks());
}
treeAnimationManager.runAnimation(detectedTree, player);

View File

@ -116,6 +116,21 @@ use-custom-particles: true
# Default: 2
bonus-loot-multiplier: 2
# Applies experience when using Jobs/mcMMO
# Only does something if Jobs or mcMMO is installed
# Default: true
hooks-apply-experience: true
# Applies extra drops passive ability when using mcMMO
# Only does something if mcMMO is installed
# Default: true
hooks-apply-extra-drops: true
# Requires the tree feller ability in mcMMO to be active to use timber
# Only does something if mcMMO is installed
# Default: false
hooks-require-ability-active: false
# The type of animation to use for tree toppling
# Types: FANCY, DISINTEGRATE, CRUMBLE, NONE
tree-animation-type: FANCY
@ -340,12 +355,3 @@ global-required-tools:
- IRON_AXE
- GOLDEN_AXE
- DIAMOND_AXE
# Hooks into other plugins to apply exp gain/abilities
hooks:
jobs:
enabled: false
mcmmo:
enabled: false
require-tree-feller-ability-active: false
apply-extra-drops-multiplier: true

View File

@ -117,6 +117,21 @@ use-custom-particles: true
# Default: 2
bonus-loot-multiplier: 2
# Applies experience when using Jobs/mcMMO
# Only does something if Jobs or mcMMO is installed
# Default: true
hooks-apply-experience: true
# Applies extra drops passive ability when using mcMMO
# Only does something if mcMMO is installed
# Default: true
hooks-apply-extra-drops: true
# Requires the tree feller ability in mcMMO to be active to use timber
# Only does something if mcMMO is installed
# Default: false
hooks-require-ability-active: false
# The type of animation to use for tree toppling
# Types: FANCY, DISINTEGRATE, CRUMBLE, NONE
tree-animation-type: FANCY
@ -323,12 +338,3 @@ global-required-tools:
- IRON_AXE
- GOLD_AXE
- DIAMOND_AXE
# Hooks into other plugins to apply exp gain/abilities
hooks:
jobs:
enabled: false
mcmmo:
enabled: false
require-tree-feller-ability-active: false
apply-extra-drops-multiplier: true

View File

@ -21,6 +21,11 @@ dependencies {
compile project(':UltimateTimber-Core')
compile project(':UltimateTimber-CurrentAdapter')
compile project(':UltimateTimber-LegacyAdapter')
compile project(':UltimateTimber-Jobs')
compile project(':UltimateTimber-McMMO')
compile project(':UltimateTimber-McMMOClassic13')
compile project(':UltimateTimber-McMMOClassic12')
compile project(':UltimateTimber-McMMOClassic8')
compile project(':UltimateTimber-Plugin')
}

View File

@ -1,13 +1,28 @@
/*
* This file was generated by the Gradle 'init' task.
*/
rootProject.name = 'UltimateTimber'
include(':UltimateTimber-Core')
include(':UltimateTimber-CurrentAdapter')
include(':UltimateTimber-LegacyAdapter')
include(':UltimateTimber-Plugin')
project(':UltimateTimber-Core').projectDir = file('UltimateTimber/Core')
include(':UltimateTimber-CurrentAdapter')
project(':UltimateTimber-CurrentAdapter').projectDir = file('UltimateTimber-Adapter/Current')
include(':UltimateTimber-LegacyAdapter')
project(':UltimateTimber-LegacyAdapter').projectDir = file('UltimateTimber-Adapter/Legacy')
include(':UltimateTimber-Jobs')
project(':UltimateTimber-Jobs').projectDir = file('UltimateTimber-Hook/Jobs')
include(':UltimateTimber-McMMO')
project(':UltimateTimber-McMMO').projectDir = file('UltimateTimber-Hook/McMMO')
include(':UltimateTimber-McMMOClassic13')
project(':UltimateTimber-McMMOClassic13').projectDir = file('UltimateTimber-Hook/McMMOClassic13')
include(':UltimateTimber-McMMOClassic12')
project(':UltimateTimber-McMMOClassic12').projectDir = file('UltimateTimber-Hook/McMMOClassic12')
include(':UltimateTimber-McMMOClassic8')
project(':UltimateTimber-McMMOClassic8').projectDir = file('UltimateTimber-Hook/McMMOClassic8')
include(':UltimateTimber-Plugin')
project(':UltimateTimber-Plugin').projectDir = file('UltimateTimber/Plugin')