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; } }