aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/los/numeros/HidersAndDiggers/modules/GameClockModule.java
blob: 2a8765a0350d30fd239a52651789d80ca15a97f4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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;
  }
}