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