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
128
129
130
131
132
133
134
135
136
137
|
/*
* This file is part of OneConfig.
* OneConfig - Next Generation Config Library for Minecraft: Java Edition
* Copyright (C) 2021, 2022 Polyfrost.
* <https://polyfrost.cc> <https://github.com/Polyfrost/>
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* OneConfig is licensed under the terms of version 3 of the GNU Lesser
* General Public License as published by the Free Software Foundation, AND
* under the Additional Terms Applicable to OneConfig, as published by Polyfrost,
* either version 1.0 of the Additional Terms, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License. If not, see <https://www.gnu.org/licenses/>. You should
* have also received a copy of the Additional Terms Applicable
* to OneConfig, as published by Polyfrost. If not, see
* <https://polyfrost.cc/legal/oneconfig/additional-terms>
*/
package cc.polyfrost.oneconfig.utils.gui;
import cc.polyfrost.oneconfig.events.EventManager;
import cc.polyfrost.oneconfig.events.event.RenderEvent;
import cc.polyfrost.oneconfig.events.event.Stage;
import cc.polyfrost.oneconfig.gui.OneConfigGui;
import cc.polyfrost.oneconfig.libs.eventbus.Subscribe;
import cc.polyfrost.oneconfig.libs.universal.UMinecraft;
import cc.polyfrost.oneconfig.libs.universal.UScreen;
import cc.polyfrost.oneconfig.platform.Platform;
import cc.polyfrost.oneconfig.utils.TickDelay;
import net.minecraft.client.gui.GuiScreen;
import java.util.Deque;
import java.util.Optional;
import java.util.concurrent.ConcurrentLinkedDeque;
/**
* A class containing utility methods for working with GuiScreens.
*/
public final class GuiUtils {
private static long time = -1L;
private static long deltaTime = 17L;
private static boolean wasMouseDown = false;
private static final Deque<Optional<GuiScreen>> screenQueue = new ConcurrentLinkedDeque<>();
static {
EventManager.INSTANCE.register(new GuiUtils());
}
/**
* Displays a screen after a tick, preventing mouse sync issues.
*
* @param screen the screen to display.
* @deprecated Not actually deprecated, but should not be used.
*/
@Deprecated
public static void displayScreen(Object screen) {
displayScreen(((GuiScreen) screen));
}
/**
* Displays a screen after a tick, preventing mouse sync issues.
*
* @param screen the screen to display.
*/
public static void displayScreen(GuiScreen screen) {
//noinspection ConstantConditions
displayScreen(screen, screen instanceof OneConfigGui ? 2 : 1);
}
/**
* Displays a screen after the specified amount of ticks.
*
* @param screen the screen to display.
* @param ticks the amount of ticks to wait for before displaying the screen.
*/
public static void displayScreen(GuiScreen screen, int ticks) {
Optional<GuiScreen> optional = Optional.of(screen);
screenQueue.add(optional);
new TickDelay(() -> {
UScreen.displayScreen(screen);
screenQueue.remove(optional);
}, ticks);
}
public static Deque<Optional<GuiScreen>> getScreenQueue() {
return screenQueue;
}
/**
* Close the current open GUI screen.
*/
public static void closeScreen() {
UScreen.displayScreen(null);
}
/**
* Gets the delta time (in milliseconds) between frames.
* <p><b>
* Not to be confused with Minecraft deltaTicks / renderPartialTicks, which can be gotten via
* {@link cc.polyfrost.oneconfig.events.event.TimerUpdateEvent}
* </b></p>
*
* @return the delta time.
*/
public static float getDeltaTime() {
return deltaTime;
}
/**
* @return If the mouse was down last frame
*/
public static boolean wasMouseDown() {
return wasMouseDown;
}
@Subscribe
private void onRenderEvent(RenderEvent event) {
if (event.stage == Stage.START) {
if (time == -1) time = UMinecraft.getTime();
else {
long currentTime = UMinecraft.getTime();
deltaTime = currentTime - time;
time = currentTime;
}
} else if (event.stage == Stage.END) {
wasMouseDown = Platform.getMousePlatform().isButtonDown(0);
}
}
}
|