mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2025-03-30 16:26:24 +02:00
115 lines
4.2 KiB
Java
115 lines
4.2 KiB
Java
package com.gmail.nossr50.skills.maces;
|
|
|
|
import com.gmail.nossr50.datatypes.interactions.NotificationType;
|
|
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.mcMMO;
|
|
import com.gmail.nossr50.skills.SkillManager;
|
|
import com.gmail.nossr50.util.Permissions;
|
|
import com.gmail.nossr50.util.player.NotificationManager;
|
|
import com.gmail.nossr50.util.random.ProbabilityUtil;
|
|
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
|
|
import com.gmail.nossr50.util.skills.RankUtils;
|
|
import org.bukkit.NamespacedKey;
|
|
import org.bukkit.Registry;
|
|
import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.potion.PotionEffectType;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
import java.util.Locale;
|
|
|
|
public class MacesManager extends SkillManager {
|
|
private static @Nullable PotionEffectType slowEffectType;
|
|
|
|
public MacesManager(McMMOPlayer mmoPlayer) {
|
|
super(mmoPlayer, PrimarySkillType.MACES);
|
|
}
|
|
|
|
private static @Nullable PotionEffectType mockSpigotMatch(@NotNull String input) {
|
|
// Replicates match() behaviour for older versions lacking this API
|
|
final String filtered = input.toLowerCase(Locale.ROOT).replaceAll("\\s+", "_");
|
|
final NamespacedKey namespacedKey = NamespacedKey.fromString(filtered);
|
|
return (namespacedKey != null) ? Registry.EFFECT.get(namespacedKey) : null;
|
|
}
|
|
|
|
/**
|
|
* Get the Crush damage bonus.
|
|
*
|
|
* @return the Crush damage bonus.
|
|
*/
|
|
public double getCrushDamage() {
|
|
if (!Permissions.canUseSubSkill(mmoPlayer.getPlayer(), SubSkillType.MACES_CRUSH))
|
|
return 0;
|
|
|
|
int rank = RankUtils.getRank(getPlayer(), SubSkillType.MACES_CRUSH);
|
|
|
|
if (rank > 0) {
|
|
return (0.5D + (rank * 1.D));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Process Cripple attack.
|
|
*
|
|
* @param target The defending entity
|
|
*/
|
|
public void processCripple(@NotNull LivingEntity target) {
|
|
// Lazy initialized to avoid some backwards compatibility issues
|
|
if (slowEffectType == null) {
|
|
if (mockSpigotMatch("slowness") == null) {
|
|
mcMMO.p.getLogger().severe("Unable to find the Slowness PotionEffectType, " +
|
|
"mcMMO will not function properly.");
|
|
throw new IllegalStateException("Unable to find the Slowness PotionEffectType!");
|
|
} else {
|
|
slowEffectType = mockSpigotMatch("slowness");
|
|
}
|
|
}
|
|
|
|
boolean isPlayerTarget = target instanceof Player;
|
|
// Don't apply Cripple if the target is already Slowed
|
|
if (slowEffectType == null || target.getPotionEffect(slowEffectType) != null) {
|
|
return;
|
|
}
|
|
|
|
if (!Permissions.canUseSubSkill(mmoPlayer.getPlayer(), SubSkillType.MACES_CRIPPLE)) {
|
|
return;
|
|
}
|
|
|
|
int crippleRank = RankUtils.getRank(getPlayer(), SubSkillType.MACES_CRIPPLE);
|
|
double crippleOdds = (mcMMO.p.getAdvancedConfig().getCrippleChanceToApplyOnHit(crippleRank)
|
|
* mmoPlayer.getAttackStrength());
|
|
|
|
if (ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.MACES, mmoPlayer, crippleOdds)) {
|
|
if (mmoPlayer.useChatNotifications()) {
|
|
NotificationManager.sendPlayerInformation(mmoPlayer.getPlayer(),
|
|
NotificationType.SUBSKILL_MESSAGE, "Maces.SubSkill.Cripple.Activated");
|
|
}
|
|
|
|
// Cripple is success, Cripple the target
|
|
target.addPotionEffect(slowEffectType.createEffect(
|
|
getCrippleTickDuration(isPlayerTarget),
|
|
getCrippleStrength(isPlayerTarget)));
|
|
ParticleEffectUtils.playCrippleEffect(target);
|
|
}
|
|
}
|
|
|
|
public static int getCrippleTickDuration(boolean isPlayerTarget) {
|
|
// TODO: Make configurable
|
|
if (isPlayerTarget) {
|
|
return 20;
|
|
} else {
|
|
return 30;
|
|
}
|
|
}
|
|
|
|
public static int getCrippleStrength(boolean isPlayerTarget) {
|
|
// TODO: Make configurable
|
|
return isPlayerTarget ? 1 : 2;
|
|
}
|
|
}
|