From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: YatopiaMC <yatopiamc@gmail.com>
Date: Fri, 23 Oct 2020 09:20:01 -0700
Subject: [PATCH] Utilities

This patch includes all utilities required by the Yatopia project and its patches.

Co-authored-by: Mykyta Komarnytskyy <nkomarn@hotmail.com>
Co-authored-by: Ivan Pekov <ivan@mrivanplays.com>

diff --git a/pom.xml b/pom.xml
index 48c53278ab9a02c614219e87fbe0a52f2c322e96..3a05118d764a6a934b4f834c3080e4ed20c227e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -197,6 +197,12 @@
             <artifactId>commons-math3</artifactId>
             <version>3.6.1</version>
         </dependency>
+        <!-- Fast Random -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-rng-core</artifactId>
+            <version>1.3</version>
+        </dependency>
     </dependencies>
 
     <repositories>
diff --git a/src/main/java/org/yatopiamc/yatopia/server/util/Constants.java b/src/main/java/org/yatopiamc/yatopia/server/util/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac5235155eb1b5515165fc9648b7c9d7a0713b44
--- /dev/null
+++ b/src/main/java/org/yatopiamc/yatopia/server/util/Constants.java
@@ -0,0 +1,7 @@
+package org.yatopiamc.yatopia.server.util;
+
+public class Constants {
+
+    public static final int[] EMPTY_ARRAY = new int[0];
+    public static final int[] ZERO_ARRAY = new int[]{0};
+}
diff --git a/src/main/java/org/yatopiamc/yatopia/server/util/FastRandom.java b/src/main/java/org/yatopiamc/yatopia/server/util/FastRandom.java
new file mode 100644
index 0000000000000000000000000000000000000000..e41c1e3fa656d8f595733897ab05089c3b0976a7
--- /dev/null
+++ b/src/main/java/org/yatopiamc/yatopia/server/util/FastRandom.java
@@ -0,0 +1,64 @@
+package org.yatopiamc.yatopia.server.util;
+
+import org.apache.commons.rng.core.source64.XoRoShiRo128PlusPlus;
+
+import java.util.Random;
+import java.util.SplittableRandom;
+
+public class FastRandom extends Random {
+
+    private XoRoShiRo128PlusPlus random;
+
+    public FastRandom() {
+        super();
+        SplittableRandom randomseed = new SplittableRandom();
+        this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong());
+    }
+
+    public FastRandom(long seed) {
+        super(seed);
+        SplittableRandom randomseed = new SplittableRandom(seed);
+        this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong());
+    }
+
+    @Override
+    public boolean nextBoolean() {
+        return random.nextBoolean();
+    }
+
+    @Override
+    public int nextInt() {
+        return random.nextInt();
+    }
+
+    @Override
+    public float nextFloat() {
+        return (float) random.nextDouble();
+    }
+
+    @Override
+    public double nextDouble() {
+        return random.nextDouble();
+    }
+
+    @Override
+    public synchronized void setSeed(long seed) {
+        SplittableRandom randomseed = new SplittableRandom(seed);
+        this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong());
+    }
+
+    @Override
+    public void nextBytes(byte[] bytes) {
+        random.nextBytes(bytes);
+    }
+
+    @Override
+    public int nextInt(int bound) {
+        return random.nextInt(bound);
+    }
+
+    @Override
+    public long nextLong() {
+        return random.nextLong();
+    }
+}
diff --git a/src/main/java/org/yatopiamc/yatopia/server/util/TimeUtils.java b/src/main/java/org/yatopiamc/yatopia/server/util/TimeUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..acdf3d60738791b767a3bafa2c9511342a8c18df
--- /dev/null
+++ b/src/main/java/org/yatopiamc/yatopia/server/util/TimeUtils.java
@@ -0,0 +1,27 @@
+package org.yatopiamc.yatopia.server.util;
+
+import java.util.concurrent.TimeUnit;
+
+public class TimeUtils {
+
+    public static String getFriendlyName(TimeUnit unit) {
+        switch (unit) {
+            case NANOSECONDS:
+                return "ns";
+            case MILLISECONDS:
+                return "ms";
+            case MICROSECONDS:
+                return "micros";
+            case SECONDS:
+                return "s";
+            case MINUTES:
+                return "m";
+            case DAYS:
+                return "d";
+            case HOURS:
+                return "h";
+            default:
+                throw new AssertionError();
+        }
+    }
+}
