aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/los
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/java/los/numeros/HidersAndDiggers/Main.java1
-rw-r--r--src/main/java/los/numeros/HidersAndDiggers/modules/GameClockModule.java127
-rw-r--r--src/main/java/los/numeros/utils/MinecraftTick.java77
3 files changed, 205 insertions, 0 deletions
diff --git a/src/main/java/los/numeros/HidersAndDiggers/Main.java b/src/main/java/los/numeros/HidersAndDiggers/Main.java
index 30e40e2..6ee3cef 100644
--- a/src/main/java/los/numeros/HidersAndDiggers/Main.java
+++ b/src/main/java/los/numeros/HidersAndDiggers/Main.java
@@ -62,6 +62,7 @@ public class Main implements Engine {
/* populate the modules */
modules[0] = new MainModule(diggers, hiders, players, source);
+ modules[1] = new GameClockModule(diggers, hiders, server);
/* start the game */
Engine.StartEngine(running, modules);
diff --git a/src/main/java/los/numeros/HidersAndDiggers/modules/GameClockModule.java b/src/main/java/los/numeros/HidersAndDiggers/modules/GameClockModule.java
new file mode 100644
index 0000000..2a8765a
--- /dev/null
+++ b/src/main/java/los/numeros/HidersAndDiggers/modules/GameClockModule.java
@@ -0,0 +1,127 @@
+package los.numeros.HidersAndDiggers.modules;
+
+import java.util.UUID;
+
+import los.numeros.GameEngine.Module;
+import los.numeros.utils.MinecraftTick;
+import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.network.MessageType;
+import net.minecraft.network.packet.s2c.play.TitleS2CPacket;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.text.LiteralText;
+import net.minecraft.text.Style;
+import net.minecraft.text.TextColor;
+
+public class GameClockModule implements Module {
+ private ServerPlayerEntity[] diggers, hiders;
+ private MinecraftServer server;
+ private MinecraftTick minecraftTick = new MinecraftTick();
+ private int i, j;
+ private LiteralText diggersString;
+
+ private long tickCounter;
+ private boolean hidersVisible = false;
+
+ public GameClockModule(ServerPlayerEntity diggers[], ServerPlayerEntity hiders[], MinecraftServer server) {
+ this.diggers = diggers;
+ this.hiders = hiders;
+ this.server = server;
+ }
+
+ private void preGameClock() {
+ server.getPlayerManager().broadcastChatMessage(
+ new LiteralText("20s"),
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+
+ minecraftTick.delayCallback(MinecraftTick.secondToTick(10), (tickDelay) -> {
+ server.getPlayerManager().broadcastChatMessage(
+ new LiteralText("10s"),
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+ });
+
+ /* countdown 5 -> 1 */
+ for (i = 15, j = 5; j > 0; i++, j--) {
+ minecraftTick.delayCallback(MinecraftTick.secondToTick(i), (tickDelay) -> {
+ server.getPlayerManager().broadcastChatMessage(
+ new LiteralText(String.valueOf(Math.abs(MinecraftTick.tickToSecond(tickDelay) - 20)) + "s"),
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+ });
+ }
+
+ /* wait 20 seconds */
+ minecraftTick.delayCallback(MinecraftTick.secondToTick(20), (tickDelay) -> {
+ /* make title screen adhere to gammar */
+ if (diggers.length > 1) {
+ diggersString = new LiteralText("The Diggers are Digging");
+ } else {
+ diggersString = new LiteralText("The Digger is Digging");
+ }
+
+ /* style text */
+ diggersString.setStyle(Style.EMPTY.withColor(TextColor.parse("red")));
+
+ /* send chat message */
+ server.getPlayerManager().broadcastChatMessage(
+ diggersString,
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+
+ /* set title screen */
+ server.getPlayerManager().sendToAll(
+ new TitleS2CPacket(TitleS2CPacket.Action.TITLE, diggersString)
+ );
+ });
+ }
+
+ @Override
+ public int init() {
+ preGameClock();
+
+ /* TEST: this may keep on running after the game has ended :( */
+ ServerTickEvents.END_SERVER_TICK.register(event -> {
+ if (this.tickCounter == MinecraftTick.secondToTick(120) && !this.hidersVisible) {
+ this.hidersVisible = true;
+ this.tickCounter = 0L;
+ for (ServerPlayerEntity p : this.hiders) {
+ p.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING, 200000000, 10, false, false));
+ }
+
+ server.getPlayerManager().broadcastChatMessage(
+ new LiteralText("Hiders are visible"),
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+ } else if (this.tickCounter == MinecraftTick.secondToTick(10) && this.hidersVisible) {
+ this.hidersVisible = false;
+ for (ServerPlayerEntity p : this.hiders) {
+ p.clearStatusEffects();
+ }
+
+ server.getPlayerManager().broadcastChatMessage(
+ new LiteralText("Hiders are invisible"),
+ MessageType.SYSTEM,
+ new UUID(0, 0)
+ );
+ }
+
+ tickCounter++;
+ });
+
+ return 0;
+ }
+
+ @Override
+ public int end() {
+ return 0;
+ }
+}
diff --git a/src/main/java/los/numeros/utils/MinecraftTick.java b/src/main/java/los/numeros/utils/MinecraftTick.java
new file mode 100644
index 0000000..890865a
--- /dev/null
+++ b/src/main/java/los/numeros/utils/MinecraftTick.java
@@ -0,0 +1,77 @@
+package los.numeros.utils;
+
+import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
+
+/**
+ * class for dealing with minecraft ticks
+ *
+ */
+public class MinecraftTick {
+ /* interface for callbacks */
+ public interface Callback {
+ public void run(long delay);
+ }
+
+ /**
+ * run callback on delay
+ *
+ * @param ticks minecraft ticks to wait before calling delay
+ * @param callback callback to run after ticks delay
+ */
+ public void delayCallback(long ticks, MinecraftTick.Callback callback) {
+ Delay delay = new Delay();
+ delay.tickCallback = callback;
+
+ /* register event to run on every server tick */
+ /* TEST: I'm pretty sure this creates a new event every time this method is
+ * called, but I could be wrong */
+ ServerTickEvents.END_SERVER_TICK.register(event -> {
+ /* check if we're done */
+ if (delay.tickCounter == ticks) {
+ /* run callback */
+ delay.tickCallback.run(ticks);
+ delay.tickCallbackRan = true;
+
+ /* reset for next run */
+ delay.tickCounter = 0L;
+ return;
+ }
+
+ /* increment counter every tick */
+ if (!delay.tickCallbackRan) {
+ delay.tickCounter++;
+ }
+ });
+ return;
+ }
+
+ /**
+ * convert seconds to ticks
+ *
+ * @param seconds seconds
+ * @return ticks
+ */
+ static public long secondToTick(int seconds) {
+ return seconds * 20;
+ }
+
+ /**
+ * convert ticks to seconds
+ *
+ * @param ticks minecraft ticks
+ * @return seconds
+ */
+ static public int tickToSecond(long ticks) {
+ return (int)(ticks / 20);
+ }
+}
+
+/**
+ * small class to deal with tick delay callbacks
+ *
+ */
+class Delay {
+ public long tickCounter = 0L;
+ public boolean tickCallbackRan = false;
+ public MinecraftTick.Callback tickCallback;
+}