diff options
Diffstat (limited to '')
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; +} |