New skill 'Knock On Wood', changes to axe readying messages

This commit is contained in:
nossr50
2020-11-10 15:17:52 -08:00
parent 8f6819edc5
commit b31e1e533b
14 changed files with 168 additions and 38 deletions

View File

@ -22,6 +22,7 @@ public class WoodcuttingCommand extends SkillCommand {
private boolean canTreeFell;
private boolean canLeafBlow;
private boolean canDoubleDrop;
private boolean canKnockOnWood;
private boolean canSplinter;
private boolean canBarkSurgeon;
private boolean canNaturesBounty;
@ -56,6 +57,7 @@ public class WoodcuttingCommand extends SkillCommand {
canTreeFell = RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_TREE_FELLER) && Permissions.treeFeller(player);
canDoubleDrop = canUseSubskill(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) && !skill.getDoubleDropsDisabled() && RankUtils.getRank(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1;
canLeafBlow = canUseSubskill(player, SubSkillType.WOODCUTTING_LEAF_BLOWER);
canKnockOnWood = canTreeFell && canUseSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD);
/*canSplinter = canUseSubskill(player, SubSkillType.WOODCUTTING_SPLINTER);
canBarkSurgeon = canUseSubskill(player, SubSkillType.WOODCUTTING_BARK_SURGEON);
canNaturesBounty = canUseSubskill(player, SubSkillType.WOODCUTTING_NATURES_BOUNTY);*/
@ -69,6 +71,18 @@ public class WoodcuttingCommand extends SkillCommand {
messages.add(getStatMessage(SubSkillType.WOODCUTTING_HARVEST_LUMBER, doubleDropChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
}
if (canKnockOnWood) {
String lootNote;
if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Rank2");
} else {
lootNote = LocaleLoader.getString("Woodcutting.SubSkill.KnockOnWood.Loot.Normal");
}
messages.add(getStatMessage(SubSkillType.WOODCUTTING_KNOCK_ON_WOOD, lootNote));
}
if (canLeafBlow) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Woodcutting.Ability.0"), LocaleLoader.getString("Woodcutting.Ability.1")));

View File

@ -450,7 +450,7 @@ public class Config extends AutoUpdateConfigLoader {
public int getAbilityToolDamage() { return config.getInt("Abilities.Tools.Durability_Loss", 1); }
/* Thresholds */
public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 500); }
public int getTreeFellerThreshold() { return config.getInt("Abilities.Limits.Tree_Feller_Threshold", 1000); }
/*
* SKILL SETTINGS

View File

@ -14,8 +14,10 @@ import com.gmail.nossr50.datatypes.mods.CustomTool;
import com.gmail.nossr50.datatypes.party.Party;
import com.gmail.nossr50.datatypes.party.PartyTeleportRecord;
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.datatypes.skills.ToolType;
import com.gmail.nossr50.datatypes.skills.subskills.interfaces.SubSkill;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.party.PartyManager;
@ -40,6 +42,7 @@ import com.gmail.nossr50.skills.swords.SwordsManager;
import com.gmail.nossr50.skills.taming.TamingManager;
import com.gmail.nossr50.skills.unarmed.UnarmedManager;
import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.util.BlockUtils;
import com.gmail.nossr50.util.EventUtils;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
@ -57,6 +60,7 @@ import net.kyori.adventure.identity.Identity;
import org.apache.commons.lang.Validate;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
@ -918,14 +922,25 @@ public class McMMOPlayer implements Identified {
if (skill != PrimarySkillType.WOODCUTTING && skill != PrimarySkillType.AXES) {
int timeRemaining = calculateTimeRemaining(ability);
if (!getAbilityMode(ability) && timeRemaining > 0) {
if (isAbilityOnCooldown(ability)) {
NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining));
return;
}
}
if (Config.getInstance().getAbilityMessagesEnabled()) {
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, tool.getRaiseTool());
/*
*
* IF THE TOOL IS AN AXE
*
*/
if(tool == ToolType.AXE) {
processAxeToolMessages();
} else {
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, tool.getRaiseTool());
}
//Send Sound
SoundManager.sendSound(player, player.getLocation(), SoundType.TOOL_READY);
}
@ -934,6 +949,53 @@ public class McMMOPlayer implements Identified {
}
}
public void processAxeToolMessages() {
Block rayCast = player.getTargetBlock(null, 100);
/*
* IF BOTH TREE FELLER & SKULL SPLITTER ARE ON CD
*/
if(isAbilityOnCooldown(SuperAbilityType.TREE_FELLER) && isAbilityOnCooldown(SuperAbilityType.SKULL_SPLITTER)) {
tooTiredMultiple(PrimarySkillType.WOODCUTTING, SubSkillType.WOODCUTTING_TREE_FELLER, SuperAbilityType.TREE_FELLER, SubSkillType.AXES_SKULL_SPLITTER, SuperAbilityType.SKULL_SPLITTER);
/*
* IF TREE FELLER IS ON CD
* AND PLAYER IS LOOKING AT TREE
*/
} else if(isAbilityOnCooldown(SuperAbilityType.TREE_FELLER)
&& BlockUtils.isPartOfTree(rayCast)) {
raiseToolWithCooldowns(SubSkillType.WOODCUTTING_TREE_FELLER, SuperAbilityType.TREE_FELLER);
/*
* IF SKULL SPLITTER IS ON CD
*/
} else if(isAbilityOnCooldown(SuperAbilityType.SKULL_SPLITTER)) {
raiseToolWithCooldowns(SubSkillType.AXES_SKULL_SPLITTER, SuperAbilityType.SKULL_SPLITTER);
} else {
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, ToolType.AXE.getRaiseTool());
}
}
private void tooTiredMultiple(PrimarySkillType primarySkillType, SubSkillType aSubSkill, SuperAbilityType aSuperAbility, SubSkillType bSubSkill, SuperAbilityType bSuperAbility) {
String aSuperAbilityCD = LocaleLoader.getString("Skills.TooTired.Named", aSubSkill.getLocaleName(), String.valueOf(calculateTimeRemaining(aSuperAbility)));
String bSuperAbilityCD = LocaleLoader.getString("Skills.TooTired.Named", bSubSkill.getLocaleName(), String.valueOf(calculateTimeRemaining(bSuperAbility)));
String allCDStr = aSuperAbilityCD + ", " + bSuperAbilityCD;
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, "Skills.TooTired.Extra",
primarySkillType.getName(),
allCDStr);
}
private void raiseToolWithCooldowns(SubSkillType subSkillType, SuperAbilityType superAbilityType) {
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL,
"Axes.Ability.Ready.Extra",
subSkillType.getLocaleName(),
String.valueOf(calculateTimeRemaining(superAbilityType)));
}
public boolean isAbilityOnCooldown(SuperAbilityType ability) {
return !getAbilityMode(ability) && calculateTimeRemaining(ability) > 0;
}
/**
* Calculate the time remaining until the ability's cooldown expires.
*

View File

@ -63,7 +63,7 @@ public enum PrimarySkillType {
UNARMED(UnarmedManager.class, Color.BLACK, SuperAbilityType.BERSERK, ToolType.FISTS,
ImmutableList.of(SubSkillType.UNARMED_BERSERK, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK, SubSkillType.UNARMED_BLOCK_CRACKER, SubSkillType.UNARMED_ARROW_DEFLECT, SubSkillType.UNARMED_DISARM, SubSkillType.UNARMED_STEEL_ARM_STYLE, SubSkillType.UNARMED_IRON_GRIP)),
WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, SuperAbilityType.TREE_FELLER, ToolType.AXE,
ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER));
ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD));
private final Class<? extends SkillManager> managerClass;
private final Color skillColor;

View File

@ -101,6 +101,7 @@ public enum SubSkillType {
/* Woodcutting */
/* WOODCUTTING_BARK_SURGEON(3),*/
WOODCUTTING_KNOCK_ON_WOOD(2),
WOODCUTTING_HARVEST_LUMBER(1),
WOODCUTTING_LEAF_BLOWER(1),
/* WOODCUTTING_NATURES_BOUNTY(3),

View File

@ -15,8 +15,6 @@ import com.gmail.nossr50.util.skills.RankUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
import org.bukkit.Location;
import org.bukkit.block.BlockState;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Player;
import java.util.List;
@ -47,8 +45,7 @@ public class ExcavationManager extends SkillManager {
//Spawn Vanilla XP orbs if a dice roll succeeds
if(RandomChanceUtil.rollDice(getArchaelogyExperienceOrbChance(), 100)) {
ExperienceOrb experienceOrb = (ExperienceOrb) getPlayer().getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB);
experienceOrb.setExperience(getExperienceOrbsReward());
Misc.spawnExperienceOrb(location, getExperienceOrbsReward());
}
xp += treasure.getXp();

View File

@ -301,8 +301,20 @@ public class WoodcuttingManager extends SkillManager {
processHarvestLumber(blockState);
} else if (BlockUtils.isNonWoodPartOfTree(blockState)) {
//Drop displaced non-woodcutting XP blocks
// Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1);
Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK);
if(RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK);
if(RankUtils.hasReachedRank(2, player, SubSkillType.WOODCUTTING_KNOCK_ON_WOOD)) {
if(RandomChanceUtil.rollDice(75, 100)) {
int randOrbCount = Math.max(1, Misc.getRandom().nextInt(50));
Misc.spawnExperienceOrb(blockState.getLocation(), randOrbCount);
}
}
} else {
Misc.spawnItemsFromCollection(Misc.getBlockCenter(blockState), block.getDrops(), ItemSpawnReason.TREE_FELLER_DISPLACED_BLOCK, 1);
}
}
blockState.setType(Material.AIR);

View File

@ -11,6 +11,7 @@ import com.gmail.nossr50.skills.salvage.Salvage;
import com.gmail.nossr50.util.random.RandomChanceSkill;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.BlockData;
@ -179,6 +180,10 @@ public final class BlockUtils {
return mcMMO.getMaterialMapStore().isTreeFellerDestructible(blockState.getType());
}
public static boolean isNonWoodPartOfTree(Material material) {
return mcMMO.getMaterialMapStore().isTreeFellerDestructible(material);
}
/**
* Determine if a given block should be affected by Flux Mining
*
@ -274,4 +279,8 @@ public final class BlockUtils {
}
return true;
}
public static boolean isPartOfTree(Block rayCast) {
return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType());
}
}

View File

@ -12,6 +12,7 @@ import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.entity.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -310,4 +311,37 @@ public final class Misc {
public static boolean isPartyLeader(@NotNull McMMOPlayer mmoPlayer) {
return mmoPlayer.getParty().getLeader().getUniqueId().equals(mmoPlayer.getPlayer().getUniqueId());
}
// public static void spawnExperienceOrb(@NotNull Location location, int orbAmount, int experienceValue) {
// for (int i = 0; i < orbAmount; i++) {
// new SpawnOrbTask(location, experienceValue).runTaskLater(mcMMO.p, 20);
// }
// }
public static void spawnExperienceOrb(@NotNull Location location, int experienceValue) {
if(location.getWorld() == null)
return;
ExperienceOrb experienceOrb = (ExperienceOrb) location.getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB);
experienceOrb.setExperience(experienceValue);
}
private static class SpawnOrbTask extends BukkitRunnable {
private final Location location;
private int orbExpValue;
private SpawnOrbTask(Location location, int orbExpValue) {
this.location = location;
this.orbExpValue = orbExpValue;
}
@Override
public void run() {
if(location == null || location.getWorld() == null)
return;
ExperienceOrb experienceOrb = (ExperienceOrb) location.getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB);
experienceOrb.setExperience(orbExpValue);
}
}
}