From 09aaa9ff725787be4f56986d58e61ee41e3140cb Mon Sep 17 00:00:00 2001 From: Dico Date: Thu, 27 Sep 2018 09:03:28 +0100 Subject: More commandlib tweaks --- .../main/java/io/dico/dicore/command/Command.java | 28 +-- .../io/dico/dicore/command/ExecutionContext.java | 2 +- .../io/dico/dicore/command/RootCommandAddress.java | 8 +- .../command/chat/AbstractChatController.java | 1 + .../io/dico/dicore/command/chat/Formatting.java | 278 --------------------- .../dico/dicore/command/chat/IChatController.java | 1 + .../chat/help/defaults/DefaultPageLayout.java | 2 +- .../chat/help/defaults/DescriptionHelpTopic.java | 2 +- .../chat/help/defaults/SubcommandsHelpTopic.java | 2 +- .../chat/help/defaults/SyntaxHelpTopic.java | 2 +- .../dicore/command/parameter/ContextParser.java | 2 +- .../dicore/command/predef/DefaultGroupCommand.java | 23 +- .../src/main/java/io/dico/dicore/Formatting.java | 19 +- src/main/kotlin/io/dico/parcels2/Interactable.kt | 2 +- src/main/kotlin/io/dico/parcels2/ParcelWorld.kt | 2 +- .../io/dico/parcels2/blockvisitor/JobDispatcher.kt | 2 +- .../dico/parcels2/blockvisitor/RegionTraverser.kt | 2 +- .../dico/parcels2/command/ParcelCommandBuilder.kt | 2 +- .../io/dico/parcels2/command/ParcelTarget.kt | 2 +- .../parcels2/defaultimpl/DefaultParcelGenerator.kt | 4 +- .../io/dico/parcels2/listener/ParcelListeners.kt | 4 +- .../parcels2/storage/exposed/ExposedBacking.kt | 2 +- .../io/dico/parcels2/util/MainThreadDispatcher.kt | 2 +- src/main/kotlin/io/dico/parcels2/util/ext/Misc.kt | 3 - src/main/kotlin/io/dico/parcels2/util/math/Math.kt | 42 ++++ .../kotlin/io/dico/parcels2/util/math/Vec3d.kt | 1 - .../kotlin/io/dico/parcels2/util/math/Vec3i.kt | 1 - .../kotlin/io/dico/parcels2/util/math/ext/Math.kt | 42 ---- 28 files changed, 109 insertions(+), 374 deletions(-) delete mode 100644 dicore3/command/src/main/java/io/dico/dicore/command/chat/Formatting.java create mode 100644 src/main/kotlin/io/dico/parcels2/util/math/Math.kt delete mode 100644 src/main/kotlin/io/dico/parcels2/util/math/ext/Math.kt diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/Command.java b/dicore3/command/src/main/java/io/dico/dicore/command/Command.java index e7c2e93..e423529 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/Command.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/Command.java @@ -91,18 +91,18 @@ public abstract class Command { * ---- CONTEXT FILTERS ---- * Filter the contexts. For example, if the sender must be a player but it's the console, * throw a CommandException describing the problem. - *

- * The index of the first element in contextFilters whose priority is POST_PARAMETERS - * Computed by {@link #computeContextFilterPostParameterIndex()} */ - private transient int contextFilterPostParameterIndex; + private transient int postParameterFilterCount = 0; public Command addContextFilter(IContextFilter contextFilter) { Objects.requireNonNull(contextFilter); if (!contextFilters.contains(contextFilter)) { contextFilters.add(contextFilter); contextFilters.sort(null); - computeContextFilterPostParameterIndex(); + + if (contextFilter.getPriority().compareTo(Priority.POST_PARAMETERS) >= 0) { + postParameterFilterCount++; + } } return this; } @@ -114,19 +114,11 @@ public abstract class Command { public Command removeContextFilter(IContextFilter contextFilter) { boolean ret = contextFilters.remove(contextFilter); if (ret) { - computeContextFilterPostParameterIndex(); - } - return this; - } - - private void computeContextFilterPostParameterIndex() { - List contextFilters = this.contextFilters; - contextFilterPostParameterIndex = 0; - for (int i = contextFilters.size() - 1; i >= 0; i--) { - if (contextFilters.get(i).getPriority() != Priority.POST_PARAMETERS) { - contextFilterPostParameterIndex = i + 1; + if (contextFilter.getPriority().compareTo(Priority.POST_PARAMETERS) >= 0) { + postParameterFilterCount--; } } + return this; } // ---- CONTROL FLOW IN COMMAND TREES ---- @@ -154,7 +146,7 @@ public abstract class Command { public void executeWithContext(ExecutionContext context) throws CommandException { //System.out.println("In Command.execute(sender, caller, buffer)#try{"); int i, n; - for (i = 0, n = contextFilterPostParameterIndex; i < n; i++) { + for (i = 0, n = contextFilters.size() - postParameterFilterCount; i < n; i++) { contextFilters.get(i).filterContext(context); } @@ -183,7 +175,7 @@ public abstract class Command { public List tabCompleteWithContext(ExecutionContext context, Location location) throws CommandException { int i, n; - for (i = 0, n = contextFilterPostParameterIndex; i < n; i++) { + for (i = 0, n = contextFilters.size() - postParameterFilterCount; i < n; i++) { contextFilters.get(i).filterContext(context); } diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/ExecutionContext.java b/dicore3/command/src/main/java/io/dico/dicore/command/ExecutionContext.java index 0608b80..c473166 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/ExecutionContext.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/ExecutionContext.java @@ -1,6 +1,6 @@ package io.dico.dicore.command; -import io.dico.dicore.command.chat.Formatting; +import io.dico.dicore.Formatting; import io.dico.dicore.command.parameter.ArgumentBuffer; import io.dico.dicore.command.parameter.ContextParser; import io.dico.dicore.command.parameter.Parameter; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java b/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java index c76bd14..aa84b67 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/RootCommandAddress.java @@ -78,7 +78,9 @@ public class RootCommandAddress extends ModifiableCommandAddress implements ICom } private static void debugChildren(ModifiableCommandAddress address) { - for (ModifiableCommandAddress child : new HashSet(address.getChildren().values())) { + Collection keys = address.getChildrenMainKeys(); + for (String key : keys) { + ChildCommandAddress child = address.getChild(key); System.out.println(child.getAddress()); debugChildren(child); } @@ -180,10 +182,10 @@ public class RootCommandAddress extends ModifiableCommandAddress implements ICom targetAddress = getCommandTarget(context, buffer); Command target = targetAddress.getCommand(); - if (target == null || target instanceof DefaultGroupCommand) { + if (target == null) { if (targetAddress.hasHelpCommand()) { target = targetAddress.getHelpCommand().getCommand(); - } else if (target == null){ + } else { return false; } } diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/AbstractChatController.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/AbstractChatController.java index 858337a..000c094 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/AbstractChatController.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/AbstractChatController.java @@ -1,5 +1,6 @@ package io.dico.dicore.command.chat; +import io.dico.dicore.Formatting; import io.dico.dicore.command.CommandException; import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/Formatting.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/Formatting.java deleted file mode 100644 index 576dfb5..0000000 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/Formatting.java +++ /dev/null @@ -1,278 +0,0 @@ -package io.dico.dicore.command.chat; - -import gnu.trove.map.TCharObjectMap; -import gnu.trove.map.hash.TCharObjectHashMap; - -public final class Formatting implements CharSequence { - public static final char FORMAT_CHAR = '\u00a7'; - private static final TCharObjectMap singleCharInstances = new TCharObjectHashMap<>(16, .5F, '\0'); - - public static final Formatting - BLACK = from('0'), - DARK_BLUE = from('1'), - DARL_GREEN = from('2'), - CYAN = from('3'), - DARK_RED = from('4'), - PURPLE = from('5'), - ORANGE = from('6'), - GRAY = from('7'), - DARK_GRAY = from('8'), - BLUE = from('9'), - GREEN = from('a'), - AQUA = from('b'), - RED = from('c'), - PINK = from('d'), - YELLOW = from('e'), - WHITE = from('f'), - BOLD = from('l'), - STRIKETHROUGH = from('m'), - UNDERLINE = from('n'), - ITALIC = from('o'), - MAGIC = from('k'), - RESET = from('r'), - EMPTY = from('\0'); - - public static String stripAll(String value) { - return stripAll(FORMAT_CHAR, value); - } - - public static String stripAll(char alternateChar, String value) { - int index = value.indexOf(alternateChar); - int max; - if (index == -1 || index == (max = value.length() - 1)) { - return value; - } - - StringBuilder result = new StringBuilder(); - int from = 0; - do { - if (isRecognizedChar(value.charAt(index + 1))) { - result.append(value, from, index); - from = index + 2; - } else { - result.append(value, from, from = index + 2); - } - - index = value.indexOf(alternateChar, index + 1); - } while (index != -1 && index != max && from <= max); - - if (from <= max) { - result.append(value, from, value.length()); - } - return result.toString(); - } - - public static String stripFirst(String value) { - return stripFirst(FORMAT_CHAR, value); - } - - public static String stripFirst(char alternateChar, String value) { - int index = value.indexOf(alternateChar); - int max; - if (index == -1 || index == (max = value.length() - 1)) { - return value; - } - - StringBuilder result = new StringBuilder(value.length()); - int from = 0; - if (isRecognizedChar(value.charAt(index + 1))) { - result.append(value, from, index); - from = index + 2; - } else { - result.append(value, from, from = index + 2); - } - - if (from < max) { - result.append(value, from, value.length()); - } - return result.toString(); - } - - public static Formatting from(char c) { - if (isRecognizedChar(c)) { - c = Character.toLowerCase(c); - Formatting res = singleCharInstances.get(c); - if (res == null) { - singleCharInstances.put(c, res = new Formatting(c)); - } - return res; - } - return EMPTY; - } - - public static Formatting from(String chars) { - return chars.length() == 1 ? from(chars.charAt(0)) : getFormats(chars, '\0'); - } - - public static Formatting getFormats(String input) { - return getFormats(input, FORMAT_CHAR); - } - - public static Formatting getFormats(String input, char formatChar) { - return getFormats(input, 0, input.length(), formatChar); - } - - public static Formatting getFormats(String input, int start, int end, char formatChar) { - if ((start < 0) || (start > end) || (end > input.length())) { - throw new IndexOutOfBoundsException("start " + start + ", end " + end + ", input.length() " + input.length()); - } - - boolean needsFormatChar = formatChar != '\0'; - char[] formats = new char[6]; - // just make sure it's not the same as formatChar - char previous = (char) (formatChar + 1); - - for (int i = start; i < end; i++) { - char c = input.charAt(i); - - if (previous == formatChar || !needsFormatChar) { - if (isColourChar(c) || isResetChar(c)) { - formats = new char[6]; - formats[0] = Character.toLowerCase(c); - } else if (isFormatChar(c)) { - char format = Character.toLowerCase(c); - for (int j = 0; j < 6; j++) { - if (formats[j] == '\0') { - formats[j] = format; - break; - } else if (formats[j] == format) { - break; - } - } - } - } - - previous = c; - } - - return formats[1] == '\0' ? from(formats[0]) : new Formatting(formats); - } - - public static String translate(String input) { - return translateChars('&', input); - } - - public static String translateChars(char alternateChar, String input) { - return translateFormat(alternateChar, FORMAT_CHAR, input); - } - - public static String revert(String input) { - return revertChars('&', input); - } - - public static String revertChars(char alternateChar, String input) { - return translateFormat(FORMAT_CHAR, alternateChar, input); - } - - public static String translateFormat(char fromChar, char toChar, String input) { - if (input == null) { - return null; - } - int n = input.length(); - if (n < 2) { - return input; - } - char[] result = null; - char previous = input.charAt(0); - for (int i = 1; i < n; i++) { - char c = input.charAt(i); - if (previous == fromChar && isRecognizedChar(c)) { - if (result == null) { - result = input.toCharArray(); - } - result[i - 1] = toChar; - } - previous = c; - } - return result == null ? input : String.valueOf(result); - } - - public static void translate(StringBuilder input) { - translateChars('&', input); - } - - public static void translateChars(char alternateChar, StringBuilder input) { - translateFormat(alternateChar, FORMAT_CHAR, input); - } - - public static void revert(StringBuilder input) { - revertChars('&', input); - } - - public static void revertChars(char alternateChar, StringBuilder input) { - translateFormat(FORMAT_CHAR, alternateChar, input); - } - - public static void translateFormat(char fromChar, char toChar, StringBuilder input) { - if (input == null) { - return; - } - int n = input.length(); - if (n < 2) { - return; - } - char previous = input.charAt(0); - for (int i = 1; i < n; i++) { - char c = input.charAt(i); - if (previous == fromChar && isRecognizedChar(c)) { - input.setCharAt(i - 1, toChar); - } - previous = c; - } - } - - private static boolean isRecognizedChar(char c) { - return isColourChar(c) || isFormatChar(c) || isResetChar(c); - } - - private static boolean isColourChar(char c) { - return "0123456789abcdefABCDEF".indexOf(c) > -1; - } - - private static boolean isResetChar(char c) { - return c == 'r' || c == 'R'; - } - - private static boolean isFormatChar(char c) { - return "lmnokLMNOK".indexOf(c) > -1; - } - - private final String format; - - private Formatting(char[] formats) { - StringBuilder format = new StringBuilder(12); - for (char c : formats) { - if (c != '\0') { - format.append(FORMAT_CHAR).append(c); - } else { - break; - } - } - this.format = format.toString(); - } - - private Formatting(char c) { - this.format = (c != '\0') ? String.valueOf(new char[]{FORMAT_CHAR, c}) : ""; - } - - @Override - public int length() { - return format.length(); - } - - @Override - public char charAt(int index) { - return format.charAt(index); - } - - @Override - public String subSequence(int start, int end) { - return format.substring(start, end); - } - - @Override - public String toString() { - return format; - } - -} \ No newline at end of file diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/IChatController.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/IChatController.java index 271ea20..a514499 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/IChatController.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/IChatController.java @@ -1,5 +1,6 @@ package io.dico.dicore.command.chat; +import io.dico.dicore.Formatting; import io.dico.dicore.command.CommandException; import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DefaultPageLayout.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DefaultPageLayout.java index e8f9bce..886b7b1 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DefaultPageLayout.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DefaultPageLayout.java @@ -4,7 +4,7 @@ import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; import io.dico.dicore.command.ICommandAddress; import io.dico.dicore.command.ModifiableCommandAddress; -import io.dico.dicore.command.chat.Formatting; +import io.dico.dicore.Formatting; import io.dico.dicore.command.chat.IChatController; import io.dico.dicore.command.chat.help.IPageBorder; import io.dico.dicore.command.chat.help.IPageLayout; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DescriptionHelpTopic.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DescriptionHelpTopic.java index fb8de57..ae88ea2 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DescriptionHelpTopic.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/DescriptionHelpTopic.java @@ -4,7 +4,7 @@ import io.dico.dicore.command.Command; import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; import io.dico.dicore.command.ICommandAddress; -import io.dico.dicore.command.chat.Formatting; +import io.dico.dicore.Formatting; import io.dico.dicore.command.chat.help.IHelpComponent; import io.dico.dicore.command.chat.help.IHelpTopic; import io.dico.dicore.command.chat.help.SimpleHelpComponent; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SubcommandsHelpTopic.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SubcommandsHelpTopic.java index 59912cd..cfa3bb1 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SubcommandsHelpTopic.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SubcommandsHelpTopic.java @@ -3,7 +3,7 @@ package io.dico.dicore.command.chat.help.defaults; import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; import io.dico.dicore.command.ICommandAddress; -import io.dico.dicore.command.chat.Formatting; +import io.dico.dicore.Formatting; import io.dico.dicore.command.chat.help.IHelpComponent; import io.dico.dicore.command.chat.help.IHelpTopic; import io.dico.dicore.command.chat.help.SimpleHelpComponent; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SyntaxHelpTopic.java b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SyntaxHelpTopic.java index 25392c8..d0e3ebe 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SyntaxHelpTopic.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/chat/help/defaults/SyntaxHelpTopic.java @@ -4,7 +4,7 @@ import io.dico.dicore.command.Command; import io.dico.dicore.command.EMessageType; import io.dico.dicore.command.ExecutionContext; import io.dico.dicore.command.ICommandAddress; -import io.dico.dicore.command.chat.Formatting; +import io.dico.dicore.Formatting; import io.dico.dicore.command.chat.help.IHelpComponent; import io.dico.dicore.command.chat.help.IHelpTopic; import io.dico.dicore.command.chat.help.SimpleHelpComponent; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/parameter/ContextParser.java b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/ContextParser.java index 8a3f236..3bfcf9b 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/parameter/ContextParser.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/parameter/ContextParser.java @@ -105,7 +105,7 @@ public class ContextParser { requireInput = m_curParamIndex <= m_requiredIndex; } else if (m_buffer.hasNext()) { - throw new CommandException("Too many arguments"); + throw new CommandException("Too many arguments for /" + m_context.getAddress().getAddress()); } else { m_done = true; diff --git a/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java b/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java index 6c03d8e..12483cc 100644 --- a/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java +++ b/dicore3/command/src/main/java/io/dico/dicore/command/predef/DefaultGroupCommand.java @@ -6,7 +6,8 @@ import io.dico.dicore.command.IContextFilter; import org.bukkit.command.CommandSender; public class DefaultGroupCommand extends PredefinedCommand { - private static final DefaultGroupCommand instance = new DefaultGroupCommand(false); + private static final DefaultGroupCommand instance; + private static final IContextFilter noArgumentFilter; public static DefaultGroupCommand getInstance() { return instance; @@ -14,6 +15,7 @@ public class DefaultGroupCommand extends PredefinedCommand private DefaultGroupCommand(boolean modifiable) { addContextFilter(IContextFilter.INHERIT_PERMISSIONS); + addContextFilter(noArgumentFilter); this.modifiable = modifiable; } @@ -32,4 +34,23 @@ public class DefaultGroupCommand extends PredefinedCommand return null; } + static { + noArgumentFilter = new IContextFilter() { + @Override + public void filterContext(ExecutionContext context) throws CommandException { + if (context.getProcessedBuffer().hasNext()) { + throw new CommandException("No such command: /" + context.getAddress().getAddress() + + " " + context.getProcessedBuffer().next()); + } + } + + @Override + public Priority getPriority() { + return Priority.EARLY; + } + }; + + instance = new DefaultGroupCommand(false); + } + } diff --git a/dicore3/core/src/main/java/io/dico/dicore/Formatting.java b/dicore3/core/src/main/java/io/dico/dicore/Formatting.java index 869ec4c..eac6ac5 100644 --- a/dicore3/core/src/main/java/io/dico/dicore/Formatting.java +++ b/dicore3/core/src/main/java/io/dico/dicore/Formatting.java @@ -9,12 +9,10 @@ package io.dico.dicore; -import gnu.trove.map.TCharObjectMap; -import gnu.trove.map.hash.TCharObjectHashMap; - public final class Formatting implements CharSequence { public static final char FORMAT_CHAR = '\u00a7'; - private static final TCharObjectMap singleCharInstances = new TCharObjectHashMap<>(16, .5F, '\0'); + private static final String CACHED_CHARS = "0123456789abcdefklmnor"; + private static final Formatting[] singleCharInstances = new Formatting[CACHED_CHARS.length()]; public static final Formatting BLACK = from('0'), @@ -100,9 +98,12 @@ public final class Formatting implements CharSequence { public static Formatting from(char c) { if (isRecognizedChar(c)) { c = Character.toLowerCase(c); - Formatting res = singleCharInstances.get(c); + int index = CACHED_CHARS.indexOf(c); + if (index == -1) return EMPTY; + + Formatting res = singleCharInstances[index]; if (res == null) { - singleCharInstances.put(c, res = new Formatting(c)); + singleCharInstances[index] = res = new Formatting(c); } return res; } @@ -229,13 +230,13 @@ public final class Formatting implements CharSequence { previous = c; } } - + private static boolean isRecognizedChar(char c) { return isColourChar(c) || isFormatChar(c) || isResetChar(c); } private static boolean isColourChar(char c) { - return "0123456789abcdefABCDEF".indexOf(c) > -1; + return "0123456789abcdefABCDEF".indexOf(c) >= 0; } private static boolean isResetChar(char c) { @@ -243,7 +244,7 @@ public final class Formatting implements CharSequence { } private static boolean isFormatChar(char c) { - return "lmnokLMNOK".indexOf(c) > -1; + return "klmnoKLMNO".indexOf(c) >= 0; } private final String format; diff --git a/src/main/kotlin/io/dico/parcels2/Interactable.kt b/src/main/kotlin/io/dico/parcels2/Interactable.kt index 825be94..c301340 100644 --- a/src/main/kotlin/io/dico/parcels2/Interactable.kt +++ b/src/main/kotlin/io/dico/parcels2/Interactable.kt @@ -1,6 +1,6 @@ package io.dico.parcels2 -import io.dico.parcels2.util.math.ext.ceilDiv +import io.dico.parcels2.util.math.ceilDiv import io.dico.parcels2.util.ext.getMaterialsWithWoodTypePrefix import org.bukkit.Material import java.util.EnumMap diff --git a/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt b/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt index 87e4c68..a3c6c24 100644 --- a/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt +++ b/src/main/kotlin/io/dico/parcels2/ParcelWorld.kt @@ -3,7 +3,7 @@ package io.dico.parcels2 import io.dico.parcels2.options.RuntimeWorldOptions import io.dico.parcels2.storage.Storage import io.dico.parcels2.util.math.Vec2i -import io.dico.parcels2.util.math.ext.floor +import io.dico.parcels2.util.math.floor import org.bukkit.Location import org.bukkit.World import org.bukkit.block.Block diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/JobDispatcher.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/JobDispatcher.kt index 702a680..c6bcacc 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/JobDispatcher.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/JobDispatcher.kt @@ -2,7 +2,7 @@ package io.dico.parcels2.blockvisitor import io.dico.parcels2.ParcelsPlugin import io.dico.parcels2.logger -import io.dico.parcels2.util.math.ext.clampMin +import io.dico.parcels2.util.math.clampMin import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart.LAZY diff --git a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt index bd00407..dc8ac28 100644 --- a/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt +++ b/src/main/kotlin/io/dico/parcels2/blockvisitor/RegionTraverser.kt @@ -3,7 +3,7 @@ package io.dico.parcels2.blockvisitor import io.dico.parcels2.util.math.Dimension import io.dico.parcels2.util.math.Region import io.dico.parcels2.util.math.Vec3i -import io.dico.parcels2.util.math.ext.clampMax +import io.dico.parcels2.util.math.clampMax private typealias Scope = SequenceScope diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt index 891988c..6a604c3 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelCommandBuilder.kt @@ -88,7 +88,7 @@ private fun generateCommands(address: ICommandAddress, vararg names: String) { while (addresses.isNotEmpty()) { val cur = addresses.poll() - addresses.addAll(cur.children.values.distinct()) + cur.childrenMainKeys.mapTo(addresses) { cur.getChild(it) } if (cur.hasCommand()) { ReflectiveRegistration.generateCommands(cur, names) } diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt index 05a10bd..f4d051e 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelTarget.kt @@ -17,7 +17,7 @@ import io.dico.parcels2.command.ParcelTarget.TargetKind.Companion.PREFER_OWNED_F import io.dico.parcels2.command.ParcelTarget.TargetKind.Companion.REAL import io.dico.parcels2.storage.Storage import io.dico.parcels2.util.math.Vec2i -import io.dico.parcels2.util.math.ext.floor +import io.dico.parcels2.util.math.floor import org.bukkit.command.CommandSender import org.bukkit.entity.Player diff --git a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt index 25d76e3..51671d4 100644 --- a/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt +++ b/src/main/kotlin/io/dico/parcels2/defaultimpl/DefaultParcelGenerator.kt @@ -6,8 +6,8 @@ import io.dico.parcels2.options.DefaultGeneratorOptions import io.dico.parcels2.util.math.Region import io.dico.parcels2.util.math.Vec2i import io.dico.parcels2.util.math.Vec3i -import io.dico.parcels2.util.math.ext.even -import io.dico.parcels2.util.math.ext.umod +import io.dico.parcels2.util.math.even +import io.dico.parcels2.util.math.umod import io.dico.parcels2.util.math.get import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart.UNDISPATCHED diff --git a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt index ff96536..94fca4b 100644 --- a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt +++ b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt @@ -10,8 +10,8 @@ import io.dico.parcels2.util.ext.* import io.dico.parcels2.util.math.Dimension import io.dico.parcels2.util.math.Vec3d import io.dico.parcels2.util.math.Vec3i -import io.dico.parcels2.util.math.ext.clampMax -import io.dico.parcels2.util.math.ext.clampMin +import io.dico.parcels2.util.math.clampMax +import io.dico.parcels2.util.math.clampMin import org.bukkit.Location import org.bukkit.Material.* import org.bukkit.World diff --git a/src/main/kotlin/io/dico/parcels2/storage/exposed/ExposedBacking.kt b/src/main/kotlin/io/dico/parcels2/storage/exposed/ExposedBacking.kt index e3ed21b..fa68338 100644 --- a/src/main/kotlin/io/dico/parcels2/storage/exposed/ExposedBacking.kt +++ b/src/main/kotlin/io/dico/parcels2/storage/exposed/ExposedBacking.kt @@ -6,7 +6,7 @@ import com.zaxxer.hikari.HikariDataSource import io.dico.parcels2.* import io.dico.parcels2.PlayerProfile.Star.name import io.dico.parcels2.storage.* -import io.dico.parcels2.util.math.ext.clampMax +import io.dico.parcels2.util.math.clampMax import io.dico.parcels2.util.ext.synchronized import kotlinx.coroutines.* import kotlinx.coroutines.channels.ArrayChannel diff --git a/src/main/kotlin/io/dico/parcels2/util/MainThreadDispatcher.kt b/src/main/kotlin/io/dico/parcels2/util/MainThreadDispatcher.kt index ce1bf0f..3eb2e81 100644 --- a/src/main/kotlin/io/dico/parcels2/util/MainThreadDispatcher.kt +++ b/src/main/kotlin/io/dico/parcels2/util/MainThreadDispatcher.kt @@ -36,7 +36,7 @@ fun MainThreadDispatcher(plugin: Plugin): MainThreadDispatcher { with (continuation) { resumeUndispatched(Unit) } } - val millis = TimeUnit.MILLISECONDS.convert(time, unit) + val millis = unit.toMillis(time) plugin.server.scheduler.runTaskLater(plugin, task, (millis + 25) / 50 - 1) } } diff --git a/src/main/kotlin/io/dico/parcels2/util/ext/Misc.kt b/src/main/kotlin/io/dico/parcels2/util/ext/Misc.kt index a826687..75aba35 100644 --- a/src/main/kotlin/io/dico/parcels2/util/ext/Misc.kt +++ b/src/main/kotlin/io/dico/parcels2/util/ext/Misc.kt @@ -2,10 +2,7 @@ package io.dico.parcels2.util.ext import io.dico.dicore.Formatting import io.dico.parcels2.logger -import org.bukkit.Bukkit -import org.bukkit.OfflinePlayer import java.io.File -import java.util.UUID fun File.tryCreate(): Boolean { if (exists()) { diff --git a/src/main/kotlin/io/dico/parcels2/util/math/Math.kt b/src/main/kotlin/io/dico/parcels2/util/math/Math.kt new file mode 100644 index 0000000..12c3e9f --- /dev/null +++ b/src/main/kotlin/io/dico/parcels2/util/math/Math.kt @@ -0,0 +1,42 @@ +package io.dico.parcels2.util.math + +fun Double.floor(): Int { + val down = toInt() + if (down.toDouble() != this && (java.lang.Double.doubleToRawLongBits(this).ushr(63).toInt()) == 1) { + return down - 1 + } + return down +} + +infix fun Int.umod(divisor: Int): Int { + val out = this % divisor + if (out < 0) { + return out + divisor + } + return out +} + +val Int.even: Boolean get() = and(1) == 0 + +fun IntRange.clamp(min: Int, max: Int): IntRange { + if (first < min) { + if (last > max) { + return IntRange(min, max) + } + return IntRange(min, last) + } + if (last > max) { + return IntRange(first, max) + } + return this +} + +// the name coerceAtMost is bad +fun Int.clampMax(max: Int) = coerceAtMost(max) +fun Double.clampMin(min: Double) = coerceAtLeast(min) +fun Double.clampMax(max: Double) = coerceAtMost(max) + +// Why does this not exist? +infix fun Int.ceilDiv(divisor: Int): Int { + return -Math.floorDiv(-this, divisor) +} \ No newline at end of file diff --git a/src/main/kotlin/io/dico/parcels2/util/math/Vec3d.kt b/src/main/kotlin/io/dico/parcels2/util/math/Vec3d.kt index 45e6216..787f46c 100644 --- a/src/main/kotlin/io/dico/parcels2/util/math/Vec3d.kt +++ b/src/main/kotlin/io/dico/parcels2/util/math/Vec3d.kt @@ -1,6 +1,5 @@ package io.dico.parcels2.util.math -import io.dico.parcels2.util.math.ext.floor import org.bukkit.Location import kotlin.math.sqrt diff --git a/src/main/kotlin/io/dico/parcels2/util/math/Vec3i.kt b/src/main/kotlin/io/dico/parcels2/util/math/Vec3i.kt index 418fd0f..a721afa 100644 --- a/src/main/kotlin/io/dico/parcels2/util/math/Vec3i.kt +++ b/src/main/kotlin/io/dico/parcels2/util/math/Vec3i.kt @@ -1,6 +1,5 @@ package io.dico.parcels2.util.math -import io.dico.parcels2.util.math.ext.clampMax import org.bukkit.Location import org.bukkit.World import org.bukkit.block.Block diff --git a/src/main/kotlin/io/dico/parcels2/util/math/ext/Math.kt b/src/main/kotlin/io/dico/parcels2/util/math/ext/Math.kt deleted file mode 100644 index 1211894..0000000 --- a/src/main/kotlin/io/dico/parcels2/util/math/ext/Math.kt +++ /dev/null @@ -1,42 +0,0 @@ -package io.dico.parcels2.util.math.ext - -fun Double.floor(): Int { - val down = toInt() - if (down.toDouble() != this && (java.lang.Double.doubleToRawLongBits(this).ushr(63).toInt()) == 1) { - return down - 1 - } - return down -} - -infix fun Int.umod(divisor: Int): Int { - val out = this % divisor - if (out < 0) { - return out + divisor - } - return out -} - -val Int.even: Boolean get() = and(1) == 0 - -fun IntRange.clamp(min: Int, max: Int): IntRange { - if (first < min) { - if (last > max) { - return IntRange(min, max) - } - return IntRange(min, last) - } - if (last > max) { - return IntRange(first, max) - } - return this -} - -// the name coerceAtMost is bad -fun Int.clampMax(max: Int) = coerceAtMost(max) -fun Double.clampMin(min: Double) = coerceAtLeast(min) -fun Double.clampMax(max: Double) = coerceAtMost(max) - -// Why does this not exist? -infix fun Int.ceilDiv(divisor: Int): Int { - return -Math.floorDiv(-this, divisor) -} \ No newline at end of file -- cgit v1.2.3