code refactoring

This commit is contained in:
unurled 2024-03-18 22:01:16 +01:00
parent 456df87c33
commit 9105d31a02
Signed by: unurled
GPG key ID: FDBC9CBE1F82423F
9 changed files with 652 additions and 542 deletions

View file

@ -10,6 +10,7 @@ import me.unurled.sacredrealms.sr.components.attributes.Attribute;
import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.PlayerManager;
import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.components.player.SRPlayer;
import me.unurled.sacredrealms.sr.gui.attributes.AttributesGUI; import me.unurled.sacredrealms.sr.gui.attributes.AttributesGUI;
import me.unurled.sacredrealms.sr.managers.Manager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -26,7 +27,7 @@ public class AttributeCommand implements TabExecutor {
@Nullable @Nullable
private static SRPlayer getSrPlayer(@NotNull CommandSender sender, Player target) { private static SRPlayer getSrPlayer(@NotNull CommandSender sender, Player target) {
PlayerManager pm = PlayerManager.getInstance(PlayerManager.class); PlayerManager pm = Manager.getInstance(PlayerManager.class);
if (pm == null) { if (pm == null) {
sender.sendMessage(comp("<red>An error occurred.")); sender.sendMessage(comp("<red>An error occurred."));
return null; return null;
@ -39,21 +40,20 @@ public class AttributeCommand implements TabExecutor {
return player; return player;
} }
private static boolean remove(@NotNull CommandSender sender, Player target, Attribute attribute) { private static void remove(@NotNull CommandSender sender, Player target, Attribute attribute) {
SRPlayer player = getSrPlayer(sender, target); SRPlayer player = getSrPlayer(sender, target);
if (player == null) return true; if (player == null) return;
player.removeAttribute(attribute); player.removeAttribute(attribute);
player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand()); player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand());
syncSRToPlayer(player, target); syncSRToPlayer(player, target);
sender.sendMessage("Removed " + attribute.getName() + FOR + target.getName()); sender.sendMessage("Removed " + attribute.getName() + FOR + target.getName());
PlayerManager pm = PlayerManager.getInstance(PlayerManager.class); PlayerManager pm = Manager.getInstance(PlayerManager.class);
pm.savePlayer(player); pm.savePlayer(player);
return false;
} }
private static boolean get(@NotNull CommandSender sender, Player target, Attribute attribute) { private static void get(@NotNull CommandSender sender, Player target, Attribute attribute) {
SRPlayer player = getSrPlayer(sender, target); SRPlayer player = getSrPlayer(sender, target);
if (player == null) return true; if (player == null) return;
sender.sendMessage( sender.sendMessage(
"Get " "Get "
+ attribute.getName() + attribute.getName()
@ -61,10 +61,9 @@ public class AttributeCommand implements TabExecutor {
+ target.getName() + target.getName()
+ ": " + ": "
+ player.getAttribute(attribute)); + player.getAttribute(attribute));
return false;
} }
private static boolean set( private static void set(
@NotNull CommandSender sender, @NotNull CommandSender sender,
@NotNull String @NotNull [] args, @NotNull String @NotNull [] args,
Attribute attribute, Attribute attribute,
@ -77,40 +76,38 @@ public class AttributeCommand implements TabExecutor {
+ attribute.getMinValue() + attribute.getMinValue()
+ ", Max: " + ", Max: "
+ attribute.getMaxValue()); + attribute.getMaxValue());
return true; return;
} }
SRPlayer player = getSrPlayer(sender, target); SRPlayer player = getSrPlayer(sender, target);
if (player == null) return true; if (player == null) return;
player.setAttribute(attribute, value); player.setAttribute(attribute, value);
sender.sendMessage("Set " + attribute.getName() + " to " + value + FOR + target.getName()); sender.sendMessage("Set " + attribute.getName() + " to " + value + FOR + target.getName());
player.setItemAttributes(attribute, target.getInventory().getItemInMainHand(), value); player.setItemAttributes(attribute, target.getInventory().getItemInMainHand(), value);
syncSRToPlayer(player, target); syncSRToPlayer(player, target);
PlayerManager pm = PlayerManager.getInstance(PlayerManager.class); PlayerManager pm = Manager.getInstance(PlayerManager.class);
pm.savePlayer(player); pm.savePlayer(player);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
sender.sendMessage("Invalid value."); sender.sendMessage("Invalid value.");
} }
return false;
} }
private static boolean itemInHand( private static void itemInHand(@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
if (!(sender instanceof Player target)) { if (!(sender instanceof Player target)) {
sender.sendMessage("You must be a player to use this command."); sender.sendMessage("You must be a player to use this command.");
return true; return;
} }
Attribute attribute; Attribute attribute;
try { try {
attribute = Attribute.valueOf(args[2].toUpperCase()); attribute = Attribute.valueOf(args[2].toUpperCase());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
sender.sendMessage("Attribute not found."); sender.sendMessage("Attribute not found.");
return true; return;
} }
if (args[0].equalsIgnoreCase("set")) { if (args[0].equalsIgnoreCase("set")) {
try { try {
Result result = getResult(sender, args, target, attribute); Result result = getResult(sender, args, target, attribute);
if (result == null) return true; if (result == null) return;
result.player().setHandItemAttribute(attribute, result.value()); result.player().setHandItemAttribute(attribute, result.value());
sender.sendMessage( sender.sendMessage(
"Set " + attribute.getName() + " to " + result.value() + FOR + target.getName()); "Set " + attribute.getName() + " to " + result.value() + FOR + target.getName());
@ -125,7 +122,7 @@ public class AttributeCommand implements TabExecutor {
} }
} else if (args[0].equalsIgnoreCase("get")) { } else if (args[0].equalsIgnoreCase("get")) {
SRPlayer player = getSrPlayer(sender, target); SRPlayer player = getSrPlayer(sender, target);
if (player == null) return true; if (player == null) return;
sender.sendMessage( sender.sendMessage(
"Get " "Get "
+ attribute.getName() + attribute.getName()
@ -136,7 +133,7 @@ public class AttributeCommand implements TabExecutor {
+ player.getHandItemAttribute(attribute)); + player.getHandItemAttribute(attribute));
} else if (args[0].equalsIgnoreCase(REMOVE)) { } else if (args[0].equalsIgnoreCase(REMOVE)) {
SRPlayer player = getSrPlayer(sender, target); SRPlayer player = getSrPlayer(sender, target);
if (player == null) return true; if (player == null) return;
player.removeHandItemAttribute(attribute); player.removeHandItemAttribute(attribute);
player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand()); player.removeItemAttributes(attribute, target.getInventory().getItemInMainHand());
@ -144,23 +141,22 @@ public class AttributeCommand implements TabExecutor {
} else { } else {
sender.sendMessage("Usage: /attribute <set|get|remove> <player> <attribute> [value]"); sender.sendMessage("Usage: /attribute <set|get|remove> <player> <attribute> [value]");
} }
return true;
} }
private static boolean gui(@NotNull CommandSender sender, @NotNull String @NotNull [] args) { private static void gui(@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
// open gui // open gui
if (args.length != 2) { if (args.length != 2) {
sender.sendMessage("Usage: /attribute gui <player>"); sender.sendMessage("Usage: /attribute gui <player>");
return true; return;
} }
if (!(sender instanceof Player p)) { if (!(sender instanceof Player p)) {
sender.sendMessage("You must be a player to use this command."); sender.sendMessage("You must be a player to use this command.");
return true; return;
} }
Player target = Bukkit.getPlayer(args[1]); Player target = Bukkit.getPlayer(args[1]);
if (target == null) { if (target == null) {
sender.sendMessage("Player not found."); sender.sendMessage("Player not found.");
return true; return;
} }
Window window = Window window =
Window.single() Window.single()
@ -169,8 +165,6 @@ public class AttributeCommand implements TabExecutor {
.setGui(AttributesGUI.createGui(target)) .setGui(AttributesGUI.createGui(target))
.build(); .build();
window.open(); window.open();
return true;
} }
@Nullable @Nullable
@ -225,10 +219,12 @@ public class AttributeCommand implements TabExecutor {
return true; return true;
} }
if (args[0].equals("gui")) { if (args[0].equals("gui")) {
return gui(sender, args); gui(sender, args);
return true;
} }
if (args[1].equals("item-in-hand")) { if (args[1].equals("item-in-hand")) {
return itemInHand(sender, args); itemInHand(sender, args);
return true;
} }
Player target = Bukkit.getPlayer(args[1]); Player target = Bukkit.getPlayer(args[1]);
if (target == null) { if (target == null) {
@ -244,13 +240,16 @@ public class AttributeCommand implements TabExecutor {
return true; return true;
} }
if (args[0].equalsIgnoreCase("set") && (set(sender, args, attribute, target))) { if (args[0].equalsIgnoreCase("set")) {
set(sender, args, attribute, target);
return true; return true;
} }
if (args[0].equalsIgnoreCase("get") && (get(sender, target, attribute))) { if (args[0].equalsIgnoreCase("get")) {
get(sender, target, attribute);
return true; return true;
} }
if (args[0].equalsIgnoreCase(REMOVE) && (remove(sender, target, attribute))) { if (args[0].equalsIgnoreCase(REMOVE)) {
remove(sender, target, attribute);
return true; return true;
} }

View file

@ -218,7 +218,7 @@ public class ClientBuildCommand implements TabExecutor, Listener {
public void onBlockPlace(@NotNull BlockPlaceEvent e) { public void onBlockPlace(@NotNull BlockPlaceEvent e) {
Player p = e.getPlayer(); Player p = e.getPlayer();
if (manager == null) { if (manager == null) {
manager = ClientBuildManager.getInstance(ClientBuildManager.class); manager = Manager.getInstance(ClientBuildManager.class);
} }
if (manager.hasTemporaryBlocks(p)) { if (manager.hasTemporaryBlocks(p)) {
log("block placed " + e.getBlock().getType()); log("block placed " + e.getBlock().getType());
@ -237,7 +237,7 @@ public class ClientBuildCommand implements TabExecutor, Listener {
public void onBlockBreak(@NotNull BlockBreakEvent e) { public void onBlockBreak(@NotNull BlockBreakEvent e) {
Player p = e.getPlayer(); Player p = e.getPlayer();
if (manager == null) { if (manager == null) {
manager = ClientBuildManager.getInstance(ClientBuildManager.class); manager = Manager.getInstance(ClientBuildManager.class);
} }
if (manager.hasTemporaryBlocks(p)) { if (manager.hasTemporaryBlocks(p)) {
manager.getTemporaryBlocks(p).remove(e.getBlock().getLocation()); manager.getTemporaryBlocks(p).remove(e.getBlock().getLocation());
@ -275,11 +275,10 @@ public class ClientBuildCommand implements TabExecutor, Listener {
|| args[0].equalsIgnoreCase(DISPLAY))) { || args[0].equalsIgnoreCase(DISPLAY))) {
ClientBuildManager clientBuildManager = Manager.getInstance(ClientBuildManager.class); ClientBuildManager clientBuildManager = Manager.getInstance(ClientBuildManager.class);
List<String> buildNames = clientBuildManager.getBuildNames(); List<String> buildNames = clientBuildManager.getBuildNames();
if (nameCompletions.isEmpty() || !new HashSet<>(nameCompletions).containsAll(buildNames)) { if (nameCompletions.isEmpty() || !new HashSet<>(nameCompletions).containsAll(buildNames)) {
nameCompletions = buildNames; nameCompletions = buildNames;
} }
return nameCompletions; return nameCompletions;
} }
return null; return null;
} }

View file

@ -8,6 +8,7 @@ import java.util.List;
import me.unurled.sacredrealms.sr.components.entity.EntityManager; import me.unurled.sacredrealms.sr.components.entity.EntityManager;
import me.unurled.sacredrealms.sr.components.entity.SREntityType; import me.unurled.sacredrealms.sr.components.entity.SREntityType;
import me.unurled.sacredrealms.sr.gui.entitytype.EntityTypeGUI; import me.unurled.sacredrealms.sr.gui.entitytype.EntityTypeGUI;
import me.unurled.sacredrealms.sr.managers.Manager;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
@ -40,7 +41,7 @@ public class EntityTypeCommand implements TabExecutor {
return true; return true;
} }
if (args.length < 3) { if (args.length < 3) {
EntityManager em = EntityManager.getInstance(EntityManager.class); EntityManager em = Manager.getInstance(EntityManager.class);
if (!em.getTypes().stream().map(SREntityType::getID).toList().contains(args[1])) { if (!em.getTypes().stream().map(SREntityType::getID).toList().contains(args[1])) {
sender.sendMessage("Invalid entity type."); sender.sendMessage("Invalid entity type.");
return true; return true;
@ -66,7 +67,7 @@ public class EntityTypeCommand implements TabExecutor {
} }
try { try {
EntityType type = EntityType.valueOf(args[4]); EntityType type = EntityType.valueOf(args[4]);
EntityManager em = EntityManager.getInstance(EntityManager.class); EntityManager em = Manager.getInstance(EntityManager.class);
if (setType(sender, args, em, type)) return true; if (setType(sender, args, em, type)) return true;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
sender.sendMessage("Invalid entity type."); sender.sendMessage("Invalid entity type.");
@ -179,12 +180,12 @@ public class EntityTypeCommand implements TabExecutor {
return List.of("create", "delete", "edit", "list"); return List.of("create", "delete", "edit", "list");
} }
if (args.length == 2) { if (args.length == 2) {
return EntityManager.getInstance(EntityManager.class).getTypes().stream() return Manager.getInstance(EntityManager.class).getTypes().stream()
.map(SREntityType::getID) .map(SREntityType::getID)
.toList(); .toList();
} }
if (args.length == 3 && (args[0].equalsIgnoreCase("edit"))) { if (args.length == 3 && (args[0].equalsIgnoreCase("edit"))) {
return List.of("type", "behavior", "loot", "item", "stats", "name", "level"); return List.of("type", "behavior", "loot", "item", "stats", "name", "level");
} }
if (args.length == 4 if (args.length == 4
&& (args[0].equalsIgnoreCase("edit") && (args[2].equalsIgnoreCase("type")))) { && (args[0].equalsIgnoreCase("edit") && (args[2].equalsIgnoreCase("type")))) {

View file

@ -10,6 +10,7 @@ import me.unurled.sacredrealms.sr.components.item.Item;
import me.unurled.sacredrealms.sr.components.item.ItemManager; import me.unurled.sacredrealms.sr.components.item.ItemManager;
import me.unurled.sacredrealms.sr.components.item.ItemType; import me.unurled.sacredrealms.sr.components.item.ItemType;
import me.unurled.sacredrealms.sr.components.item.Rarity; import me.unurled.sacredrealms.sr.components.item.Rarity;
import me.unurled.sacredrealms.sr.managers.Manager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -21,6 +22,369 @@ import org.jetbrains.annotations.Nullable;
public class ItemCommand implements TabExecutor { public class ItemCommand implements TabExecutor {
public static final String DELETE = "delete";
public static final String DOES_NOT_EXIST = "<red>An item with that ID does not exist.";
public static final String MODIFY = "modify";
public static final String MATERIAL = "material";
public static final String ENCHANTMENTS = "enchantments";
public static final String ATTRIBUTES = "attributes";
public static final String ABILITIES = "abilities";
public static final String CUSTOMMODELDATA = "custommodeldata";
public static final String RARITY = "rarity";
public static final String REMOVE = "remove";
public static final String USAGE =
"Usage: /item modify <id> <name|material|enchantments|attributes|abilities|custommodeldata|rarity|type|description> [value]";
private static void modify(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p) {
if (args.length < 2) {
p.sendMessage(USAGE);
return;
}
ItemManager im = Manager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
sender.sendMessage(comp(DOES_NOT_EXIST));
return;
}
Item item = im.getItem(args[1]);
if (args.length == 2) {
p.sendMessage(USAGE);
return;
}
switch (args[2].toLowerCase()) {
case "name" -> modifyName(sender, args, p, item);
case MATERIAL -> modifyMaterial(sender, args, p, item);
case ENCHANTMENTS -> modifyEnchantments(args, p);
case ATTRIBUTES -> modifyAttributes(sender, args, p, item);
case ABILITIES -> modifyAbilities(sender, args, p);
case CUSTOMMODELDATA -> modifyModelData(sender, args, p, item);
case RARITY -> modifyRarity(sender, args, p, item);
case "type" -> modifyType(sender, args, p, item);
case "description" -> modifyDescription(sender, args, p, item);
default -> p.sendMessage(USAGE);
}
}
private static void modifyDescription(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> description <value>");
return;
}
String description = String.join(" ", Arrays.copyOfRange(args, 3, args.length));
item.setDescription(description);
sender.sendMessage(comp("<green>Description set."));
}
private static void modifyType(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> type <value>");
return;
}
ItemType type;
try {
type = ItemType.valueOf(args[3]);
} catch (Exception e) {
sender.sendMessage(comp("<red>Type not found."));
return;
}
item.setType(type);
sender.sendMessage(comp("<green>Type set."));
}
private static void modifyRarity(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> rarity <value>");
return;
}
Rarity rarity;
try {
rarity = Rarity.valueOf(args[3]);
} catch (Exception e) {
sender.sendMessage(comp("<red>Rarity not found."));
return;
}
item.setRarity(rarity);
sender.sendMessage(comp("<green>Rarity set."));
}
private static void modifyModelData(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> custommodeldata <value>");
return;
}
int customModelData;
try {
customModelData = Integer.parseInt(args[3]);
} catch (NumberFormatException e) {
sender.sendMessage(comp("<red>Invalid value."));
return;
}
item.setCustomModelData(customModelData);
sender.sendMessage(comp("<green>Custom model data set."));
}
private static void modifyAbilities(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> abilities add <ability>");
return;
}
if (args[3].equalsIgnoreCase("add")) {
p.sendMessage("Abilities not working for now.");
// TODO: add ability
} else if (args[3].equalsIgnoreCase(REMOVE)) {
sender.sendMessage("Abilities not working for now.");
// TODO: remove ability
}
}
private static void modifyName(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> name <value>");
return;
}
String name = String.join(" ", Arrays.copyOfRange(args, 3, args.length));
item.setName(name);
sender.sendMessage(comp("<green>Item name set."));
// TODO: update item in player inventory
}
private static void modifyMaterial(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> material <value>");
return;
}
Material material = Material.matchMaterial(args[3]);
if (material == null) {
sender.sendMessage(comp("<red>Material not found."));
return;
}
item.setMaterial(material);
sender.sendMessage(comp("<green>Item material set."));
}
private static void modifyEnchantments(@NotNull String @NotNull [] args, Player p) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> enchantments <add|remove> [enchantment]");
return;
}
if (args[3].equalsIgnoreCase("add")) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> enchantments add <enchantment>");
return;
}
// TODO: add enchantment
p.sendMessage("Enchantments not working for now.");
return;
}
if (args[3].equalsIgnoreCase(REMOVE)) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> enchantments remove <enchantment>");
return;
}
// TODO: remove enchantment
p.sendMessage("Enchantments not working for now.");
}
}
private static void modifyAttributes(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p, Item item) {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> attributes <add|remove> [attribute] [value]");
return;
}
if (args[3].equalsIgnoreCase("add")) {
if (args.length < 6) {
p.sendMessage("Usage: /item modify <id> attributes add <attribute> <value>");
return;
}
Attribute attribute = null;
try {
attribute = Attribute.valueOf(args[4]);
} catch (Exception e) {
sender.sendMessage(comp("<red>Attribute not found."));
error("Error on attribute affectation on item: " + args[1] + "\n" + e);
return;
}
double value;
try {
value = Double.parseDouble(args[5]);
} catch (NumberFormatException e) {
sender.sendMessage(comp("<red>Invalid value."));
return;
}
item.addAttribute(attribute, value);
sender.sendMessage(comp("<green>Attribute added."));
return;
}
if (args[3].equalsIgnoreCase(REMOVE)) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> attributes remove <attribute>");
return;
}
Attribute attribute = null;
try {
attribute = Attribute.valueOf(args[4]);
} catch (Exception e) {
sender.sendMessage(comp("<red>Attribute not found."));
error("Error on attribute affectation on item: " + args[1] + "\n" + e);
return;
}
item.removeAttribute(attribute);
sender.sendMessage(comp("<green>Attribute removed."));
}
}
private static void give(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p) {
if (args.length < 2) {
sender.sendMessage("Usage: /item give <id>");
return;
}
ItemManager im = Manager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
sender.sendMessage(comp(DOES_NOT_EXIST));
return;
}
Item item = im.getItem(args[1]);
if (args.length == 2) {
p.getInventory().addItem(item.toItemStack());
sender.sendMessage(comp("<green>Item given."));
return;
}
Player target = Bukkit.getPlayer(args[2]);
if (target == null) {
sender.sendMessage(comp("<red>Player not found."));
return;
}
target.getInventory().addItem(item.toItemStack());
sender.sendMessage(comp("<green>Item given."));
}
private static void delete(
@NotNull CommandSender sender, @NotNull String @NotNull [] args, Player p) {
if (args.length < 2) {
p.sendMessage("Usage: /item delete <id>");
return;
}
ItemManager im = Manager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
sender.sendMessage(comp(DOES_NOT_EXIST));
return;
}
im.removeItem(args[1]);
sender.sendMessage(comp("<green>Item deleted."));
}
private static void create(@NotNull CommandSender sender, @NotNull String @NotNull [] args) {
if (args.length < 2) {
sender.sendMessage("Usage: /item create <id>");
return;
}
ItemManager im = Manager.getInstance(ItemManager.class);
if (im.getItemIDs().contains(args[1])) {
sender.sendMessage(comp("<red>An item with that ID already exists."));
return;
}
Item item = new Item();
item.setID(args[1]);
im.addItem(item);
sender.sendMessage(
comp(
"<green>Item created. You can now modify it using "
+ "<click:suggest_command:/item "
+ "modify "
+ args[1]
+ "> /item modify "
+ args[1]
+ "</click>"));
}
private static void list(@NotNull CommandSender sender, Player p) {
ItemManager im = Manager.getInstance(ItemManager.class);
if (im.getItemIDs().isEmpty()) {
sender.sendMessage(comp("<red>There are no items."));
return;
}
sender.sendMessage("Items:");
im.getItemIDs().forEach(p::sendMessage);
}
@Nullable
private static List<String> modify(@NotNull String @NotNull [] args) {
if (args.length == 5 && (args[0].equalsIgnoreCase(MODIFY))) {
// TODO: Enchantments in completion
/*if (args[2].equalsIgnoreCase("enchantments")) {
return Arrays.stream(Enchantment.values()).map(Enum::name).toList();
} else*/ if (args[2].equalsIgnoreCase(ATTRIBUTES)) {
return Arrays.stream(Attribute.values()).map(Enum::name).toList();
}
}
return null;
}
@Nullable
private static List<String> modifyCompletion(@NotNull String @NotNull [] args) {
if (args.length == 4 && (args[0].equalsIgnoreCase(MODIFY))) {
if (args[2].equalsIgnoreCase(RARITY)) {
return Arrays.stream(Rarity.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase("type")) {
return Arrays.stream(ItemType.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase(MATERIAL)) {
return Arrays.stream(Material.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase(ENCHANTMENTS)) {
return List.of("add", REMOVE);
} else if (args[2].equalsIgnoreCase(ATTRIBUTES)) {
return List.of("add", REMOVE);
} else if (args[2].equalsIgnoreCase(ABILITIES)) {
return List.of("add", REMOVE);
} else if (args[2].equalsIgnoreCase(CUSTOMMODELDATA)) {
try {
Integer.parseInt(args[3]);
} catch (NumberFormatException e) {
return List.of("1");
}
}
}
return null;
}
@Nullable
private static List<String> argsLengthThree(@NotNull String @NotNull [] args) {
if (args.length == 3) {
if (args[0].equalsIgnoreCase(MODIFY)) {
return List.of(
"name",
MATERIAL,
ENCHANTMENTS,
ATTRIBUTES,
ABILITIES,
CUSTOMMODELDATA,
RARITY,
"type",
"description");
} else if (args[0].equalsIgnoreCase("give")) {
return Bukkit.getOnlinePlayers().stream().map(Player::getName).toList();
}
}
return null;
}
/** /**
* Executes the given command, returning its success. <br> * Executes the given command, returning its success. <br>
* If false is returned, then the "usage" plugin.yml entry for this command (if defined) will be * If false is returned, then the "usage" plugin.yml entry for this command (if defined) will be
@ -54,279 +418,28 @@ public class ItemCommand implements TabExecutor {
} }
if (args[0].equalsIgnoreCase("list")) { if (args[0].equalsIgnoreCase("list")) {
ItemManager im = ItemManager.getInstance(ItemManager.class); list(sender, p);
if (im.getItemIDs().isEmpty()) {
p.sendMessage(comp("<red>There are no items."));
return true;
}
p.sendMessage("Items:");
im.getItemIDs().forEach(p::sendMessage);
return true; return true;
} }
if (args[0].equalsIgnoreCase("create")) { if (args[0].equalsIgnoreCase("create")) {
if (args.length < 2) { create(sender, args);
p.sendMessage("Usage: /item create <id>");
return true;
}
ItemManager im = ItemManager.getInstance(ItemManager.class);
if (im.getItemIDs().contains(args[1])) {
p.sendMessage(comp("<red>An item with that ID already exists."));
return true;
}
Item item = new Item();
item.setID(args[1]);
im.addItem(item);
p.sendMessage(
comp(
"<green>Item created. You can now modify it using "
+ "<click:suggest_command:/item "
+ "modify "
+ args[1]
+ "> /item modify "
+ args[1]
+ "</click>"));
return true; return true;
} }
if (args[0].equalsIgnoreCase("delete")) { if (args[0].equalsIgnoreCase(DELETE)) {
if (args.length < 2) { delete(sender, args, p);
p.sendMessage("Usage: /item delete <id>");
return true;
}
ItemManager im = ItemManager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
p.sendMessage(comp("<red>An item with that ID does not exist."));
return true;
}
im.removeItem(args[1]);
p.sendMessage(comp("<green>Item deleted."));
return true; return true;
} }
if (args[0].equalsIgnoreCase("give")) { if (args[0].equalsIgnoreCase("give")) {
if (args.length < 2) { give(sender, args, p);
p.sendMessage("Usage: /item give <id>");
return true;
}
ItemManager im = ItemManager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
p.sendMessage(comp("<red>An item with that ID does not exist."));
return true;
}
Item item = im.getItem(args[1]);
if (args.length == 2) {
p.getInventory().addItem(item.toItemStack());
p.sendMessage(comp("<green>Item given."));
return true;
}
Player target = Bukkit.getPlayer(args[2]);
if (target == null) {
p.sendMessage(comp("<red>Player not found."));
return true;
}
target.getInventory().addItem(item.toItemStack());
p.sendMessage(comp("<green>Item given."));
return true; return true;
} }
if (args[0].equalsIgnoreCase("modify")) { if (args[0].equalsIgnoreCase(MODIFY)) {
if (args.length < 2) { modify(sender, args, p);
p.sendMessage( return true;
"Usage: /item modify <id> <name|material|enchantments|attributes|abilities|custommodeldata|rarity|type|description> [value]");
return true;
}
ItemManager im = ItemManager.getInstance(ItemManager.class);
if (!im.getItemIDs().contains(args[1])) {
p.sendMessage(comp("<red>An item with that ID does not exist."));
return true;
}
Item item = im.getItem(args[1]);
if (args.length == 2) {
p.sendMessage(
"Usage: /item modify <id> <name|material|enchantments|attributes|abilities|custommodeldata|rarity|type|description> [value]");
return true;
}
switch (args[2].toLowerCase()) {
case "name" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> name <value>");
return true;
}
String name = String.join(" ", Arrays.copyOfRange(args, 3, args.length));
item.setName(name);
p.sendMessage(comp("<green>Item name set."));
// TODO: update item in player inventory
return true;
}
case "material" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> material <value>");
return true;
}
Material material = Material.matchMaterial(args[3]);
if (material == null) {
p.sendMessage(comp("<red>Material not found."));
return true;
}
item.setMaterial(material);
p.sendMessage(comp("<green>Item material set."));
}
case "enchantments" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> enchantments <add|remove> [enchantment]");
return true;
}
if (args[3].equalsIgnoreCase("add")) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> enchantments add <enchantment>");
return true;
}
// TODO: add enchantment
p.sendMessage("Enchantments not working for now.");
return true;
}
if (args[3].equalsIgnoreCase("remove")) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> enchantments remove <enchantment>");
return true;
}
// TODO: remove enchantment
p.sendMessage("Enchantments not working for now.");
return true;
}
}
case "attributes" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> attributes <add|remove> [attribute] [value]");
return true;
}
if (args[3].equalsIgnoreCase("add")) {
if (args.length < 6) {
p.sendMessage("Usage: /item modify <id> attributes add <attribute> <value>");
return true;
}
Attribute attribute = null;
try {
attribute = Attribute.valueOf(args[4]);
} catch (Exception e) {
p.sendMessage(comp("<red>Attribute not found."));
error("Error on attribute affectation on item: " + args[1] + "\n" + e);
return true;
}
double value;
try {
value = Double.parseDouble(args[5]);
} catch (NumberFormatException e) {
p.sendMessage(comp("<red>Invalid value."));
return true;
}
item.addAttribute(attribute, value);
p.sendMessage(comp("<green>Attribute added."));
return true;
}
if (args[3].equalsIgnoreCase("remove")) {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> attributes remove <attribute>");
return true;
}
Attribute attribute = null;
try {
attribute = Attribute.valueOf(args[4]);
} catch (Exception e) {
p.sendMessage(comp("<red>Attribute not found."));
error("Error on attribute affectation on item: " + args[1] + "\n" + e);
return true;
}
item.removeAttribute(attribute);
p.sendMessage(comp("<green>Attribute removed."));
return true;
}
return true;
}
case "abilities" -> {
if (args.length < 5) {
p.sendMessage("Usage: /item modify <id> abilities add <ability>");
return true;
}
if (args[3].equalsIgnoreCase("add")) {
p.sendMessage("Abilities not working for now.");
// TODO: add ability
} else if (args[3].equalsIgnoreCase("remove")) {
p.sendMessage("Abilities not working for now.");
// TODO: remove ability
}
return true;
}
case "custommodeldata" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> custommodeldata <value>");
return true;
}
int customModelData;
try {
customModelData = Integer.parseInt(args[3]);
} catch (NumberFormatException e) {
p.sendMessage(comp("<red>Invalid value."));
return true;
}
item.setCustomModelData(customModelData);
p.sendMessage(comp("<green>Custom model data set."));
return true;
}
case "rarity" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> rarity <value>");
return true;
}
Rarity rarity;
try {
rarity = Rarity.valueOf(args[3]);
} catch (Exception e) {
p.sendMessage(comp("<red>Rarity not found."));
return true;
}
item.setRarity(rarity);
p.sendMessage(comp("<green>Rarity set."));
return true;
}
case "type" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> type <value>");
return true;
}
ItemType type;
try {
type = ItemType.valueOf(args[3]);
} catch (Exception e) {
p.sendMessage(comp("<red>Type not found."));
return true;
}
item.setType(type);
p.sendMessage(comp("<green>Type set."));
return true;
}
case "description" -> {
if (args.length < 4) {
p.sendMessage("Usage: /item modify <id> description <value>");
return true;
}
String description = String.join(" ", Arrays.copyOfRange(args, 3, args.length));
item.setDescription(description);
p.sendMessage(comp("<green>Description set."));
return true;
}
}
} }
return true; return true;
@ -355,78 +468,33 @@ public class ItemCommand implements TabExecutor {
} }
if (args.length == 1) { if (args.length == 1) {
return List.of("list", "create", "delete", "give", "modify"); return List.of("list", "create", DELETE, "give", MODIFY);
} }
if (args.length == 2) { if (args.length == 2
if (args[0].equalsIgnoreCase("delete") && (args[0].equalsIgnoreCase(DELETE)
|| args[0].equalsIgnoreCase("give") || args[0].equalsIgnoreCase("give")
|| args[0].equalsIgnoreCase("modify")) { || args[0].equalsIgnoreCase(MODIFY))) {
ItemManager im = ItemManager.getInstance(ItemManager.class); ItemManager im = Manager.getInstance(ItemManager.class);
return im.getItemIDs(); return im.getItemIDs();
}
} }
if (args.length == 3) { List<String> completions = argsLengthThree(args);
if (args[0].equalsIgnoreCase("modify")) { if (completions != null) return completions;
return List.of(
"name",
"material",
"enchantments",
"attributes",
"abilities",
"custommodeldata",
"rarity",
"type",
"description");
} else if (args[0].equalsIgnoreCase("give")) {
return Bukkit.getOnlinePlayers().stream().map(Player::getName).toList();
}
}
if (args.length == 4) { completions = modifyCompletion(args);
if (args[0].equalsIgnoreCase("modify")) { if (completions != null) return completions;
if (args[2].equalsIgnoreCase("rarity")) {
return Arrays.stream(Rarity.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase("type")) {
return Arrays.stream(ItemType.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase("material")) {
return Arrays.stream(Material.values()).map(Enum::name).toList();
} else if (args[2].equalsIgnoreCase("enchantments")) {
return List.of("add", "remove");
} else if (args[2].equalsIgnoreCase("abilities")) {
return List.of("add", "remove");
} else if (args[2].equalsIgnoreCase("attributes")) {
return List.of("add", "remove");
} else if (args[2].equalsIgnoreCase("custommodeldata")) {
try {
Integer.parseInt(args[3]);
} catch (NumberFormatException e) {
return List.of("1");
}
}
}
}
if (args.length == 5) { completions = modify(args);
if (args[0].equalsIgnoreCase("modify")) { if (completions != null) return completions;
/*if (args[2].equalsIgnoreCase("enchantments")) { // TODO: Enchantments in completion
return Arrays.stream(Enchantment.values()).map(Enum::name).toList();
} else*/ if (args[2].equalsIgnoreCase("attributes")) {
return Arrays.stream(Attribute.values()).map(Enum::name).toList();
}
}
}
if (args.length == 6) { if (args.length == 6
if (args[0].equalsIgnoreCase("modify")) { && (args[0].equalsIgnoreCase(MODIFY))
if (args[2].equalsIgnoreCase("attributes")) { && (args[2].equalsIgnoreCase(ATTRIBUTES))) {
try { try {
Double.parseDouble(args[5]); Double.parseDouble(args[5]);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
return List.of("1.0"); return List.of("1.0");
}
}
} }
} }

View file

@ -3,6 +3,7 @@ package me.unurled.sacredrealms.sr.commands.admin;
import java.util.List; import java.util.List;
import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.PlayerManager;
import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.components.player.SRPlayer;
import me.unurled.sacredrealms.sr.managers.Manager;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
@ -46,7 +47,7 @@ public class LevelCommand implements TabExecutor {
return true; return true;
} }
PlayerManager pm = PlayerManager.getInstance(PlayerManager.class); PlayerManager pm = Manager.getInstance(PlayerManager.class);
SRPlayer player = pm.getPlayer(target.getUniqueId()); SRPlayer player = pm.getPlayer(target.getUniqueId());
if (player != null) { if (player != null) {

View file

@ -9,6 +9,7 @@ import java.util.Objects;
import me.unurled.sacredrealms.sr.SR; import me.unurled.sacredrealms.sr.SR;
import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.PlayerManager;
import me.unurled.sacredrealms.sr.data.DataManager; import me.unurled.sacredrealms.sr.data.DataManager;
import me.unurled.sacredrealms.sr.managers.Manager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -42,29 +43,7 @@ public class ResetAdventureCommand implements TabExecutor {
@NotNull String label, @NotNull String label,
@NotNull String[] args) { @NotNull String[] args) {
if (sender.hasPermission("sr.resetadventure")) { if (sender.hasPermission("sr.resetadventure")) {
if (args.length > 2) { reset(sender, args);
sender.sendMessage(comp("<red>Usage: /resetadventure <player>"));
return true;
}
if (sender instanceof Player p) {
if (args.length == 0) {
boolean status = resetAdventure(p);
if (status) {
p.sendMessage(comp("<green>Your adventure has been reset."));
} else {
p.sendMessage(comp("<red>Failed to reset your adventure."));
}
return true;
}
}
OfflinePlayer player = SR.getInstance().getServer().getOfflinePlayer(args[0]);
boolean status = resetAdventure(player);
if (status) {
sender.sendMessage(comp("<green>Successfully reset " + player.getName() + "'s adventure."));
} else {
sender.sendMessage(comp("<red>Failed to reset " + player.getName() + "'s adventure."));
}
return true; return true;
} }
if (args.length > 0) { if (args.length > 0) {
@ -76,7 +55,7 @@ public class ResetAdventureCommand implements TabExecutor {
long lastUsed = cooldowns.get(player); long lastUsed = cooldowns.get(player);
long secondsLeft = ((lastUsed / 1000) + COOLDOWN) - (System.currentTimeMillis() / 1000); long secondsLeft = ((lastUsed / 1000) + COOLDOWN) - (System.currentTimeMillis() / 1000);
if (secondsLeft > 0) { if (secondsLeft > 0) {
player.sendMessage( sender.sendMessage(
comp( comp(
"<red>You must wait " "<red>You must wait "
+ secondsLeft + secondsLeft
@ -86,17 +65,41 @@ public class ResetAdventureCommand implements TabExecutor {
} }
boolean status = resetAdventure(player); boolean status = resetAdventure(player);
if (status) { if (status) {
player.sendMessage(comp("<green>Your adventure has been reset.")); sender.sendMessage(comp("<green>Your adventure has been reset."));
} else { } else {
player.sendMessage(comp("<red>Failed to reset your adventure.")); sender.sendMessage(comp("<red>Failed to reset your adventure."));
} }
cooldowns.put(player, System.currentTimeMillis()); cooldowns.put(player, System.currentTimeMillis());
} }
return true; return true;
} }
private void reset(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length > 2) {
sender.sendMessage(comp("<red>Usage: /resetadventure <player>"));
return;
}
if (sender instanceof Player p && (args.length == 0)) {
boolean status = resetAdventure(p);
if (status) {
sender.sendMessage(comp("<green>Your adventure has been reset."));
} else {
sender.sendMessage(comp("<red>Failed to reset your adventure."));
}
return;
}
OfflinePlayer player = SR.getInstance().getServer().getOfflinePlayer(args[0]);
boolean status = resetAdventure(player);
if (status) {
sender.sendMessage(comp("<green>Successfully reset " + player.getName() + "'s adventure."));
} else {
sender.sendMessage(comp("<red>Failed to reset " + player.getName() + "'s adventure."));
}
}
private boolean resetAdventure(OfflinePlayer player) { private boolean resetAdventure(OfflinePlayer player) {
DataManager dataManager = DataManager.getInstance(DataManager.class); DataManager dataManager = Manager.getInstance(DataManager.class);
if (dataManager != null) { if (dataManager != null) {
if (dataManager.getDataHandler().exists(PlayerManager.PLAYER_KEY + player.getUniqueId())) { if (dataManager.getDataHandler().exists(PlayerManager.PLAYER_KEY + player.getUniqueId())) {
dataManager.getDataHandler().remove(PlayerManager.PLAYER_KEY + player.getUniqueId()); dataManager.getDataHandler().remove(PlayerManager.PLAYER_KEY + player.getUniqueId());

View file

@ -29,6 +29,7 @@ import org.jetbrains.annotations.Nullable;
public class ClientBuildManager extends Manager { public class ClientBuildManager extends Manager {
public static final String SR_PLAYERS_CLIENTBUILD = "sr.players.clientbuild.";
private final List<ClientBuild> builds = new ArrayList<>(); private final List<ClientBuild> builds = new ArrayList<>();
/** a map of players that have ClientBuild displayed */ /** a map of players that have ClientBuild displayed */
@ -54,7 +55,7 @@ public class ClientBuildManager extends Manager {
public void saveData() { public void saveData() {
// save client side builds to redis // save client side builds to redis
DataManager dataManager = DataManager.getInstance(DataManager.class); DataManager dataManager = Manager.getInstance(DataManager.class);
DataHandler dh = dataManager.getDataHandler(); DataHandler dh = dataManager.getDataHandler();
Gson gson = Gson gson =
@ -69,7 +70,7 @@ public class ClientBuildManager extends Manager {
for (Entry<Player, List<String>> entry : playerBlocks.entrySet()) { for (Entry<Player, List<String>> entry : playerBlocks.entrySet()) {
for (String name : entry.getValue()) { for (String name : entry.getValue()) {
// save for player // save for player
dh.set("sr.players.clientbuild." + entry.getKey().getUniqueId() + "." + name, "true"); dh.set(SR_PLAYERS_CLIENTBUILD + entry.getKey().getUniqueId() + "." + name, "true");
} }
} }
} }
@ -78,7 +79,7 @@ public class ClientBuildManager extends Manager {
@Override @Override
public void loadData() { public void loadData() {
// load client side builds from redis // load client side builds from redis
DataManager dataManager = DataManager.getInstance(DataManager.class); DataManager dataManager = Manager.getInstance(DataManager.class);
DataHandler dh = dataManager.getDataHandler(); DataHandler dh = dataManager.getDataHandler();
if (dh == null) { if (dh == null) {
@ -107,11 +108,10 @@ public class ClientBuildManager extends Manager {
@EventHandler @EventHandler
public void onPlayerJoin(@NotNull PlayerJoinEvent e) { public void onPlayerJoin(@NotNull PlayerJoinEvent e) {
DataHandler dh = DataManager.getInstance(DataManager.class).getDataHandler(); DataHandler dh = Manager.getInstance(DataManager.class).getDataHandler();
Player p = e.getPlayer(); Player p = e.getPlayer();
List<String> names = List<String> names = new ArrayList<>(dh.getKeysAll(SR_PLAYERS_CLIENTBUILD + p.getUniqueId()));
new ArrayList<>(dh.getKeysAll("sr.players.clientbuild." + p.getUniqueId()));
playerBlocks.put(p, names); playerBlocks.put(p, names);
@ -144,13 +144,13 @@ public class ClientBuildManager extends Manager {
// save the player's displayed builds // save the player's displayed builds
DataManager dataManager = DataManager.getInstance(DataManager.class); DataManager dataManager = Manager.getInstance(DataManager.class);
DataHandler dh = dataManager.getDataHandler(); DataHandler dh = dataManager.getDataHandler();
dh.remove("sr.players.clientbuild." + p.getUniqueId()); dh.remove(SR_PLAYERS_CLIENTBUILD + p.getUniqueId());
for (String name : names) { for (String name : names) {
dh.set("sr.players.clientbuild." + p.getUniqueId() + "." + name, "true"); dh.set(SR_PLAYERS_CLIENTBUILD + p.getUniqueId() + "." + name, "true");
} }
playerBlocks.get(p).clear(); playerBlocks.get(p).clear();

View file

@ -26,7 +26,6 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.EntityEquipment;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@SuppressWarnings("EmptyMethod")
public class CombatManager extends Manager { public class CombatManager extends Manager {
public static final Random RANDOM = new Random(); public static final Random RANDOM = new Random();
@ -41,6 +40,66 @@ public class CombatManager extends Manager {
e.setCancelled(true); e.setCancelled(true);
} }
private static void playerVictim(
@NotNull EntityDamageByEntityEvent e, Player player, Mob mob, PlayerManager pm) {
// get equipment of damager
EntityEquipment equipment = mob.getEquipment();
Double dStrength = Items.getTotalAttribute(equipment, Attribute.STRENGTH);
Double eDefense = Items.getTotalAttribute(player, Attribute.DEFENSE);
double damage = dStrength - eDefense;
Double dLuck = Items.getTotalAttribute(equipment, Attribute.LUCK);
Double eLuck = Items.getTotalAttribute(player, Attribute.LUCK);
double luck = dLuck - eLuck;
if (luck < -1000) {
// 100% chance of miss
player.sendMessage(player.identity(), comp("<red>You dodged!"));
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
return;
} else if (luck > 1000) {
// 100% chance of critical hit
luck = 10000d;
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
damage = damage * 2;
}
if (luck < 0) {
// chances of miss
if (RANDOM.nextBoolean()) {
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
player.sendMessage(comp("<red>You dodged!"));
return;
}
} else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
// chance of critical hit
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
// damage * 2
damage = damage * 2;
}
// apply damage
player.damage(damage);
// add an
SRPlayer player1 = pm.getPlayer(player.getUniqueId());
if (player1 != null) {
player1.setHealth(player.getHealth() - damage, DamageCause.ENTITY_ATTACK);
if (player1.getHealth() <= 0) {
player.damage(player.getHealth());
}
updateActionBar(player, player1);
}
spawnIndicator(player, false, damage);
// TODO: check for status effects (apply status effects depending item of damager)
}
// TODO: Finish this // TODO: Finish this
@EventHandler @EventHandler
public void onDamage(@NotNull EntityDamageByEntityEvent e) { public void onDamage(@NotNull EntityDamageByEntityEvent e) {
@ -56,156 +115,124 @@ public class CombatManager extends Manager {
} }
if (damager instanceof Player d) { if (damager instanceof Player d) {
if (entity instanceof Player) { playerDamager(e, entity, d, pm);
// no pvp return;
}
if (entity instanceof Player player && damager instanceof Mob mob) {
playerVictim(e, player, mob, pm);
}
}
private void playerDamager(
@NotNull EntityDamageByEntityEvent e, LivingEntity entity, Player d, PlayerManager pm) {
if (entity instanceof Player) {
// no pvp
e.setCancelled(true);
d.sendMessage(comp("<red>You can't attack players!"));
d.playSound(d, Sound.BLOCK_ANVIL_HIT, 1.0f, 1.0f);
return;
}
if (entity instanceof Mob mob) {
isMob(e, entity, d, pm, mob);
}
}
private void isMob(
@NotNull EntityDamageByEntityEvent e,
LivingEntity entity,
Player d,
PlayerManager pm,
Mob mob) {
double dStrength = Items.getTotalAttribute(d, Attribute.STRENGTH);
SRPlayer player = pm.getPlayer(d.getUniqueId());
if (player != null) {
dStrength += player.getAttribute(Attribute.STRENGTH);
}
EntityEquipment equipment = mob.getEquipment();
double eDefense = Items.getTotalAttribute(equipment, Attribute.DEFENSE);
double damage = dStrength - eDefense;
Double dLuck = Items.getTotalAttribute(d, Attribute.LUCK);
Double eLuck = Items.getTotalAttribute(equipment, Attribute.LUCK);
double luck = dLuck - eLuck;
if (luck < -1000) {
// 100% chance of miss
d.sendMessage(comp("<red>You missed!"));
d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
return;
} else if (luck > 1000) {
// 100% chance of critical hit
luck = 10000d;
d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
damage = damage * 2;
}
if (luck < 0) {
// chances of miss
if (RANDOM.nextBoolean()) {
d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true); e.setCancelled(true);
d.sendMessage(comp("<red>You can't attack players!")); d.sendMessage(comp("<red>You missed!"));
d.playSound(d, Sound.BLOCK_ANVIL_HIT, 1.0f, 1.0f);
return; return;
} }
if (entity instanceof Mob mob) { } else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
double dStrength = Items.getTotalAttribute(d, Attribute.STRENGTH); // chance of critical hit
SRPlayer player = pm.getPlayer(d.getUniqueId()); d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
if (player != null) { // damage * 2
dStrength += player.getAttribute(Attribute.STRENGTH); damage = damage * 2;
} }
EntityEquipment equipment = mob.getEquipment(); // apply damage
double eDefense = Items.getTotalAttribute(equipment, Attribute.DEFENSE);
Double damage = dStrength - eDefense; historyHandler(entity, d, damage);
entity.damage(damage);
Double dLuck = Items.getTotalAttribute(d, Attribute.LUCK); EntityManager em = EntityManager.getInstance(EntityManager.class);
Double eLuck = Items.getTotalAttribute(equipment, Attribute.LUCK); SREntity ent = em.getEntity(entity.getUniqueId());
double luck = dLuck - eLuck; if (entity.getHealth() <= 0) {
if (luck < -1000) { die(entity, d, pm, ent);
// 100% chance of miss return;
d.sendMessage(comp("<red>You missed!")); }
d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
return;
} else if (luck > 1000) {
// 100% chance of critical hit
luck = 10000d;
d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
damage = damage * 2;
}
if (luck < 0) { spawnIndicator(entity, false, damage);
// chances of miss // TODO: check for status effects (apply status effects depending item of damager)
if (RANDOM.nextBoolean()) { }
d.playSound(d, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
d.sendMessage(comp("<red>You missed!"));
return;
}
} else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
// chance of critical hit
d.playSound(d, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
// damage * 2
damage = damage * 2;
}
// apply damage
if (historyMobDamage.containsKey(entity.getUniqueId())) { private void die(LivingEntity entity, Player d, PlayerManager pm, SREntity ent) {
HashMap<Player, Double> history = // entity is dead, give experience to player
historyMobDamage.getOrDefault(entity.getUniqueId(), new HashMap<>()); SRPlayer player1 = pm.getPlayer(d.getUniqueId());
if (history.containsKey(d)) { if (player1 != null && ent != null) {
history.put(d, history.get(d) + damage); // calculate experience % based on damage
} else { HashMap<Player, Double> playerDoubleHashMap = historyMobDamage.get(entity.getUniqueId());
history.put(d, damage); if (playerDoubleHashMap == null) {
}
} else {
HashMap<Player, Double> history = new HashMap<>();
history.put(d, damage);
historyMobDamage.put(entity.getUniqueId(), history);
}
entity.damage(damage);
EntityManager em = EntityManager.getInstance(EntityManager.class);
SREntity ent = em.getEntity(entity.getUniqueId());
if (entity.getHealth() <= 0) {
// entity is dead, give experience to player
SRPlayer player1 = pm.getPlayer(d.getUniqueId());
if (player1 != null && ent != null) {
// calculate experience % based on damage
HashMap<Player, Double> playerDoubleHashMap =
historyMobDamage.get(entity.getUniqueId());
if (playerDoubleHashMap == null) {
return;
}
for (Entry<Player, Double> map : playerDoubleHashMap.entrySet()) {
Double exp = ent.getExperience() * (map.getValue() / ent.getHealth());
SRPlayer tmp = pm.getPlayer(map.getKey().getUniqueId());
if (tmp != null) {
tmp.setExperience((long) (tmp.getExperience() + exp));
}
}
}
}
spawnIndicator(entity, false, damage);
// TODO: check for status effects (apply status effects depending item of damager)
}
} else if (entity instanceof Player player && damager instanceof Mob mob) {
// damager is not player
// get equipment of damager
EntityEquipment equipment = mob.getEquipment();
Double dStrength = Items.getTotalAttribute(equipment, Attribute.STRENGTH);
Double eDefense = Items.getTotalAttribute(player, Attribute.DEFENSE);
double damage = dStrength - eDefense;
Double dLuck = Items.getTotalAttribute(equipment, Attribute.LUCK);
Double eLuck = Items.getTotalAttribute(player, Attribute.LUCK);
double luck = dLuck - eLuck;
if (luck < -1000) {
// 100% chance of miss
player.sendMessage(comp("<red>You dodged!"));
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f);
e.setCancelled(true);
return; return;
} else if (luck > 1000) {
// 100% chance of critical hit
luck = 10000d;
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
damage = damage * 2;
} }
for (Entry<Player, Double> map : playerDoubleHashMap.entrySet()) {
if (luck < 0) { Double exp = ent.getExperience() * (map.getValue() / ent.getHealth());
// chances of miss SRPlayer tmp = pm.getPlayer(map.getKey().getUniqueId());
if (RANDOM.nextBoolean()) { if (tmp != null) {
player.playSound(player, Sound.ENTITY_ARROW_SHOOT, 1.0f, 1.0f); tmp.setExperience((long) (tmp.getExperience() + exp));
e.setCancelled(true);
player.sendMessage(comp("<red>You dodged!"));
return;
} }
} else if (luck > 0 && luck < 1000 && RANDOM.nextBoolean()) {
// chance of critical hit
player.playSound(player, Sound.ENTITY_PLAYER_ATTACK_CRIT, 1.0f, 1.0f);
// damage * 2
damage = damage * 2;
} }
}
}
// apply damage private void historyHandler(LivingEntity entity, Player d, Double damage) {
player.damage(damage); if (historyMobDamage.containsKey(entity.getUniqueId())) {
// add an HashMap<Player, Double> history =
historyMobDamage.getOrDefault(entity.getUniqueId(), new HashMap<>());
SRPlayer player1 = pm.getPlayer(player.getUniqueId()); if (history.containsKey(d)) {
if (player1 != null) { history.put(d, history.get(d) + damage);
player1.setHealth(player.getHealth() - damage, DamageCause.ENTITY_ATTACK); } else {
if (player1.getHealth() <= 0) { history.put(d, damage);
player.damage(player.getHealth());
}
updateActionBar(player, player1);
} }
} else {
spawnIndicator(player, false, damage); HashMap<Player, Double> history = new HashMap<>();
history.put(d, damage);
// TODO: check for status effects (apply status effects depending item of damager) historyMobDamage.put(entity.getUniqueId(), history);
} }
} }
} }

View file

@ -1,16 +1,28 @@
package me.unurled.sacredrealms.sr.utils; package me.unurled.sacredrealms.sr.utils;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class Component { public class Component {
public static final String NOT_PLAYER = "<red>You must be a player to use this command."; public static final String NOT_PLAYER = "<red>You must be a player to use this command.";
public static final String NO_PERMISSION = "<red>You do not have permission to use this command.";
private static MiniMessage miniMessage;
private Component() {} private Component() {}
public static net.kyori.adventure.text.@NotNull Component comp(String msg) { public static net.kyori.adventure.text.@NotNull Component comp(String msg) {
MiniMessage mm = MiniMessage.miniMessage(); if (miniMessage == null) {
return mm.deserialize(msg); miniMessage = MiniMessage.miniMessage();
}
return miniMessage.deserialize(msg);
}
public static net.kyori.adventure.text.@NotNull TextComponent textComp(String msg) {
if (miniMessage == null) {
miniMessage = MiniMessage.miniMessage();
}
return (TextComponent) miniMessage.deserialize(msg);
} }
} }