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
|
package com.raeids.stratus
import com.raeids.stratus.command.StratusCommand
import com.raeids.stratus.config.StratusConfig
import com.raeids.stratus.hook.ChatShortcuts
import com.raeids.stratus.hook.ChatTabs
import com.raeids.stratus.mixin.GuiNewChatAccessor
import com.raeids.stratus.updater.Updater
import com.raeids.stratus.utils.RenderHelper
import gg.essential.api.EssentialAPI
import gg.essential.universal.UDesktop
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.FontRenderer
import net.minecraft.client.gui.GuiChat
import net.minecraft.client.settings.KeyBinding
import net.minecraft.client.shader.Framebuffer
import net.minecraftforge.common.MinecraftForge.EVENT_BUS
import net.minecraftforge.fml.client.registry.ClientRegistry
import net.minecraftforge.fml.common.Loader
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.fml.common.event.FMLInitializationEvent
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.lwjgl.input.Keyboard
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
@Mod(
modid = Stratus.ID,
name = Stratus.NAME,
version = Stratus.VER,
modLanguageAdapter = "gg.essential.api.utils.KotlinAdapter"
)
object Stratus {
val keybind = KeyBinding("Screenshot Chat", Keyboard.KEY_NONE, "Stratus")
const val NAME = "@NAME@"
const val VER = "@VER@"
const val ID = "@ID@"
var doTheThing = false
lateinit var jarFile: File
private set
var isPatcher = false
private set
var isBetterChat = false
private set
private val fileFormatter: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd_HH.mm.ss'.png'")
val modDir = File(File(Minecraft.getMinecraft().mcDataDir, "W-OVERFLOW"), NAME)
@Mod.EventHandler
fun onFMLPreInitialization(event: FMLPreInitializationEvent) {
if (!modDir.exists()) modDir.mkdirs()
jarFile = event.sourceFile
}
@Mod.EventHandler
fun onInitialization(event: FMLInitializationEvent) {
StratusConfig.preload()
StratusCommand.register()
ClientRegistry.registerKeyBinding(keybind)
EVENT_BUS.register(this)
ChatTabs.initialize()
ChatShortcuts.initialize()
Updater.update()
}
@Mod.EventHandler
fun onPostInitialization(event: FMLPostInitializationEvent) {
isPatcher = Loader.isModLoaded("patcher")
isBetterChat = Loader.isModLoaded("betterchat")
}
@SubscribeEvent
fun onTickEvent(event: TickEvent.ClientTickEvent) {
if (event.phase == TickEvent.Phase.START && Minecraft.getMinecraft().theWorld != null && Minecraft.getMinecraft().thePlayer != null && (Minecraft.getMinecraft().currentScreen == null || Minecraft.getMinecraft().currentScreen is GuiChat)) {
if (doTheThing) {
screenshot()
doTheThing = false
}
}
}
private fun screenshot() {
val hud = Minecraft.getMinecraft().ingameGUI
val chat = hud.chatGUI
/* Render chat fully. */
var w = chat.chatWidth
var h = chat.chatHeight
if ((chat as GuiNewChatAccessor).drawnChatLines.size < 20) {
h = (chat as GuiNewChatAccessor).drawnChatLines
.size * Minecraft.getMinecraft().fontRendererObj.FONT_HEIGHT
}
if (w <= 0 || h <= 0 || (chat as GuiNewChatAccessor).drawnChatLines.isEmpty()) {
EssentialAPI.getNotifications().push("Stratus", "Chat window is empty.")
return
}
val chatLines: MutableList<String> = ArrayList()
val fr: FontRenderer = Minecraft.getMinecraft().fontRendererObj
for (chatLine in (chat as GuiNewChatAccessor).drawnChatLines) chatLines.add(chatLine.chatComponent.formattedText)
if (chatLines.isNotEmpty()) {
w = fr.getStringWidth(chatLines.stream().max(Comparator.comparingInt { obj: String -> obj.length }).get())
}
val fb: Framebuffer = RenderHelper.createBindFramebuffer(w, h)
val file = File(Minecraft.getMinecraft().mcDataDir, "screenshots/chat/" + fileFormatter.format(Date()))
RenderHelper.screenshotFramebuffer(fb, file)
Minecraft.getMinecraft().entityRenderer.setupOverlayRendering()
Minecraft.getMinecraft().framebuffer.bindFramebuffer(true)
EssentialAPI.getNotifications()
.push("Stratus", "Chat screenshotted successfully.\nClick to open.") {
if (!UDesktop.browse(file.toURI())) {
EssentialAPI.getNotifications().push("Stratus", "Could not browse!")
}
}
}
}
|