diff --git a/pom.xml b/pom.xml index 612662a..ada9d76 100755 --- a/pom.xml +++ b/pom.xml @@ -7,39 +7,38 @@ com.github.civclassic civclassic-parent - 1.0.0 + 1.0.1 - com.github.maxopoly Finale jar - 1.5.1 + 1.6.0 Finale https://github.com/Civclassic/Finale - com.destroystokyo.paper + io.papermc.paper paper - 1.16.5-R0.1-SNAPSHOT + 1.17.1-R0.1-SNAPSHOT provided - vg.civcraft.mc.civmodcore + com.github.civclassic CivModCore - 1.8.2 + 1.9.0 provided net.minelink CombatTagPlus - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT provided com.comphenix.protocol ProtocolLib - 4.6.0 + 4.7.0 provided @@ -49,9 +48,13 @@ civ-github-repo https://raw.githubusercontent.com/CivClassic/artifacts/master/ + + papermc + https://papermc.io/repo/repository/maven-public/ + dmulloy2-repo - http://repo.dmulloy2.net/content/groups/public/ + https://repo.dmulloy2.net/content/groups/public/ diff --git a/src/main/java/com/github/maxopoly/finale/ConfigParser.java b/src/main/java/com/github/maxopoly/finale/ConfigParser.java index d1f97ef..14705a7 100644 --- a/src/main/java/com/github/maxopoly/finale/ConfigParser.java +++ b/src/main/java/com/github/maxopoly/finale/ConfigParser.java @@ -1,6 +1,20 @@ package com.github.maxopoly.finale; -import static vg.civcraft.mc.civmodcore.util.ConfigParsing.parseTime; +import static vg.civcraft.mc.civmodcore.config.ConfigHelper.parseTime; + +import java.util.*; + +import com.github.maxopoly.finale.misc.knockback.KnockbackConfig; +import com.github.maxopoly.finale.misc.knockback.KnockbackModifier; +import com.github.maxopoly.finale.misc.knockback.KnockbackType; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.EntityType; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.potion.PotionType; import com.github.maxopoly.finale.combat.CombatConfig; import com.github.maxopoly.finale.combat.CombatSoundConfig; @@ -13,21 +27,6 @@ import com.github.maxopoly.finale.misc.velocity.VelocityHandler; import com.github.maxopoly.finale.potion.PotionHandler; import com.github.maxopoly.finale.potion.PotionModification; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.EntityType; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.potion.PotionType; import org.bukkit.util.Vector; public class ConfigParser { @@ -73,7 +72,7 @@ public VelocityHandler getVelocityHandler() { public boolean isPearlEnabled() { return pearlEnabled; } - + public CombatConfig getCombatConfig() { return combatConfig; } @@ -334,7 +333,7 @@ private WeaponModifier parseWeaponModification(ConfigurationSection config) { } return wm; } - + private ArmourModifier parseArmourModification(ConfigurationSection config) { ArmourModifier am = new ArmourModifier(); if (config == null) { @@ -369,20 +368,24 @@ private ArmourModifier parseArmourModification(ConfigurationSection config) { } return am; } - + private CombatConfig parseCombatConfig(ConfigurationSection config) { double maxReach = config.getDouble("maxReach", 6.0); - Vector knockbackMultiplier = parseVector(config, "knockbackMultiplier", new Vector(1, 1, 1)); - Vector sprintMultiplier = parseVector(config, "sprintMultiplier", new Vector(1, 1, 1)); - Vector waterKnockbackMultiplier = parseVector(config, "waterKnockbackMultiplier", new Vector(1, 1, 1)); - Vector airKnockbackMultiplier = parseVector(config, "airKnockbackMultiplier", new Vector(1, 1, 1)); + KnockbackConfig normalConfig = parseKnockbackConfig(config, "normal", new KnockbackConfig( + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(1, 1, 1)), + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(1, 1, 1)), + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(1, 1, 1)) + )); + KnockbackConfig sprintConfig = parseKnockbackConfig(config, "sprint", new KnockbackConfig( + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(3, 1, 3)), + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(3, 1, 3)), + new KnockbackModifier(KnockbackType.MULTIPLY, new Vector(3, 1, 3)) + )); Vector victimMotion = parseVector(config, "victimMotion", new Vector(0.5, 0.5, 0.5)); Vector maxVictimMotion = parseVector(config, "maxVictimMotion", new Vector(10, 1, 10)); Vector attackerMotion = parseVector(config, "attackerMotion", new Vector(0.6, 1, 0.6)); - plugin.info("Setting knockbackMultiplier to " + knockbackMultiplier); - plugin.info("Setting sprintMultiplier to " + sprintMultiplier); - plugin.info("Setting waterKnockbackMultiplier to " + waterKnockbackMultiplier); - plugin.info("Setting airKnockbackMultiplier to " + airKnockbackMultiplier); + plugin.info("Setting normalConfig to " + normalConfig); + plugin.info("Setting sprintConfig to " + sprintConfig); plugin.info("Setting victimMotion to " + victimMotion); plugin.info("Setting maxVictimMotion to " + maxVictimMotion); plugin.info("Setting attackerMotion to " + attackerMotion); @@ -402,7 +405,7 @@ private CombatConfig parseCombatConfig(ConfigurationSection config) { plugin.info("Strong sounds are " + (strongSoundEnabled ? "ON" : "OFF")); plugin.info("Knockback sounds are " + (knockbackSoundEnabled ? "ON" : "OFF")); plugin.info("Crit sounds are " + (critSoundEnabled ? "ON" : "OFF")); - + CombatSoundConfig combatSounds = new CombatSoundConfig(weakSoundEnabled, strongSoundEnabled, knockbackSoundEnabled, critSoundEnabled); boolean attackCooldownEnabled = config.getBoolean("attackCooldownEnabled", false); boolean knockbackSwordsEnabled = config.getBoolean("knockbackSwordsEnabled", true); @@ -419,7 +422,26 @@ private CombatConfig parseCombatConfig(ConfigurationSection config) { } return new CombatConfig(attackCooldownEnabled, knockbackSwordsEnabled, sprintResetEnabled, waterSprintResetEnabled, cpsLimit, cpsCounterInterval, maxReach, sweepEnabled, combatSounds, - knockbackLevelMultiplier, knockbackMultiplier, sprintMultiplier, waterKnockbackMultiplier, airKnockbackMultiplier, victimMotion, maxVictimMotion, attackerMotion); + knockbackLevelMultiplier, normalConfig, sprintConfig, victimMotion, maxVictimMotion, attackerMotion); + } + + private KnockbackConfig parseKnockbackConfig(ConfigurationSection config, String name, KnockbackConfig def) { + KnockbackModifier ground = parseKnockbackModifier(config, name + ".groundModifier", def.getGroundModifier()); + KnockbackModifier air = parseKnockbackModifier(config, name + ".airModifier", def.getGroundModifier()); + KnockbackModifier water = parseKnockbackModifier(config, name + ".waterModifier", def.getGroundModifier()); + return new KnockbackConfig(ground, air, water); + } + + private KnockbackModifier parseKnockbackModifier(ConfigurationSection config, String name, KnockbackModifier def) { + String typeStr = config.getString(name + ".type", def.getType().toString()); + KnockbackType type = KnockbackType.valueOf(typeStr.toUpperCase()); + if (type == null) { + return def; + } + double x = config.getDouble(name + ".x", def.getModifier().getX()); + double y = config.getDouble(name + ".y", def.getModifier().getY()); + double z = config.getDouble(name + ".z", def.getModifier().getZ()); + return new KnockbackModifier(type, new Vector(x, y, z)); } private Vector parseVector(ConfigurationSection config, String name, Vector def) { @@ -428,7 +450,7 @@ private Vector parseVector(ConfigurationSection config, String name, Vector def) double z = config.getDouble(name + ".z", def.getZ()); return new Vector(x, y, z); } - + private Map parseInvulnerabilityTicks(ConfigurationSection config) { Map invulnTicks = new HashMap<>(); for (String key : config.getKeys(false)) { @@ -440,7 +462,7 @@ private Map parseInvulnerabilityTicks(Co + ". It was skipped"); continue; } - + int ticks = config.getInt(key); invulnTicks.put(cause, ticks); plugin.info("Applying tick invulnerability modification for " + cause.toString() + ", ticks: " + ticks); diff --git a/src/main/java/com/github/maxopoly/finale/Finale.java b/src/main/java/com/github/maxopoly/finale/Finale.java index 67bc110..4de9c40 100644 --- a/src/main/java/com/github/maxopoly/finale/Finale.java +++ b/src/main/java/com/github/maxopoly/finale/Finale.java @@ -1,6 +1,11 @@ package com.github.maxopoly.finale; import com.comphenix.protocol.ProtocolLibrary; +import com.github.maxopoly.finale.command.CardinalCommand; +import com.github.maxopoly.finale.command.CombatConfigCommand; +import com.github.maxopoly.finale.command.GammaBrightCommand; +import com.github.maxopoly.finale.command.ReloadFinaleCommand; +import com.github.maxopoly.finale.command.ShowCpsCommand; import com.github.maxopoly.finale.external.CombatTagPlusManager; import com.github.maxopoly.finale.external.FinaleSettingManager; import com.github.maxopoly.finale.listeners.DamageListener; @@ -17,6 +22,7 @@ import org.bukkit.event.HandlerList; import org.bukkit.plugin.PluginManager; import vg.civcraft.mc.civmodcore.ACivMod; +import vg.civcraft.mc.civmodcore.commands.CommandManager; public class Finale extends ACivMod { @@ -30,6 +36,7 @@ public static Finale getPlugin() { private CombatTagPlusManager ctpManager; private ConfigParser config; private FinaleSettingManager settingsManager; + private CommandManager commandManager; public CombatTagPlusManager getCombatTagPlusManager() { return ctpManager; @@ -66,6 +73,8 @@ public void onDisable() { public void onEnable() { super.onEnable(); instance = this; + commandManager = new CommandManager(this); + commandManager.init(); reload(); } @@ -88,6 +97,14 @@ private void registerListener() { Bukkit.getPluginManager().registerEvents(new ToolProtectionListener(settingsManager), this); } + private void registerCommands() { + commandManager.registerCommand(new CardinalCommand()); + commandManager.registerCommand(new CombatConfigCommand()); + commandManager.registerCommand(new GammaBrightCommand()); + commandManager.registerCommand(new ReloadFinaleCommand()); + commandManager.registerCommand(new ShowCpsCommand()); + } + public void reload() { onDisable(); config = new ConfigParser(this); @@ -95,6 +112,7 @@ public void reload() { settingsManager = new FinaleSettingManager(); initExternalManagers(); registerListener(); + registerCommands(); } } diff --git a/src/main/java/com/github/maxopoly/finale/FinaleManager.java b/src/main/java/com/github/maxopoly/finale/FinaleManager.java index d96b88d..befa675 100644 --- a/src/main/java/com/github/maxopoly/finale/FinaleManager.java +++ b/src/main/java/com/github/maxopoly/finale/FinaleManager.java @@ -9,6 +9,7 @@ import com.github.maxopoly.finale.misc.WeaponModifier; import com.github.maxopoly.finale.potion.PotionHandler; import java.util.Map; + import org.bukkit.Bukkit; import org.bukkit.event.entity.EntityDamageEvent; @@ -46,15 +47,8 @@ public FinaleManager(boolean debug, boolean attackSpeedEnabled, double attackSpe this.ctpOnLogin = ctpOnLogin; this.cpsHandler = new CPSHandler(); - - Bukkit.getScheduler().runTaskAsynchronously(Finale.getPlugin(), new Runnable() { - - @Override - public void run() { - ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(combatHandler = new AsyncPacketHandler()).start(); - } - - }); + + Bukkit.getScheduler().runTaskAsynchronously(Finale.getPlugin(), () -> ProtocolLibrary.getProtocolManager().getAsynchronousManager().registerAsyncHandler(combatHandler = new AsyncPacketHandler(combatConfig)).start()); } public AsyncPacketHandler getCombatHandler() { diff --git a/src/main/java/com/github/maxopoly/finale/combat/AsyncPacketHandler.java b/src/main/java/com/github/maxopoly/finale/combat/AsyncPacketHandler.java index 73bfa2a..b1de947 100644 --- a/src/main/java/com/github/maxopoly/finale/combat/AsyncPacketHandler.java +++ b/src/main/java/com/github/maxopoly/finale/combat/AsyncPacketHandler.java @@ -10,6 +10,7 @@ import com.comphenix.protocol.wrappers.EnumWrappers.EntityUseAction; import com.comphenix.protocol.wrappers.EnumWrappers.Hand; import com.comphenix.protocol.wrappers.EnumWrappers.PlayerDigType; +import com.comphenix.protocol.wrappers.WrappedEnumEntityUseAction; import com.github.maxopoly.finale.Finale; import com.google.common.collect.Sets; import java.util.HashMap; @@ -22,7 +23,9 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; @@ -30,18 +33,16 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; public class AsyncPacketHandler extends PacketAdapter implements Listener { + + private CombatConfig cc; - private double maxReach; - private int cpsLimit; - - public AsyncPacketHandler() { + public AsyncPacketHandler(CombatConfig cc) { super(Finale.getPlugin(), ListenerPriority.HIGH, PacketType.Play.Client.USE_ENTITY, PacketType.Play.Client.ARM_ANIMATION, PacketType.Play.Client.BLOCK_DIG); - - CombatConfig cc = Finale.getPlugin().getManager().getCombatConfig(); - maxReach = cc.getMaxReach(); - cpsLimit = cc.getCPSLimit(); + + this.cc = cc; Bukkit.getPluginManager().registerEvents(this, Finale.getPlugin()); } @@ -53,45 +54,47 @@ public AsyncPacketHandler() { @Override public void onPacketReceiving(PacketEvent event) { PacketType packetType = event.getPacketType(); - + CPSHandler cpsHandler = Finale.getPlugin().getManager().getCPSHandler(); if (packetType == PacketType.Play.Client.USE_ENTITY) { Player attacker = event.getPlayer(); World world = attacker.getWorld(); - + PacketContainer packet = event.getPacket(); - Entity entity = packet.getEntityModifier(event).read(0); - Damageable target = entity instanceof Damageable ? (Damageable)entity : null; - - if (target == null || target.isDead() || target.isInvulnerable() || - !world.getUID().equals(target.getWorld().getUID()) || !(target instanceof LivingEntity)) { - return; - } - - LivingEntity entityTarget = (LivingEntity) target; - - StructureModifier actions = packet.getEntityUseActions(); - EntityUseAction action = actions.read(0); - + StructureModifier actions = packet.getEnumEntityUseActions(); + EntityUseAction action = actions.read(0).getAction(); if (action != EntityUseAction.ATTACK) { return; } event.setCancelled(true); - - //cpsHandler.updateClicks(attacker); - - double distanceSquared = attacker.getLocation().distanceSquared(target.getLocation()); - - if (distanceSquared > (maxReach * maxReach)) { - return; - } - - if (cpsHandler.getCPS(attacker.getUniqueId()) >= cpsLimit) { - attacker.sendMessage(ChatColor.RED + "You've hit CPS limit of " + cpsLimit + "!"); - return; - } - - CombatUtil.attack(attacker, entityTarget); + new BukkitRunnable() { + + @Override + public void run() { + Entity entity = packet.getEntityModifier(event).read(0); + Damageable target = entity instanceof Damageable ? (Damageable) entity : null; + + if (target == null || target.isDead() || target.isInvulnerable() || + !world.getUID().equals(target.getWorld().getUID()) || !(target instanceof LivingEntity)) { + return; + } + + LivingEntity entityTarget = (LivingEntity) target; + + double distanceSquared = attacker.getLocation().distanceSquared(target.getLocation()); + + if (distanceSquared > (cc.getMaxReach() * cc.getMaxReach())) { + return; + } + + if (cpsHandler.getCPS(attacker.getUniqueId()) >= cc.getCPSLimit()) { + attacker.sendMessage(ChatColor.RED + "You've hit CPS limit of " + cc.getCPSLimit() + "!"); + return; + } + + CombatUtil.attack(attacker, entityTarget); + } + }.runTask(Finale.getPlugin()); } else if (packetType == PacketType.Play.Client.ARM_ANIMATION) { Player attacker = event.getPlayer(); PacketContainer packet = event.getPacket(); @@ -101,11 +104,11 @@ public void onPacketReceiving(PacketEvent event) { } } else if (packetType == PacketType.Play.Client.BLOCK_DIG) { Player attacker = event.getPlayer(); - + if (attacker.getGameMode() != GameMode.SURVIVAL) { return; } - + PacketContainer packet = event.getPacket(); BlockPosition position = packet.getBlockPositionModifier().getValues().get(0); PlayerDigType digType = packet.getPlayerDigTypes().getValues().get(0); @@ -116,18 +119,18 @@ public void onPacketReceiving(PacketEvent event) { cpsHandler.updateClicks(attacker); return; } - + float strength = ((CraftWorld) block.getWorld()).getHandle() - .getType(new net.minecraft.server.v1_16_R3.BlockPosition(position.getX(), position.getY(), position.getZ())) + .getType(new net.minecraft.core.BlockPosition(position.getX(), position.getY(), position.getZ())) .getBlock().getDurability(); - + long lastStartBreak = lastStartBreaks.getOrDefault(attacker.getUniqueId(), 0L); long timeSinceBreak = (System.currentTimeMillis() - lastStartBreak); lastStartBreaks.put(attacker.getUniqueId(), System.currentTimeMillis()); if (strength > 0) { long lastRemoval = lastRemovals.getOrDefault(attacker.getUniqueId(), 0L); long timeSinceRemoval = (System.currentTimeMillis() - lastRemoval); - + if (isDigging.contains(attacker.getUniqueId())) { return; } diff --git a/src/main/java/com/github/maxopoly/finale/combat/CPSHandler.java b/src/main/java/com/github/maxopoly/finale/combat/CPSHandler.java index 9b682a8..b475e55 100644 --- a/src/main/java/com/github/maxopoly/finale/combat/CPSHandler.java +++ b/src/main/java/com/github/maxopoly/finale/combat/CPSHandler.java @@ -14,8 +14,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLine; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLine; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLineAPI; public class CPSHandler implements Listener { diff --git a/src/main/java/com/github/maxopoly/finale/combat/CombatConfig.java b/src/main/java/com/github/maxopoly/finale/combat/CombatConfig.java index 8b19a2a..b01a404 100644 --- a/src/main/java/com/github/maxopoly/finale/combat/CombatConfig.java +++ b/src/main/java/com/github/maxopoly/finale/combat/CombatConfig.java @@ -1,6 +1,8 @@ package com.github.maxopoly.finale.combat; import com.github.maxopoly.finale.Finale; +import com.github.maxopoly.finale.misc.knockback.KnockbackConfig; +import com.github.maxopoly.finale.misc.knockback.KnockbackModifier; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.util.Vector; @@ -16,16 +18,14 @@ public class CombatConfig { private boolean sweepEnabled; private CombatSoundConfig combatSounds; private double knockbackLevelMultiplier; - private Vector knockbackMultiplier; - private Vector sprintMultiplier; - private Vector waterKnockbackMultiplier; - private Vector airKnockbackMultiplier; + private KnockbackConfig normalConfig; + private KnockbackConfig sprintConfig; private Vector victimMotion; private Vector maxVictimMotion; private Vector attackerMotion; public CombatConfig(boolean attackCooldownEnabled, boolean knockbackSwordsEnabled, boolean sprintResetEnabled, boolean waterSprintResetEnabled, int cpsLimit, long cpsCounterInterval, double maxReach, boolean sweepEnabled, CombatSoundConfig combatSounds, - double knockbackLevelMultiplier, Vector knockbackMultiplier, Vector sprintMultiplier, Vector waterKnockbackMultiplier, Vector airKnockbackMultiplier, Vector victimMotion, Vector maxVictimMotion, + double knockbackLevelMultiplier, KnockbackConfig normalConfig, KnockbackConfig sprintConfig, Vector victimMotion, Vector maxVictimMotion, Vector attackerMotion) { this.attackCooldownEnabled = attackCooldownEnabled; this.knockbackSwordsEnabled = knockbackSwordsEnabled; @@ -37,15 +37,26 @@ public CombatConfig(boolean attackCooldownEnabled, boolean knockbackSwordsEnable this.sweepEnabled = sweepEnabled; this.combatSounds = combatSounds; this.knockbackLevelMultiplier = knockbackLevelMultiplier; - this.knockbackMultiplier = knockbackMultiplier; - this.sprintMultiplier = sprintMultiplier; - this.waterKnockbackMultiplier = waterKnockbackMultiplier; - this.airKnockbackMultiplier = airKnockbackMultiplier; + this.normalConfig = normalConfig; + this.sprintConfig = sprintConfig; this.victimMotion = victimMotion; this.maxVictimMotion = maxVictimMotion; this.attackerMotion = attackerMotion; } + private void setKnockbackConfig(FileConfiguration config, String name, KnockbackConfig knockbackConfig) { + setKnockbackModifier(config, "cleanerCombat." + name + ".groundModifier", knockbackConfig.getGroundModifier()); + setKnockbackModifier(config, "cleanerCombat." + name + ".airModifier", knockbackConfig.getAirModifier()); + setKnockbackModifier(config, "cleanerCombat." + name + ".waterModifier", knockbackConfig.getWaterModifier()); + } + + private void setKnockbackModifier(FileConfiguration config, String name, KnockbackModifier modifier) { + config.set(name + ".type", modifier.getType().toString()); + config.set(name + ".x", modifier.getModifier().getX()); + config.set(name + ".y", modifier.getModifier().getY()); + config.set(name + ".z", modifier.getModifier().getZ()); + } + private void setVector(FileConfiguration config, String name, Vector vec) { config.set(name + ".x", vec.getX()); config.set(name + ".y", vec.getY()); @@ -54,13 +65,11 @@ private void setVector(FileConfiguration config, String name, Vector vec) { public void save() { FileConfiguration config = Finale.getPlugin().getConfig(); - setVector(config, "clearCombat.knockbackMultiplier", this.knockbackMultiplier); - setVector(config, "clearCombat.sprintMultiplier", this.sprintMultiplier); - setVector(config, "clearCombat.waterKnockbackMultiplier", this.waterKnockbackMultiplier); - setVector(config, "clearCombat.airKnockbackMultiplier", this.airKnockbackMultiplier); - setVector(config, "clearCombat.victimMotion", this.victimMotion); - setVector(config, "clearCombat.maxVictimMotion", this.maxVictimMotion); - setVector(config, "clearCombat.attackerMotion", this.attackerMotion); + setKnockbackConfig(config, "normal", normalConfig); + setKnockbackConfig(config, "sprint", sprintConfig); + setVector(config, "cleanerCombat.victimMotion", this.victimMotion); + setVector(config, "cleanerCombat.maxVictimMotion", this.maxVictimMotion); + setVector(config, "cleanerCombat.attackerMotion", this.attackerMotion); config.options().copyDefaults(true); Finale.getPlugin().saveConfig(); } @@ -69,20 +78,12 @@ public double getKnockbackLevelMultiplier() { return knockbackLevelMultiplier; } - public Vector getKnockbackMultiplier() { - return knockbackMultiplier; - } - - public Vector getSprintMultiplier() { - return sprintMultiplier; + public KnockbackConfig getNormalConfig() { + return normalConfig; } - public Vector getAirKnockbackMultiplier() { - return airKnockbackMultiplier; - } - - public Vector getWaterKnockbackMultiplier() { - return waterKnockbackMultiplier; + public KnockbackConfig getSprintConfig() { + return sprintConfig; } public Vector getVictimMotion() { @@ -133,20 +134,12 @@ public CombatSoundConfig getCombatSounds() { return combatSounds; } - public void setKnockbackMultiplier(Vector knockbackMultiplier) { - this.knockbackMultiplier = knockbackMultiplier; - } - - public void setSprintMultiplier(Vector sprintMultiplier) { - this.sprintMultiplier = sprintMultiplier; - } - - public void setAirKnockbackMultiplier(Vector airKnockbackMultiplier) { - this.airKnockbackMultiplier = airKnockbackMultiplier; + public void setNormalConfig(KnockbackConfig normalConfig) { + this.normalConfig = normalConfig; } - public void setWaterKnockbackMultiplier(Vector waterKnockbackMultiplier) { - this.waterKnockbackMultiplier = waterKnockbackMultiplier; + public void setSprintConfig(KnockbackConfig sprintConfig) { + this.sprintConfig = sprintConfig; } public void setVictimMotion(Vector victimMotion) { diff --git a/src/main/java/com/github/maxopoly/finale/combat/CombatUtil.java b/src/main/java/com/github/maxopoly/finale/combat/CombatUtil.java index 45bbe33..2e36748 100644 --- a/src/main/java/com/github/maxopoly/finale/combat/CombatUtil.java +++ b/src/main/java/com/github/maxopoly/finale/combat/CombatUtil.java @@ -4,34 +4,37 @@ import com.github.maxopoly.finale.combat.event.CritHitEvent; import java.util.Iterator; import java.util.List; -import net.minecraft.server.v1_16_R3.DamageSource; -import net.minecraft.server.v1_16_R3.EnchantmentManager; -import net.minecraft.server.v1_16_R3.Entity; -import net.minecraft.server.v1_16_R3.EntityArmorStand; -import net.minecraft.server.v1_16_R3.EntityComplexPart; -import net.minecraft.server.v1_16_R3.EntityHuman; -import net.minecraft.server.v1_16_R3.EntityLiving; -import net.minecraft.server.v1_16_R3.EntityPlayer; -import net.minecraft.server.v1_16_R3.EnumHand; -import net.minecraft.server.v1_16_R3.EnumMonsterType; -import net.minecraft.server.v1_16_R3.GenericAttributes; -import net.minecraft.server.v1_16_R3.ItemStack; -import net.minecraft.server.v1_16_R3.ItemSword; -import net.minecraft.server.v1_16_R3.MathHelper; -import net.minecraft.server.v1_16_R3.MobEffects; -import net.minecraft.server.v1_16_R3.PacketPlayOutEntityVelocity; -import net.minecraft.server.v1_16_R3.PacketPlayOutNamedSoundEffect; -import net.minecraft.server.v1_16_R3.Particles; -import net.minecraft.server.v1_16_R3.SoundCategory; -import net.minecraft.server.v1_16_R3.SoundEffect; -import net.minecraft.server.v1_16_R3.SoundEffects; -import net.minecraft.server.v1_16_R3.StatisticList; -import net.minecraft.server.v1_16_R3.Vec3D; -import net.minecraft.server.v1_16_R3.World; -import net.minecraft.server.v1_16_R3.WorldServer; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftLivingEntity; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_16_R3.util.CraftVector; + +import com.github.maxopoly.finale.misc.knockback.KnockbackConfig; +import com.github.maxopoly.finale.misc.knockback.KnockbackModifier; +import net.minecraft.core.particles.Particles; +import net.minecraft.network.protocol.game.PacketPlayOutEntityVelocity; +import net.minecraft.network.protocol.game.PacketPlayOutNamedSoundEffect; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.level.WorldServer; +import net.minecraft.sounds.SoundCategory; +import net.minecraft.sounds.SoundEffect; +import net.minecraft.sounds.SoundEffects; +import net.minecraft.stats.StatisticList; +import net.minecraft.util.MathHelper; +import net.minecraft.world.EnumHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityLiving; +import net.minecraft.world.entity.EnumMonsterType; +import net.minecraft.world.entity.ai.attributes.GenericAttributes; +import net.minecraft.world.entity.boss.EntityComplexPart; +import net.minecraft.world.entity.decoration.EntityArmorStand; +import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemSword; +import net.minecraft.world.item.enchantment.EnchantmentManager; +import net.minecraft.world.level.World; +import net.minecraft.world.phys.Vec3D; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_17_R1.util.CraftVector; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityCombustByEntityEvent; @@ -42,31 +45,32 @@ public class CombatUtil { private static void sendSoundEffect(EntityHuman fromEntity, double x, double y, double z, SoundEffect soundEffect, SoundCategory soundCategory, float volume, float pitch) { - fromEntity.world.playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity himself + fromEntity.getWorld().playSound(fromEntity, x, y, z, soundEffect, soundCategory, volume, pitch); // This will not send the effect to the entity himself if (fromEntity instanceof EntityPlayer) { - ((EntityPlayer) fromEntity).playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(soundEffect, soundCategory, x, y, z, volume, pitch)); + ((EntityPlayer) fromEntity).b.sendPacket(new PacketPlayOutNamedSoundEffect(soundEffect, soundCategory, x, y, z, volume, pitch)); } } public static void attack(Player attacker, LivingEntity victim) { - new BukkitRunnable() { + /*new BukkitRunnable() { @Override public void run() { attack(((CraftPlayer) attacker).getHandle(), ((CraftLivingEntity) victim).getHandle()); } - }.runTask(Finale.getPlugin()); + }.runTask(Finale.getPlugin());*/ + attack(((CraftPlayer) attacker).getHandle(), ((CraftLivingEntity) victim).getHandle()); } //see EntityHuman#attack(Entity) to update this public static void attack(EntityHuman attacker, Entity victim) { CombatConfig config = Finale.getPlugin().getManager().getCombatConfig(); - if (victim.bL() && !victim.t(attacker)) { - float damage = (float) attacker.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).getValue(); + if (victim.ca() && !victim.r(attacker)) { + float damage = (float) attacker.getAttributeInstance(GenericAttributes.f).getValue(); float f1 = (victim instanceof EntityLiving) ? EnchantmentManager.a(attacker.getItemInMainHand(), ((EntityLiving) victim).getMonsterType()) : - EnchantmentManager.a(attacker.getItemInMainHand(), EnumMonsterType.UNDEFINED); + EnchantmentManager.a(attacker.getItemInMainHand(), EnumMonsterType.a); float f2 = 0; boolean shouldKnockback = true; @@ -84,7 +88,7 @@ public static void attack(EntityHuman attacker, Entity victim) { if (attacker.isSprinting() && shouldKnockback) { if (config.getCombatSounds().isKnockbackEnabled()) { - sendSoundEffect(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.ENTITY_PLAYER_ATTACK_KNOCKBACK, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility + sendSoundEffect(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.ok, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility } if (!config.isKnockbackSwordsEnabled()) { ++knockbackLevel; @@ -92,8 +96,8 @@ public static void attack(EntityHuman attacker, Entity victim) { dealtExtraKnockback = true; } - boolean shouldCrit = shouldKnockback && attacker.fallDistance > 0.0F && !attacker.isOnGround() && !attacker.isClimbing() && !attacker.isInWater() - && !attacker.hasEffect(MobEffects.BLINDNESS) && !attacker.isPassenger() && victim instanceof EntityLiving; + boolean shouldCrit = shouldKnockback && attacker.K > 0.0F && !attacker.isOnGround() && !attacker.isClimbing() && !attacker.isInWater() + && !attacker.hasEffect(MobEffects.o) && !attacker.isPassenger() && victim instanceof EntityLiving; shouldCrit = shouldCrit && !attacker.isSprinting(); if (shouldCrit) { double critMultiplier = 1.5d; @@ -108,10 +112,10 @@ public static void attack(EntityHuman attacker, Entity victim) { } damage += f1; boolean shouldSweep = false; - double d0 = attacker.A - attacker.z; + double d0 = attacker.H - attacker.G; - if (shouldKnockback && !shouldCrit && !dealtExtraKnockback && attacker.isOnGround() && d0 < (double) attacker.dN()) { - ItemStack itemstack = attacker.b(EnumHand.MAIN_HAND); + if (shouldKnockback && !shouldCrit && !dealtExtraKnockback && attacker.isOnGround() && d0 < (double) attacker.ew()) { + ItemStack itemstack = attacker.b(EnumHand.a); if (itemstack.getItem() instanceof ItemSword) { shouldSweep = true; } @@ -138,65 +142,53 @@ public static void attack(EntityHuman attacker, Entity victim) { if (damagedVictim) { if (victim instanceof EntityLiving) { EntityLiving livingVictim = (EntityLiving) victim; - double kbResistance = livingVictim.b(GenericAttributes.KNOCKBACK_RESISTANCE); - double knockbackModifier = (1.0 - kbResistance); + double kbResistance = livingVictim.b(GenericAttributes.c); + double knockbackFactor = (1.0 - kbResistance); double knockbackLevelModifier = 1 + (knockbackLevel * config.getKnockbackLevelMultiplier()); - if (knockbackModifier > 0) { - double dx = -MathHelper.sin(attacker.yaw * 0.01745329251f) * 0.3f; - double dy = 0.35; - double dz = MathHelper.cos(attacker.yaw * 0.01745329251f) * 0.3f; - - Vector knockbackMultiplier = config.getKnockbackMultiplier(); - Vector waterKnockbackMultiplier = config.getWaterKnockbackMultiplier(); - Vector airKnockbackMultiplier = config.getAirKnockbackMultiplier(); + if (knockbackFactor > 0) { + Vector start = new Vector( + -MathHelper.sin(attacker.getBukkitYaw() * 0.01745329251f), + 1.0, + MathHelper.cos(attacker.getBukkitYaw() * 0.01745329251f) + ).normalize(); + Vector dv = start.clone(); - dx *= knockbackMultiplier.getX(); - dy *= knockbackMultiplier.getY(); - dz *= knockbackMultiplier.getZ(); - - if (dealtExtraKnockback) { - Vector sprintMultiplier = config.getSprintMultiplier(); - dx *= sprintMultiplier.getX(); - dy *= sprintMultiplier.getY(); - dz *= sprintMultiplier.getZ(); - } + KnockbackConfig knockbackConfig = dealtExtraKnockback ? config.getSprintConfig() : config.getNormalConfig(); if (victim.isInWater()) { - dx *= waterKnockbackMultiplier.getX(); - dy *= waterKnockbackMultiplier.getY(); - dz *= waterKnockbackMultiplier.getZ(); - } else if (!victim.isOnGround()) { - dx *= airKnockbackMultiplier.getX(); - dy *= airKnockbackMultiplier.getY(); - dz *= airKnockbackMultiplier.getZ(); + dv = knockbackConfig.getWaterModifier().modifyKnockback(start, dv); + } else { + if (!victim.isOnGround()) { + dv = knockbackConfig.getAirModifier().modifyKnockback(start, dv); + } else{ + dv = knockbackConfig.getGroundModifier().modifyKnockback(start, dv); + } } if (config.isKnockbackSwordsEnabled() && knockbackLevel > 1) { - dx *= knockbackLevelModifier; - dz *= knockbackLevelModifier; + dv.setX(dv.getX() * knockbackLevelModifier); + dv.setZ(dv.getZ() * knockbackLevelModifier); } - dx *= knockbackModifier; - dy *= knockbackModifier; - dz *= knockbackModifier; + dv = dv.multiply(knockbackFactor); - victim.impulse = true; + victim.af = true; Vector victimMotFactor = config.getVictimMotion(); Vector maxVictimMot = config.getMaxVictimMotion(); - double motX = Math.min((victimMot.x * victimMotFactor.getX()) + dx, maxVictimMot.getX()); - double motY = Math.min((victimMot.y * victimMotFactor.getY()) + dy, maxVictimMot.getY()); - double motZ = Math.min((victimMot.z * victimMotFactor.getZ()) + dz, maxVictimMot.getZ()); + double motX = Math.min((victimMot.getX() * victimMotFactor.getX()) + dv.getX(), maxVictimMot.getX()); + double motY = Math.min((victimMot.getY() * victimMotFactor.getY()) + dv.getY(), maxVictimMot.getY()); + double motZ = Math.min((victimMot.getZ() * victimMotFactor.getZ()) + dv.getZ(), maxVictimMot.getZ()); Vec3D newVictimMot = new Vec3D(motX, motY, motZ); victim.setMot(newVictimMot); victimMot = newVictimMot; } else { victim.i( - (-MathHelper.sin(attacker.yaw * 0.017453292f) * knockbackLevel * 0.5f), + (-MathHelper.sin(attacker.getBukkitYaw() * 0.017453292f) * knockbackLevel * 0.5f), 0.1, - (MathHelper.cos(attacker.yaw * 0.017453292f) * knockbackLevel * 0.5f) + (MathHelper.cos(attacker.getBukkitYaw() * 0.017453292f) * knockbackLevel * 0.5f) ); } } @@ -212,32 +204,32 @@ public static void attack(EntityHuman attacker, Entity victim) { if (shouldSweep && config.isSweepEnabled()) { float f4 = 1.0F + EnchantmentManager.a((EntityLiving) attacker) * damage; - List list = attacker.world.a(EntityLiving.class, victim.getBoundingBox().grow(1.0D, 0.25D, 1.0D)); + List list = attacker.getWorld().a(EntityLiving.class, victim.getBoundingBox().grow(1.0D, 0.25D, 1.0D)); Iterator iterator = list.iterator(); while (iterator.hasNext()) { EntityLiving entityliving = (EntityLiving) iterator.next(); - if (entityliving != attacker && entityliving != victim && !attacker.r(entityliving) && (!(entityliving instanceof EntityArmorStand) || !((EntityArmorStand) entityliving).isMarker()) && attacker.h(entityliving) < 9.0D) { + if (entityliving != attacker && entityliving != victim && !attacker.r(entityliving) && (!(entityliving instanceof EntityArmorStand) || !((EntityArmorStand) entityliving).isMarker()) && attacker.f(entityliving) < 9.0D) { // CraftBukkit start - Only apply knockback if the damage hits if (entityliving.damageEntity(DamageSource.playerAttack(attacker).sweep(), f4)) { - entityliving.a(0.4F, (double) MathHelper.sin(attacker.yaw * 0.017453292F), (double) (-MathHelper.cos(attacker.yaw * 0.017453292F))); + entityliving.a(0.4F, (double) MathHelper.sin(attacker.getBukkitYaw() * 0.017453292F), (double) (-MathHelper.cos(attacker.getBukkitYaw() * 0.017453292F))); } // CraftBukkit end } } - attacker.world.playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.ENTITY_PLAYER_ATTACK_SWEEP, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility - attacker.ex(); + attacker.getWorld().playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.on, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility + attacker.fg(); } - if (victim instanceof EntityPlayer && victim.velocityChanged) { + if (victim instanceof EntityPlayer && victim.C) { boolean cancelled = false; Player player = (Player) victim.getBukkitEntity(); Vector velocity = CraftVector.toBukkit(victimMot); PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone()); - world.getServer().getPluginManager().callEvent(event); + world.getCraftServer().getPluginManager().callEvent(event); if (event.isCancelled()) { cancelled = true; @@ -246,8 +238,8 @@ public static void attack(EntityHuman attacker, Entity victim) { } if (!cancelled) { - ((EntityPlayer) victim).playerConnection.sendPacket(new PacketPlayOutEntityVelocity(victim)); - victim.velocityChanged = false; + ((EntityPlayer) victim).b.sendPacket(new PacketPlayOutEntityVelocity(victim)); + victim.C = false; victim.setMot(victimMot); } // CraftBukkit end @@ -256,16 +248,16 @@ public static void attack(EntityHuman attacker, Entity victim) { if (shouldCrit) { if (config.getCombatSounds().isCritEnabled()) { sendSoundEffect(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), - SoundEffects.ENTITY_PLAYER_ATTACK_CRIT, attacker.getSoundCategory(), 1.0F, 1.0F); + SoundEffects.oj, attacker.getSoundCategory(), 1.0F, 1.0F); } attacker.a(victim); } if (shouldCrit || shouldSweep) { if (shouldKnockback && config.getCombatSounds().isStrongEnabled()) { - attacker.world.playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.ENTITY_PLAYER_ATTACK_STRONG, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility + attacker.getWorld().playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.om, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility } else if (config.getCombatSounds().isWeakEnabled()) { - attacker.world.playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.ENTITY_PLAYER_ATTACK_WEAK, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility + attacker.getWorld().playSound(attacker, attacker.locX(), attacker.locY(), attacker.locZ(), SoundEffects.oo, attacker.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility } } @@ -273,7 +265,7 @@ public static void attack(EntityHuman attacker, Entity victim) { attacker.b(victim); } - attacker.z(victim); + attacker.x(victim); if (victim instanceof EntityLiving) { EnchantmentManager.a((EntityLiving) victim, (Entity) attacker); } @@ -283,20 +275,20 @@ public static void attack(EntityHuman attacker, Entity victim) { Object object = victim; if (victim instanceof EntityComplexPart) { - object = ((EntityComplexPart) victim).owner; + object = ((EntityComplexPart) victim).b; } - if (!attacker.world.isClientSide && !itemstack1.isEmpty() && object instanceof EntityLiving) { + if (!attacker.getWorld().isClientSide() && !itemstack1.isEmpty() && object instanceof EntityLiving) { itemstack1.a((EntityLiving) object, attacker); if (itemstack1.isEmpty()) { - attacker.a(EnumHand.MAIN_HAND, ItemStack.b); + attacker.a(EnumHand.a, ItemStack.b); } } if (victim instanceof EntityLiving) { float f5 = victimHealth - ((EntityLiving) victim).getHealth(); - attacker.a(StatisticList.DAMAGE_DEALT, Math.round(f5 * 10.0F)); + attacker.a(StatisticList.G, Math.round(f5 * 10.0F)); if (fireAspectEnchantmentLevel > 0) { // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(attacker.getBukkitEntity(), victim.getBukkitEntity(), fireAspectEnchantmentLevel * 4); @@ -311,7 +303,7 @@ public static void attack(EntityHuman attacker, Entity victim) { if (world instanceof WorldServer && f5 > 2.0F) { int k = (int) ((double) f5 * 0.5D); - ((WorldServer) world).a(Particles.DAMAGE_INDICATOR, victim.locX(), + ((WorldServer) world).a(Particles.i, victim.locX(), victim.locY() + (double) (victim.getHeight() * 0.5F), victim.locZ(), k, 0.1D, 0.0D, 0.1D, 0.2D); } diff --git a/src/main/java/com/github/maxopoly/finale/command/CardinalCommand.java b/src/main/java/com/github/maxopoly/finale/command/CardinalCommand.java index 370cc9b..c3ca0b5 100644 --- a/src/main/java/com/github/maxopoly/finale/command/CardinalCommand.java +++ b/src/main/java/com/github/maxopoly/finale/command/CardinalCommand.java @@ -1,30 +1,33 @@ package com.github.maxopoly.finale.command; -import java.util.Arrays; -import java.util.List; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; +import co.aikar.commands.annotation.Syntax; import org.bukkit.ChatColor; import org.bukkit.Location; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "cardinal") -public class CardinalCommand extends StandaloneCommand { +public class CardinalCommand extends BaseCommand { - @Override - public boolean execute(CommandSender commandSender, String[] args) { + @CommandAlias("cardinal") + @Syntax("[direction]") + @Description("Changes your direction into a cardinal direction") + @CommandCompletion("NORTH|EAST|SOUTH|WEST|UP|DOWN") + public void execute(Player commandSender, @Optional String targetDirection) { Player player = (Player) commandSender; Location currLocation = player.getLocation(); - if(args.length == 0){ + if(targetDirection == null){ double newYaw = Math.rint(currLocation.getYaw() / 45) * 45; player.teleport(new Location(player.getWorld(), currLocation.getX(), currLocation.getY(), currLocation.getZ(), (float) newYaw, currLocation.getPitch())); - return true; + return; } - String direction = args[0].toUpperCase(); + String direction = targetDirection.toUpperCase(); Location location = new Location(player.getWorld(), currLocation.getX(), currLocation.getY(), currLocation.getZ()); switch(direction){ @@ -48,15 +51,9 @@ public boolean execute(CommandSender commandSender, String[] args) { break; default: player.sendMessage(ChatColor.RED + "Cardinal direction required. You can also use degrees, or 'up' or 'down'. B"); - return true; + return; } player.teleport(location); - return true; - } - - @Override - public List tabComplete(CommandSender commandSender, String[] args) { - return doTabComplete(args[0], Arrays.asList("NORTH","WEST","EAST","SOUTH", "UP","DOWN"), false); } } diff --git a/src/main/java/com/github/maxopoly/finale/command/CombatConfigCommand.java b/src/main/java/com/github/maxopoly/finale/command/CombatConfigCommand.java index e8941be..04bbb2c 100644 --- a/src/main/java/com/github/maxopoly/finale/command/CombatConfigCommand.java +++ b/src/main/java/com/github/maxopoly/finale/command/CombatConfigCommand.java @@ -1,92 +1,75 @@ package com.github.maxopoly.finale.command; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.*; import com.github.maxopoly.finale.Finale; import com.github.maxopoly.finale.combat.CombatConfig; -import java.util.LinkedList; -import java.util.List; +import com.github.maxopoly.finale.misc.knockback.KnockbackConfig; +import com.github.maxopoly.finale.misc.knockback.KnockbackModifier; +import com.github.maxopoly.finale.misc.knockback.KnockbackType; import net.md_5.bungee.api.ChatColor; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.util.NumberConversions; import org.bukkit.util.Vector; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "combatconfig") -public class CombatConfigCommand extends StandaloneCommand { +@CommandAlias("combatconfig") +@CommandPermission("finale.cmv") +public class CombatConfigCommand extends BaseCommand { - @Override - public boolean execute(CommandSender arg0, String[] arg1) { - if (!(arg0 instanceof Player)) { - return true; - } - + @Default + @Subcommand("view") + @Description("View combat config values.") + public void view(Player sender) { CombatConfig cc = Finale.getPlugin().getManager().getCombatConfig(); - - if (arg1.length == 0) { - arg0.sendMessage(ChatColor.WHITE + "knockback: " + ChatColor.RED + cc.getKnockbackMultiplier()); - arg0.sendMessage(ChatColor.WHITE + "sprint: " + ChatColor.RED + cc.getSprintMultiplier()); - arg0.sendMessage(ChatColor.WHITE + "water: " + ChatColor.RED + cc.getWaterKnockbackMultiplier()); - arg0.sendMessage(ChatColor.WHITE + "air: " + ChatColor.RED + cc.getAirKnockbackMultiplier()); - arg0.sendMessage(ChatColor.WHITE + "victim: " + ChatColor.RED + cc.getVictimMotion()); - arg0.sendMessage(ChatColor.WHITE + "maxVictim: " + ChatColor.RED + cc.getMaxVictimMotion()); - arg0.sendMessage(ChatColor.WHITE + "attacker: " + ChatColor.RED + cc.getAttackerMotion()); - arg0.sendMessage(ChatColor.WHITE + "sprintReset: " + ChatColor.RED + cc.isSprintResetEnabled()); - arg0.sendMessage(ChatColor.WHITE + "noDamageTicks: " + ChatColor.RED + Finale.getPlugin().getManager().getInvulnerableTicks().get(DamageCause.ENTITY_ATTACK)); - return true; - } + sender.sendMessage(ChatColor.WHITE + "normal: "); + sender.sendMessage(ChatColor.WHITE + "• ground: " + ChatColor.RED + cc.getNormalConfig().getGroundModifier()); + sender.sendMessage(ChatColor.WHITE + "• air: " + ChatColor.RED + cc.getNormalConfig().getAirModifier()); + sender.sendMessage(ChatColor.WHITE + "• water: " + ChatColor.RED + cc.getNormalConfig().getWaterModifier()); + sender.sendMessage(ChatColor.WHITE + "sprint: "); + sender.sendMessage(ChatColor.WHITE + "• ground: " + ChatColor.RED + cc.getSprintConfig().getGroundModifier()); + sender.sendMessage(ChatColor.WHITE + "• air: " + ChatColor.RED + cc.getSprintConfig().getAirModifier()); + sender.sendMessage(ChatColor.WHITE + "• water: " + ChatColor.RED + cc.getSprintConfig().getWaterModifier()); + sender.sendMessage(ChatColor.WHITE + "victim: " + ChatColor.RED + cc.getVictimMotion()); + sender.sendMessage(ChatColor.WHITE + "maxVictim: " + ChatColor.RED + cc.getMaxVictimMotion()); + sender.sendMessage(ChatColor.WHITE + "attacker: " + ChatColor.RED + cc.getAttackerMotion()); + sender.sendMessage(ChatColor.WHITE + "sprintReset: " + ChatColor.RED + cc.isSprintResetEnabled()); + sender.sendMessage(ChatColor.WHITE + "noDamageTicks: " + ChatColor.RED + Finale.getPlugin().getManager().getInvulnerableTicks().get(DamageCause.ENTITY_ATTACK)); + } - if (arg1.length == 1 && arg1[0].equalsIgnoreCase("save")) { - cc.save(); - arg0.sendMessage(ChatColor.GREEN + "You have saved the combat config."); - return true; - } + @Subcommand("save") + @Description("Save combat config values.") + public void save(Player sender) { + CombatConfig cc = Finale.getPlugin().getManager().getCombatConfig(); + cc.save(); + sender.sendMessage(ChatColor.GREEN + "You have saved the combat config."); + } - if (arg1.length < 2) { - arg0.sendMessage(ChatColor.RED + "USAGE: /combatconfig "); - return true; - } - - String propName = arg1[0]; - String value = arg1[1]; - - if (propName.equalsIgnoreCase("sprintReset")) { + @Subcommand("set") + @Syntax(" |[velX] [velY] [velZ]") + @Description("Set regular combat config values.") + public void setNormal(Player sender, String property, String value, @Optional double velY, @Optional double velZ) { + CombatConfig cc = Finale.getPlugin().getManager().getCombatConfig(); + + if (property.equalsIgnoreCase("sprintReset")) { boolean sprintReset = value.equalsIgnoreCase("true"); cc.setSprintResetEnabled(sprintReset); - arg0.sendMessage(ChatColor.GREEN + "Set sprintReset to " + sprintReset); - return true; + sender.sendMessage(ChatColor.GREEN + "Set sprintReset to " + sprintReset); + return; } - if (propName.equalsIgnoreCase("noDamageTicks")) { + if (property.equalsIgnoreCase("noDamageTicks")) { int invulnTicks = NumberConversions.toInt(value); Finale.getPlugin().getManager().getInvulnerableTicks().put(DamageCause.ENTITY_ATTACK, invulnTicks); - arg0.sendMessage(ChatColor.GREEN + "Set noDamageTicks to " + invulnTicks); - return true; + sender.sendMessage(ChatColor.GREEN + "Set noDamageTicks to " + invulnTicks); + return; } - if (arg1.length < 4) { - arg0.sendMessage(ChatColor.RED + "USAGE: /combatconfig "); - return true; - } - - double x = NumberConversions.toDouble(arg1[1]); - double y = NumberConversions.toDouble(arg1[2]); - double z = NumberConversions.toDouble(arg1[3]); + double x = NumberConversions.toDouble(value); + double y = NumberConversions.toDouble(velY); + double z = NumberConversions.toDouble(velZ); Vector vec = new Vector(x, y, z); - switch(propName) { - case "knockback": - cc.setKnockbackMultiplier(vec); - break; - case "sprint": - cc.setSprintMultiplier(vec); - break; - case "water": - cc.setWaterKnockbackMultiplier(vec); - break; - case "air": - cc.setAirKnockbackMultiplier(vec); - break; + switch(property) { case "victim": cc.setVictimMotion(vec); break; @@ -97,14 +80,43 @@ public boolean execute(CommandSender arg0, String[] arg1) { cc.setAttackerMotion(vec); break; } - - arg0.sendMessage(ChatColor.GREEN + "Set " + propName + " to " + vec); - return true; + sender.sendMessage(ChatColor.GREEN + "Set " + property + " to " + vec); } - @Override - public List tabComplete(CommandSender arg0, String[] arg1) { - return new LinkedList<>(); - } + @Subcommand("modifier") + @Syntax(" ") + @Description("Modify knockback modifier combat config values.") + public void setModifier(Player sender, String config, String property, KnockbackType modifierType, @Optional double velX, @Optional double velY, @Optional double velZ) { + CombatConfig cc = Finale.getPlugin().getManager().getCombatConfig(); + config = config.toLowerCase(); + property = property.toLowerCase(); + + KnockbackConfig knockbackConfig; + switch (config) { + case "normal": + knockbackConfig = cc.getNormalConfig(); + break; + case "sprint": + knockbackConfig = cc.getSprintConfig(); + break; + default: + knockbackConfig = null; + break; + } + + KnockbackModifier modifier = new KnockbackModifier(modifierType, new Vector(velX, velY, velZ)); + switch(property) { + case "ground": + knockbackConfig.setGroundModifier(modifier); + break; + case "water": + knockbackConfig.setWaterModifier(modifier); + break; + case "air": + knockbackConfig.setAirModifier(modifier); + break; + } + sender.sendMessage(ChatColor.GREEN + "Set " + config + " " + property + " to " + modifier); + } } diff --git a/src/main/java/com/github/maxopoly/finale/command/GammaBrightCommand.java b/src/main/java/com/github/maxopoly/finale/command/GammaBrightCommand.java index 6529084..107cbd3 100644 --- a/src/main/java/com/github/maxopoly/finale/command/GammaBrightCommand.java +++ b/src/main/java/com/github/maxopoly/finale/command/GammaBrightCommand.java @@ -1,26 +1,17 @@ package com.github.maxopoly.finale.command; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import com.github.maxopoly.finale.Finale; -import java.util.Collections; -import java.util.List; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "gamma") -public class GammaBrightCommand extends StandaloneCommand { +public class GammaBrightCommand extends BaseCommand { - @Override - public boolean execute(CommandSender sender, String[] args) { + @CommandAlias("gamma") + @Description("Toggles night vision") + public void execute(Player sender) { Player p = (Player) sender; Finale.getPlugin().getSettingsManager().getGammaBrightSetting().toggleValue(p.getUniqueId()); - return true; } - - @Override - public List tabComplete(CommandSender sender, String[] args) { - return Collections.emptyList(); - } - } diff --git a/src/main/java/com/github/maxopoly/finale/command/ReloadFinaleCommand.java b/src/main/java/com/github/maxopoly/finale/command/ReloadFinaleCommand.java index 2421ccd..64b1219 100644 --- a/src/main/java/com/github/maxopoly/finale/command/ReloadFinaleCommand.java +++ b/src/main/java/com/github/maxopoly/finale/command/ReloadFinaleCommand.java @@ -1,26 +1,20 @@ package com.github.maxopoly.finale.command; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; import com.github.maxopoly.finale.Finale; -import java.util.LinkedList; -import java.util.List; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "finalereload") -public class ReloadFinaleCommand extends StandaloneCommand { +public class ReloadFinaleCommand extends BaseCommand { - @Override - public boolean execute(CommandSender arg0, String[] arg1) { + @CommandAlias("finalereload") + @CommandPermission("finale.op") + @Description("Reloads finale entirely") + public void execute(CommandSender sender) { Finale.getPlugin().reload(); - arg0.sendMessage(ChatColor.GREEN + "Reloaded Finale"); - return true; + sender.sendMessage(ChatColor.GREEN + "Reloaded Finale"); } - - @Override - public List tabComplete(CommandSender arg0, String[] arg1) { - return new LinkedList<>(); - } - } diff --git a/src/main/java/com/github/maxopoly/finale/command/ShowCpsCommand.java b/src/main/java/com/github/maxopoly/finale/command/ShowCpsCommand.java index 18386e0..3f20c39 100644 --- a/src/main/java/com/github/maxopoly/finale/command/ShowCpsCommand.java +++ b/src/main/java/com/github/maxopoly/finale/command/ShowCpsCommand.java @@ -1,26 +1,20 @@ package com.github.maxopoly.finale.command; +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.Description; import com.github.maxopoly.finale.Finale; import com.github.maxopoly.finale.combat.CPSHandler; -import java.util.LinkedList; -import java.util.List; import net.md_5.bungee.api.ChatColor; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import vg.civcraft.mc.civmodcore.command.CivCommand; -import vg.civcraft.mc.civmodcore.command.StandaloneCommand; -@CivCommand(id = "cps") -public class ShowCpsCommand extends StandaloneCommand { +public class ShowCpsCommand extends BaseCommand { + + @CommandAlias("cps") + @Description("Shows you how fast you are clicking per second.") + public void execute(Player sender) { + Player player = (Player) sender; - @Override - public boolean execute(CommandSender arg0, String[] arg1) { - if (!(arg0 instanceof Player)) { - return true; - } - - Player player = (Player) arg0; - CPSHandler cpsHandler = Finale.getPlugin().getManager().getCPSHandler(); if (cpsHandler.isShowingCPS(player)) { cpsHandler.hideCPS(player); @@ -29,12 +23,5 @@ public boolean execute(CommandSender arg0, String[] arg1) { cpsHandler.showCPS(player); player.sendMessage(ChatColor.GREEN + "You are now viewing your CPS!"); } - return true; } - - @Override - public List tabComplete(CommandSender arg0, String[] arg1) { - return new LinkedList<>(); - } - } diff --git a/src/main/java/com/github/maxopoly/finale/external/FinaleSettingManager.java b/src/main/java/com/github/maxopoly/finale/external/FinaleSettingManager.java index 52e7288..4453a65 100644 --- a/src/main/java/com/github/maxopoly/finale/external/FinaleSettingManager.java +++ b/src/main/java/com/github/maxopoly/finale/external/FinaleSettingManager.java @@ -4,12 +4,12 @@ import java.util.UUID; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; -import vg.civcraft.mc.civmodcore.playersettings.PlayerSettingAPI; -import vg.civcraft.mc.civmodcore.playersettings.gui.MenuSection; -import vg.civcraft.mc.civmodcore.playersettings.impl.BooleanSetting; -import vg.civcraft.mc.civmodcore.playersettings.impl.BoundedIntegerSetting; -import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; -import vg.civcraft.mc.civmodcore.playersettings.impl.IntegerSetting; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSettingAPI; +import vg.civcraft.mc.civmodcore.players.settings.gui.MenuSection; +import vg.civcraft.mc.civmodcore.players.settings.impl.BooleanSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.BoundedIntegerSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.DisplayLocationSetting; +import vg.civcraft.mc.civmodcore.players.settings.impl.IntegerSetting; public class FinaleSettingManager { diff --git a/src/main/java/com/github/maxopoly/finale/listeners/PearlCoolDownListener.java b/src/main/java/com/github/maxopoly/finale/listeners/PearlCoolDownListener.java index f27a380..4a739f6 100644 --- a/src/main/java/com/github/maxopoly/finale/listeners/PearlCoolDownListener.java +++ b/src/main/java/com/github/maxopoly/finale/listeners/PearlCoolDownListener.java @@ -14,12 +14,12 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.ProjectileLaunchEvent; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLine; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI; -import vg.civcraft.mc.civmodcore.scoreboard.side.CivScoreBoard; -import vg.civcraft.mc.civmodcore.scoreboard.side.ScoreBoardAPI; -import vg.civcraft.mc.civmodcore.util.cooldowns.ICoolDownHandler; -import vg.civcraft.mc.civmodcore.util.cooldowns.TickCoolDownHandler; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLine; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLineAPI; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.CivScoreBoard; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.ScoreBoardAPI; +import vg.civcraft.mc.civmodcore.utilities.cooldowns.ICoolDownHandler; +import vg.civcraft.mc.civmodcore.utilities.cooldowns.TickCoolDownHandler; public class PearlCoolDownListener implements Listener { diff --git a/src/main/java/com/github/maxopoly/finale/listeners/PlayerListener.java b/src/main/java/com/github/maxopoly/finale/listeners/PlayerListener.java index 81f3a09..e9d179a 100644 --- a/src/main/java/com/github/maxopoly/finale/listeners/PlayerListener.java +++ b/src/main/java/com/github/maxopoly/finale/listeners/PlayerListener.java @@ -6,6 +6,7 @@ import org.bukkit.ChatColor; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; @@ -78,7 +79,7 @@ public void healthRegen(EntityRegainHealthEvent e) { double maxHealth = p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); @SuppressWarnings("resource") - double spigotRegenExhaustion = ((org.bukkit.craftbukkit.v1_16_R3.CraftWorld) p + double spigotRegenExhaustion = ((CraftWorld) p .getWorld()).getHandle().spigotConfig.regenExhaustion; float newExhaustion = (float) (p.getExhaustion() - e.getAmount() * spigotRegenExhaustion); diff --git a/src/main/java/com/github/maxopoly/finale/misc/ItemUtil.java b/src/main/java/com/github/maxopoly/finale/misc/ItemUtil.java index 0e02e63..c1e3c93 100644 --- a/src/main/java/com/github/maxopoly/finale/misc/ItemUtil.java +++ b/src/main/java/com/github/maxopoly/finale/misc/ItemUtil.java @@ -5,14 +5,14 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import net.minecraft.server.v1_16_R3.NBTBase; -import net.minecraft.server.v1_16_R3.NBTTagCompound; -import net.minecraft.server.v1_16_R3.NBTTagDouble; -import net.minecraft.server.v1_16_R3.NBTTagInt; -import net.minecraft.server.v1_16_R3.NBTTagList; -import net.minecraft.server.v1_16_R3.NBTTagString; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagDouble; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; public class ItemUtil { @@ -94,15 +94,15 @@ public static boolean isArmour(ItemStack is) { } public static ItemStack newModifiers(ItemStack is) { - net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(is); + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(is); NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound(); compound.set("AttributeModifiers", new NBTTagList()); nmsStack.setTag(compound); return CraftItemStack.asBukkitCopy(nmsStack); } - public static net.minecraft.server.v1_16_R3.ItemStack getNMSStack(ItemStack is) { - net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(is); + public static net.minecraft.world.item.ItemStack getNMSStack(ItemStack is) { + net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(is); NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound(); if (!compound.hasKey("AttributeModifiers")) { compound.set("AttributeModifiers", new NBTTagList()); @@ -132,7 +132,7 @@ public static ItemStack setArmourKnockbackResistance(ItemStack is, double adjust } public static ItemStack modifyAttribute(ItemStack is, AttributeModifier attribute) { - net.minecraft.server.v1_16_R3.ItemStack nmsStack = getNMSStack(is); + net.minecraft.world.item.ItemStack nmsStack = getNMSStack(is); NBTTagCompound compound = nmsStack.getTag(); NBTTagList modifiers = compound.getList("AttributeModifiers", 10); // 10 for compound diff --git a/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackConfig.java b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackConfig.java new file mode 100644 index 0000000..94ca3e6 --- /dev/null +++ b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackConfig.java @@ -0,0 +1,47 @@ +package com.github.maxopoly.finale.misc.knockback; + +public class KnockbackConfig { + + private KnockbackModifier groundModifier; + private KnockbackModifier airModifier; + private KnockbackModifier waterModifier; + + public KnockbackConfig(KnockbackModifier groundModifier, KnockbackModifier airModifier, KnockbackModifier waterModifier) { + this.groundModifier = groundModifier; + this.airModifier = airModifier; + this.waterModifier = waterModifier; + } + + public KnockbackModifier getGroundModifier() { + return groundModifier; + } + + public void setGroundModifier(KnockbackModifier groundModifier) { + this.groundModifier = groundModifier; + } + + public KnockbackModifier getAirModifier() { + return airModifier; + } + + public void setAirModifier(KnockbackModifier airModifier) { + this.airModifier = airModifier; + } + + public KnockbackModifier getWaterModifier() { + return waterModifier; + } + + public void setWaterModifier(KnockbackModifier waterModifier) { + this.waterModifier = waterModifier; + } + + @Override + public String toString() { + return "KnockbackConfig{" + + "groundModifier=" + groundModifier + + ", airModifier=" + airModifier + + ", waterModifier=" + waterModifier + + '}'; + } +} diff --git a/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackModifier.java b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackModifier.java new file mode 100644 index 0000000..a8392d6 --- /dev/null +++ b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackModifier.java @@ -0,0 +1,40 @@ +package com.github.maxopoly.finale.misc.knockback; + +import org.bukkit.util.Vector; + +public class KnockbackModifier { + + public interface KnockbackLogic { + + Vector apply(Vector start, Vector current, Vector modifier); + + } + + private KnockbackType type; + private Vector modifier; + + public KnockbackModifier(KnockbackType type, Vector modifier) { + this.type = type; + this.modifier = modifier; + } + + public Vector modifyKnockback(Vector start, Vector knockback) { + return type.getModifierLogic().apply(start, knockback, modifier); + } + + public KnockbackType getType() { + return type; + } + + public Vector getModifier() { + return modifier; + } + + @Override + public String toString() { + return "KnockbackModifier{" + + "type=" + type + + ", modifier=" + modifier + + '}'; + } +} diff --git a/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackType.java b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackType.java new file mode 100644 index 0000000..584bd89 --- /dev/null +++ b/src/main/java/com/github/maxopoly/finale/misc/knockback/KnockbackType.java @@ -0,0 +1,28 @@ +package com.github.maxopoly.finale.misc.knockback; + +import org.bukkit.util.Vector; + +import java.util.function.BiFunction; + +public enum KnockbackType { + + DIRECT((start, knockback, modifier) -> { + return start.clone().multiply(modifier); + }), + ADD((start, knockback, modifier) -> { + return knockback.clone().add(start.clone().multiply(modifier)); + }), + MULTIPLY((start, knockback, modifier) -> { + return knockback.clone().multiply(modifier); + }); + + private KnockbackModifier.KnockbackLogic modifierLogic; + + KnockbackType(KnockbackModifier.KnockbackLogic modifierLogic) { + this.modifierLogic = modifierLogic; + } + + public KnockbackModifier.KnockbackLogic getModifierLogic() { + return modifierLogic; + } +} diff --git a/src/main/java/com/github/maxopoly/finale/overlay/ScoreboardHUD.java b/src/main/java/com/github/maxopoly/finale/overlay/ScoreboardHUD.java index 1999ac9..108bdc5 100644 --- a/src/main/java/com/github/maxopoly/finale/overlay/ScoreboardHUD.java +++ b/src/main/java/com/github/maxopoly/finale/overlay/ScoreboardHUD.java @@ -22,13 +22,13 @@ import org.bukkit.potion.PotionEffectType; import vg.civcraft.mc.civmodcore.inventory.items.ItemUtils; import vg.civcraft.mc.civmodcore.inventory.items.PotionUtils; -import vg.civcraft.mc.civmodcore.playersettings.PlayerSetting; -import vg.civcraft.mc.civmodcore.playersettings.SettingChangeListener; -import vg.civcraft.mc.civmodcore.playersettings.impl.DisplayLocationSetting; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLine; -import vg.civcraft.mc.civmodcore.scoreboard.bottom.BottomLineAPI; -import vg.civcraft.mc.civmodcore.scoreboard.side.CivScoreBoard; -import vg.civcraft.mc.civmodcore.scoreboard.side.ScoreBoardAPI; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLine; +import vg.civcraft.mc.civmodcore.players.scoreboard.bottom.BottomLineAPI; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.CivScoreBoard; +import vg.civcraft.mc.civmodcore.players.scoreboard.side.ScoreBoardAPI; +import vg.civcraft.mc.civmodcore.players.settings.PlayerSetting; +import vg.civcraft.mc.civmodcore.players.settings.SettingChangeListener; +import vg.civcraft.mc.civmodcore.players.settings.impl.DisplayLocationSetting; public class ScoreboardHUD implements Listener { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b75c720..59fc29e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -4,7 +4,7 @@ alterAttack: speed: 1024 #CombatTag player on login? ctpOnLogin: true - + cleanerCombat: maxReach: 6.0 cps: @@ -21,22 +21,38 @@ cleanerCombat: knockback: false crit: false knockbackLevelMultiplier: 0.6 # a constant to control the knockback sword level - sprintMultiplier: # modifies knockback if the attacker is sprinting. - x: 2.3 - y: 1.0 - z: 2.3 - knockbackMultiplier: # modifies knockback in general. - x: 1.2 - y: 0.9 - z: 1.2 - waterKnockbackMultiplier: # modifies knockback if the victim is in water. - x: 1.0 - y: 1.0 - z: 1.0 - airKnockbackMultiplier: # modifies knockback if the victim is in the air - x: 1.0 - y: 1.05 - z: 1.0 + normal: + groundModifier: # modifies knockback in general. + type: DIRECT # MULTIPLY or ADD or DIRECT + x: 0.625 + y: 0.5 + z: 0.625 + airModifier: # modifies knockback if the victim is in the air. + type: DIRECT # MULTIPLY or ADD or DIRECT + x: 0.625 + y: 0.5 + z: 0.625 + waterModifier: # modifies knockback if the victim is in water. + type: DIRECT # MULTIPLY or ADD or DIRECT + x: 0.625 + y: 0.5 + z: 0.625 + sprint: # modifies knockback if the attacker is sprinting. + groundModifier: # modifies knockback in general. + type: DIRECT # MULTIPLY or ADD or DIRECT + x: 1.0 + y: 0.6 + z: 1.0 + airModifier: # modifies knockback if the victim is in the air. + type: DIRECT + x: 1.0 + y: 0.6 + z: 1.0 + waterModifier: # modifies knockback if the victim is in water. + type: DIRECT + x: 1.0 + y: 0.6 + z: 1.0 attackerMotion: # modifies motion of attacker upon attacking. x: 0.6 y: 1.0 @@ -47,9 +63,9 @@ cleanerCombat: z: 0.5 maxVictimMotion: # maximum motion of victim upon getting hit. x: 10.0 - y: 0.3 + y: 10.0 z: 10.0 - + # gives full control over health / regen, default is full reversion to 1.8 mechanics foodHealthRegen: enabled: true @@ -61,13 +77,13 @@ foodHealthRegen: blockSaturationRegen: true # alters pearl cooldown using vanilla mechanism, optionally combattags on pearl (if combattagplus is available) pearls: -#Enable custom cooldown? + #Enable custom cooldown? enabled: true -#Custom pearl cooldown + #Custom pearl cooldown cooldown: 16s -#Combat tag using CTP when pearling? + #Combat tag using CTP when pearling? combatTag: true - + #allows adjusting the attack damage of any item by its spigot material identifier weaponModification: netheriteAxe: @@ -90,132 +106,132 @@ weaponModification: damage: 1 netheriteSword: material: NETHERITE_SWORD - damage: 7 + damage: 8 diamondSword: material: DIAMOND_SWORD - damage: 6 + damage: 7 ironSword: material: IRON_SWORD - damage: 5 + damage: 6 stoneSword: material: STONE_SWORD - damage: 4 + damage: 5 goldSword: material: GOLDEN_SWORD damage: 4 woodSword: material: WOODEN_SWORD damage: 3 - + armourModification: - diamondHelmet: - material: DIAMOND_HELMET - armour: 3 - toughness: 2 - extraDurabilityHits: 1 # how many extra hits a player needs to take for the durability of the piece to fall - diamondChestplate: - material: DIAMOND_CHESTPLATE - armour: 8 - toughness: 2 - extraDurabilityHits: 1 - diamondLeggings: - material: DIAMOND_LEGGINGS - armour: 6 - toughness: 2 - extraDurabilityHits: 1 - diamondBoots: - material: DIAMOND_BOOTS - armour: 3 - toughness: 2 - extraDurabilityHits: 1 - netheriteHelmet: - material: NETHERITE_HELMET - armour: 4 - toughness: 2 - extraDurabilityHits: 1 - knockbackResistance: 0 # knockback resistance is a value between 0 and 1. - netheriteChestplate: - material: NETHERITE_CHESTPLATE - armour: 8 - toughness: 2 - extraDurabilityHits: 1 - knockbackResistance: 0 - netheriteLeggings: - material: NETHERITE_LEGGINGS - armour: 6 - toughness: 2 - extraDurabilityHits: 1 - knockbackResistance: 0 - netheriteBoots: - material: NETHERITE_BOOTS - armour: 4 - toughness: 2 - extraDurabilityHits: 1 - knockbackResistance: 0 + diamondHelmet: + material: DIAMOND_HELMET + armour: 3 + toughness: 2 + extraDurabilityHits: 1 # how many extra hits a player needs to take for the durability of the piece to fall + diamondChestplate: + material: DIAMOND_CHESTPLATE + armour: 8 + toughness: 2 + extraDurabilityHits: 1 + diamondLeggings: + material: DIAMOND_LEGGINGS + armour: 6 + toughness: 2 + extraDurabilityHits: 1 + diamondBoots: + material: DIAMOND_BOOTS + armour: 3 + toughness: 2 + extraDurabilityHits: 1 + netheriteHelmet: + material: NETHERITE_HELMET + armour: 4 + toughness: 3 + extraDurabilityHits: 1 + knockbackResistance: 0 # knockback resistance is a value between 0 and 1. + netheriteChestplate: + material: NETHERITE_CHESTPLATE + armour: 8 + toughness: 3 + extraDurabilityHits: 1 + knockbackResistance: 0 + netheriteLeggings: + material: NETHERITE_LEGGINGS + armour: 6 + toughness: 3 + extraDurabilityHits: 1 + knockbackResistance: 0 + netheriteBoots: + material: NETHERITE_BOOTS + armour: 4 + toughness: 3 + extraDurabilityHits: 1 + knockbackResistance: 0 #allows disabling enchantments. Use official spigot identifiers from https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html #This will not remove them from enchanting, but simply remove the enchant as soon as the item is touched disabledEnchantments: - - MENDING - - FROST_WALKER - + - MENDING + - FROST_WALKER + potions: -#Allows applying a multiplier to the intensity of potions. Intensities <= 1.0 will always work fine, but intensities > 1 -#may lead to unintended results for instant effects like INSTANT_HEALTH. -#All entries may have the following entries: -# type: -# A potion type (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionType.html) -# upgraded: -# Boolean to specify whether the pot is upgraded (tier 2) -# extended: -# Boolean to specify whether the pot is extended -# splash: -# Boolean to specify whether the pot is splash -# multiplier: -# Double value, the multiplier applied to the duration. May not be negative and defaults to 1.0 + #Allows applying a multiplier to the intensity of potions. Intensities <= 1.0 will always work fine, but intensities > 1 + #may lead to unintended results for instant effects like INSTANT_HEALTH. + #All entries may have the following entries: + # type: + # A potion type (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionType.html) + # upgraded: + # Boolean to specify whether the pot is upgraded (tier 2) + # extended: + # Boolean to specify whether the pot is extended + # splash: + # Boolean to specify whether the pot is splash + # multiplier: + # Double value, the multiplier applied to the duration. May not be negative and defaults to 1.0 -# --- -#All values specifying the kind of option are optional and will wildcard if not specified, for example: + # --- + #All values specifying the kind of option are optional and will wildcard if not specified, for example: -#An entry applying to all extended splash potions: -# splash: -# splash: true -# extended: true -# multiplier: 0.8 + #An entry applying to all extended splash potions: + # splash: + # splash: true + # extended: true + # multiplier: 0.8 -#Or one applying only to speed 8, both splash&drinkable -# speed8: -# type: SPEED -# extended: true -# multiplier: 0.8 + #Or one applying only to speed 8, both splash&drinkable + # speed8: + # type: SPEED + # extended: true + # multiplier: 0.8 potIntensity: splash: -#All splash pots reduced + #All splash pots reduced splash: true multiplier: 1.0 -#Except for health + #Except for health health: type: INSTANT_HEAL multiplier: 1.0 -#Multiplier applied to the health gain from all health potions + #Multiplier applied to the health gain from all health potions healthMultiplier: 1.5 minIntensityCutOff: 0.3 # minimum intensity for non-thrower to steal some health effect. minIntensityImpact: 0.5 # minimum intensity for thrower to get full health effect. - + velocity: -#In newer Minecraft versions when a player launches a projectile the players velocity will be added to the projectiles base velocity. This can lead to -#weird behavior sometimes and reverted with this setting. Add entity types (https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html) -#of projectiles to the list to revert their behavior regarding initial velocity to 1.7 + #In newer Minecraft versions when a player launches a projectile the players velocity will be added to the projectiles base velocity. This can lead to + #weird behavior sometimes and reverted with this setting. Add entity types (https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html) + #of projectiles to the list to revert their behavior regarding initial velocity to 1.7 ENDER_PEARL: - type: REVERTED - power: 1.4 + type: REVERTED + power: 1.4 SPLASH_POTION: - type: REVERTED - power: 0.5 - vertical: 0.4 - horizontal: 0.4 - pitchOffset: -20 - + type: REVERTED + power: 0.5 + vertical: 0.4 + horizontal: 0.4 + pitchOffset: -20 + #This option allows modifying the damage dealt by/to players based on certain properties. All entries look like this: # SWORD: @@ -230,12 +246,12 @@ velocity: #The order in which modifiers are applied is: ALL, ARROW, POWER_ENCHANT, STRENGTH_EFFECT, SWORD, SHARPNESS_ENCHANT, CRIT #Note that these effects are applied after vanilla damage additions and before vanilla damage reductions -damageModifiers: -#Decrease all damage by 20 % +damageModifiers: + #Decrease all damage by 20 % ALL: - multiplier: 0.6 + multiplier: 0.8 mode: DIRECT -#Increase sword damage by 25 % + #Increase sword damage by 25 % SHARPNESS_ENCHANT: multiplier: 1.0 mode: DIRECT @@ -248,7 +264,7 @@ damageModifiers: STRENGTH_EFFECT: mode: DIRECT multiplier: 0.8 - + invulTicksEnabled: false invulnerableTicks: POISON: 1 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 832200d..631cd43 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,21 +4,7 @@ author: Maxopoly version: ${project.version} depend: [CivModCore, ProtocolLib] softdepend: [CombatTagPlus] -api-version: 1.13 -commands: - finalereload: - permission: finale.op - aliases: [reloadfinale] - cps: - description: Show CPS. - permission: finale.cps - combatconfig: - description: View/modify combat config values. - permission: finale.cmv - gamma: - description: Toggles night vision - cardinal: - description: Changes your direction into a cardinal direction +api-version: 1.17 permissions: finale.op: default: op