de.pewpewproject.lasertag.client.hud.LasertagHudOverlay   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 143
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 77
dl 0
loc 143
rs 10
c 0
b 0
f 0
wmc 11

5 Methods

Rating   Name   Duplication   Size   Complexity  
A renderGameOver(TextRenderer,MatrixStack,UIState,ITeamsConfigState,int,int) 0 39 2
A renderTimer(TextRenderer,MatrixStack,UIState,ISettingsManager,IGameModeManager,int) 0 27 3
A renderStartingIn(TextRenderer,MatrixStack,UIState,int,int) 0 11 3
A renderProgressBar(TextRenderer,MatrixStack,UIState,int,int) 0 18 2
A onHudRender(MatrixStack,float) 0 30 1
1
package de.pewpewproject.lasertag.client.hud;
2
3
import de.pewpewproject.lasertag.common.util.DurationUtils;
4
import de.pewpewproject.lasertag.lasertaggame.settings.SettingDescription;
5
import de.pewpewproject.lasertag.lasertaggame.state.management.client.IGameModeManager;
6
import de.pewpewproject.lasertag.lasertaggame.state.management.client.ISettingsManager;
7
import de.pewpewproject.lasertag.lasertaggame.state.synced.ITeamsConfigState;
8
import de.pewpewproject.lasertag.lasertaggame.state.synced.implementation.UIState;
9
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
10
import net.minecraft.client.MinecraftClient;
11
import net.minecraft.client.font.TextRenderer;
12
import net.minecraft.client.gui.DrawableHelper;
13
import net.minecraft.client.util.math.MatrixStack;
14
15
import java.time.Duration;
16
17
/**
18
 * Class to implement the custom overlay for the lasertag game
19
 *
20
 * @author Étienne Muser
21
 */
22
public class LasertagHudOverlay implements HudRenderCallback {
23
    //region Rendering
24
25
    /**
26
     * Render the lasertag HUD overlay
27
     *
28
     * @param matrixStack the matrixStack
29
     * @param tickDelta   Progress for linearly interpolating between the previous and current game state
30
     */
31
    @Override
32
    public void onHudRender(MatrixStack matrixStack, float tickDelta) {
33
34
        // Get the client
35
        MinecraftClient client = MinecraftClient.getInstance();
36
37
        // Get the client managers
38
        var clientManager = client.world.getClientLasertagManager();
39
        var settingsManager = clientManager.getSettingsManager();
40
        var gameModeManager = clientManager.getGameModeManager();
41
        var syncedState = clientManager.getSyncedState();
42
        var teamConfigState = syncedState.getTeamsConfigState();
43
44
        // Get the render data
45
        var uiState = clientManager.getSyncedState().getUIState();
46
47
        // Calculate window size
48
        var width = client.getWindow().getScaledWidth();
49
        var wMid = width / 2;
50
        var height = client.getWindow().getScaledHeight();
51
        var hMid = height / 2;
52
53
        // Get the clients text renderer
54
        TextRenderer renderer = client.textRenderer;
55
56
        // Render HUD
57
        renderTimer(renderer, matrixStack, uiState, settingsManager, gameModeManager, wMid);
58
        renderProgressBar(renderer, matrixStack, uiState, wMid, hMid);
59
        renderStartingIn(renderer, matrixStack, uiState, wMid, hMid);
60
        renderGameOver(renderer, matrixStack, uiState, teamConfigState, wMid, hMid);
61
    }
62
63
    private void renderStartingIn(TextRenderer renderer, MatrixStack matrices, UIState uiState, int wMid, int hMid) {
64
        // If starting in is -1 (the halting value)
65
        if (uiState.startingIn <= -1) {
66
            // Abort
67
            return;
68
        }
69
70
        if (uiState.startingIn == 0) {
71
            DrawableHelper.drawCenteredText(matrices, renderer, "GO!", wMid, hMid, 0xFFFFFFFF);
72
        } else {
73
            DrawableHelper.drawCenteredText(matrices, renderer, "Starting in " + uiState.startingIn, wMid, hMid, 0xFFFFFFFF);
74
        }
75
    }
76
77
    private void renderProgressBar(TextRenderer renderer, MatrixStack matrices, UIState uiState, int wMid, int hMid) {
78
        // If progress is 0
79
        if (uiState.progress == -1.0) {
80
            // Abort
81
            return;
82
        }
83
84
        int barStart = wMid - (UIState.progressBarWidth / 2);
85
        int progressWidth = (int) (UIState.progressBarWidth * uiState.progress);
86
87
        // Draw background
88
        DrawableHelper.fill(matrices, barStart, hMid + 10, barStart + UIState.progressBarWidth, hMid + 15, UIState.boxColor);
89
90
        // Draw progress
91
        DrawableHelper.fill(matrices, barStart, hMid + 10, barStart + progressWidth, hMid + 15, 0xFFFFFFFF);
92
93
        // Draw text
94
        DrawableHelper.drawCenteredText(matrices, renderer, "Scanning for spawn points...", wMid, hMid - 15, 0xFFFFFFFF);
95
    }
96
97
    private void renderTimer(TextRenderer renderer,
98
                             MatrixStack matrices,
99
                             UIState uiState,
100
                             ISettingsManager settingsManager,
101
                             IGameModeManager gameModeManager,
102
                             int wMid) {
103
104
        // If game time should not be rendered
105
        if (!settingsManager.<Boolean>get(SettingDescription.RENDER_TIMER)) {
106
            // Abort
107
            return;
108
        }
109
110
        // Get the game mode
111
        var gameMode = gameModeManager.getGameMode();
112
113
        // Init seconds to show with the time the game is already running
114
        var secondsToShow = uiState.gameTime;
115
116
        // If game mode has no infinite time
117
        if (!gameMode.hasInfiniteTime()) {
118
            secondsToShow = (settingsManager.<Long>get(SettingDescription.PLAY_TIME) * 60L) - secondsToShow;
119
        }
120
121
        DrawableHelper.drawCenteredText(matrices, renderer,
122
                DurationUtils.toString(Duration.ofSeconds(secondsToShow)),
123
                wMid, 1, 0xFFFFFF);
124
    }
125
126
    private void renderGameOver(TextRenderer renderer,
127
                                MatrixStack matrices,
128
                                UIState uiState,
129
                                ITeamsConfigState teamsConfig,
130
                                int wMid, int hMid) {
131
132
        var winnerTeamId = uiState.lastGameWinnerId;
133
134
        if (winnerTeamId == -1) {
135
            return;
136
        }
137
138
        var winnerTeamOptional = teamsConfig.getTeamOfId(winnerTeamId);
139
140
        winnerTeamOptional.ifPresent(winnerTeam -> {
141
142
            matrices.push();
143
144
            var textColor = 0xFFFFFFFF;
145
146
            matrices.scale(2, 2, 2);
147
            DrawableHelper.drawCenteredText(matrices, renderer, "GAME OVER", wMid / 2, hMid / 2 - 15, textColor);
148
149
            matrices.scale(0.5F, 0.5F, 0.5F);
150
            var beginningString = "Team ";
151
            var endString = " won!";
152
            var beginningAndNameString = beginningString + winnerTeam.name();
153
            var wholeString = beginningAndNameString + endString;
154
            var widthOfBeginningString = renderer.getWidth(beginningString);
155
            var widthOfBeginningAndName = renderer.getWidth(beginningAndNameString);
156
            var widthOfWholeString = renderer.getWidth(wholeString);
157
            var textStartX = wMid - (widthOfWholeString / 2);
158
            var textY = hMid + 10;
159
160
            renderer.draw(matrices, beginningString, textStartX, textY, textColor);
161
            renderer.draw(matrices, winnerTeam.name(), textStartX + widthOfBeginningString, textY, winnerTeam.color().getValue());
162
            renderer.draw(matrices, endString, textStartX + widthOfBeginningAndName, textY, textColor);
163
164
            matrices.pop();
165
        });
166
    }
167
168
    //endregion
169
}
170