mirror of
				https://github.com/chylex/Minecraft-Window-Title.git
				synced 2025-11-03 19:40:13 +01:00 
			
		
		
		
	Compare commits
	
		
			32 Commits
		
	
	
		
			1.15
			...
			425eb3f380
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						425eb3f380
	
				 | 
					
					
						|||
| 
						
						
							
						
						43698d23b5
	
				 | 
					
					
						|||
| 
						
						
							
						
						dbbd5b60f5
	
				 | 
					
					
						|||
| 
						
						
							
						
						73dab6b277
	
				 | 
					
					
						|||
| 
						
						
							
						
						3de5e01e32
	
				 | 
					
					
						|||
| 
						
						
							
						
						05a081364d
	
				 | 
					
					
						|||
| 
						 | 
					941ece888b | ||
| 
						
						
							
						
						ba22745940
	
				 | 
					
					
						|||
| 
						
						
							
						
						13e6e63e81
	
				 | 
					
					
						|||
| 
						
						
							
						
						44a10a09ca
	
				 | 
					
					
						|||
| 
						
						
							
						
						701543c1e8
	
				 | 
					
					
						|||
| 
						
						
							
						
						ef0031a3dd
	
				 | 
					
					
						|||
| 
						
						
							
						
						8a9e287061
	
				 | 
					
					
						|||
| 
						
						
							
						
						c6b0e485de
	
				 | 
					
					
						|||
| 
						
						
							
						
						8190b1e1c1
	
				 | 
					
					
						|||
| 
						
						
							
						
						cb81efe63b
	
				 | 
					
					
						|||
| 
						
						
							
						
						0ebd3a9ef3
	
				 | 
					
					
						|||
| 
						
						
							
						
						ddc0e4595a
	
				 | 
					
					
						|||
| 
						
						
							
						
						335c8cf87b
	
				 | 
					
					
						|||
| 
						
						
							
						
						e2fb18fdef
	
				 | 
					
					
						|||
| 
						
						
							
						
						8b12ddc7c7
	
				 | 
					
					
						|||
| 
						
						
							
						
						02d6f2a63d
	
				 | 
					
					
						|||
| 
						
						
							
						
						30a12716b6
	
				 | 
					
					
						|||
| 
						
						
							
						
						5325cdf282
	
				 | 
					
					
						|||
| 
						
						
							
						
						6c4892dcd0
	
				 | 
					
					
						|||
| 
						
						
							
						
						e0b48e1c53
	
				 | 
					
					
						|||
| 
						
						
							
						
						d070b4b22f
	
				 | 
					
					
						|||
| 
						
						
							
						
						2c12af5fa8
	
				 | 
					
					
						|||
| 
						
						
							
						
						04f1714ec5
	
				 | 
					
					
						|||
| 
						
						
							
						
						466de670f3
	
				 | 
					
					
						|||
| 
						
						
							
						
						639f96dbed
	
				 | 
					
					
						|||
| 
						
						
							
						
						4aceac18c2
	
				 | 
					
					
						
							
								
								
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/FUNDING.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1 @@
 | 
				
			|||||||
github: chylex
 | 
					 | 
				
			||||||
patreon: chylex
 | 
					 | 
				
			||||||
ko_fi: chylex
 | 
					ko_fi: chylex
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										44
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,22 +1,30 @@
 | 
				
			|||||||
bin/
 | 
					# gradle
 | 
				
			||||||
[Bb]uild/
 | 
					
 | 
				
			||||||
eclipse/
 | 
					 | 
				
			||||||
run/
 | 
					 | 
				
			||||||
out/
 | 
					 | 
				
			||||||
.gradle/
 | 
					.gradle/
 | 
				
			||||||
.settings/
 | 
					build/
 | 
				
			||||||
.updateclasses/
 | 
					out/
 | 
				
			||||||
.idea/codeStyles/
 | 
					classes/
 | 
				
			||||||
.idea/inspectionProfiles/
 | 
					
 | 
				
			||||||
.idea/libraries/
 | 
					# eclipse
 | 
				
			||||||
.idea/$CACHE_FILE$
 | 
					
 | 
				
			||||||
.idea/dictionaries
 | 
					 | 
				
			||||||
.idea/jarRepositories.xml
 | 
					 | 
				
			||||||
.idea/workspace.xml
 | 
					 | 
				
			||||||
.classpath
 | 
					 | 
				
			||||||
.project
 | 
					 | 
				
			||||||
.DS_Store
 | 
					 | 
				
			||||||
*.launch
 | 
					*.launch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# idea
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.idea/
 | 
				
			||||||
 | 
					*.iml
 | 
				
			||||||
*.ipr
 | 
					*.ipr
 | 
				
			||||||
*.iws
 | 
					*.iws
 | 
				
			||||||
Thumbs.db
 | 
					
 | 
				
			||||||
 | 
					# vscode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.settings/
 | 
				
			||||||
 | 
					.vscode/
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
 | 
					.classpath
 | 
				
			||||||
 | 
					.project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# fabric
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					run/
 | 
				
			||||||
 | 
					logs/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							@@ -1,13 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="CompilerConfiguration">
 | 
					 | 
				
			||||||
    <bytecodeTargetLevel>
 | 
					 | 
				
			||||||
      <module name="Fabric" target="1.8" />
 | 
					 | 
				
			||||||
      <module name="Fabric.main" target="1.8" />
 | 
					 | 
				
			||||||
      <module name="Fabric.test" target="1.8" />
 | 
					 | 
				
			||||||
      <module name="Forge" target="1.8" />
 | 
					 | 
				
			||||||
      <module name="Forge.main" target="1.8" />
 | 
					 | 
				
			||||||
      <module name="Forge.test" target="1.8" />
 | 
					 | 
				
			||||||
    </bytecodeTargetLevel>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										18
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							@@ -4,24 +4,12 @@
 | 
				
			|||||||
  <component name="GradleSettings">
 | 
					  <component name="GradleSettings">
 | 
				
			||||||
    <option name="linkedExternalProjectsSettings">
 | 
					    <option name="linkedExternalProjectsSettings">
 | 
				
			||||||
      <GradleProjectSettings>
 | 
					      <GradleProjectSettings>
 | 
				
			||||||
        <option name="delegatedBuild" value="true" />
 | 
					        <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
				
			||||||
        <option name="testRunner" value="GRADLE" />
 | 
					 | 
				
			||||||
        <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
					 | 
				
			||||||
        <option name="externalProjectPath" value="$PROJECT_DIR$/Fabric" />
 | 
					 | 
				
			||||||
        <option name="modules">
 | 
					        <option name="modules">
 | 
				
			||||||
          <set>
 | 
					          <set>
 | 
				
			||||||
 | 
					            <option value="$PROJECT_DIR$" />
 | 
				
			||||||
            <option value="$PROJECT_DIR$/Fabric" />
 | 
					            <option value="$PROJECT_DIR$/Fabric" />
 | 
				
			||||||
          </set>
 | 
					            <option value="$PROJECT_DIR$/NeoForge" />
 | 
				
			||||||
        </option>
 | 
					 | 
				
			||||||
      </GradleProjectSettings>
 | 
					 | 
				
			||||||
      <GradleProjectSettings>
 | 
					 | 
				
			||||||
        <option name="delegatedBuild" value="true" />
 | 
					 | 
				
			||||||
        <option name="testRunner" value="GRADLE" />
 | 
					 | 
				
			||||||
        <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
					 | 
				
			||||||
        <option name="externalProjectPath" value="$PROJECT_DIR$/Forge" />
 | 
					 | 
				
			||||||
        <option name="modules">
 | 
					 | 
				
			||||||
          <set>
 | 
					 | 
				
			||||||
            <option value="$PROJECT_DIR$/Forge" />
 | 
					 | 
				
			||||||
          </set>
 | 
					          </set>
 | 
				
			||||||
        </option>
 | 
					        </option>
 | 
				
			||||||
      </GradleProjectSettings>
 | 
					      </GradleProjectSettings>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										16
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							@@ -1,16 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="EntryPointsManager">
 | 
					 | 
				
			||||||
    <list size="6">
 | 
					 | 
				
			||||||
      <item index="0" class="java.lang.String" itemvalue="net.minecraftforge.eventbus.api.SubscribeEvent" />
 | 
					 | 
				
			||||||
      <item index="1" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod" />
 | 
					 | 
				
			||||||
      <item index="2" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventHandler" />
 | 
					 | 
				
			||||||
      <item index="3" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.Mixin" />
 | 
					 | 
				
			||||||
      <item index="4" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.injection.Inject" />
 | 
					 | 
				
			||||||
      <item index="5" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.eventhandler.SubscribeEvent" />
 | 
					 | 
				
			||||||
    </list>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
 | 
					 | 
				
			||||||
    <output url="file://$PROJECT_DIR$/out" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										14
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/modules.xml
									
									
									
										generated
									
									
									
								
							@@ -1,14 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="ProjectModuleManager">
 | 
					 | 
				
			||||||
    <modules>
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Fabric.iml" filepath="$PROJECT_DIR$/.idea/modules/Fabric.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Fabric.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Fabric.main.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Fabric.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Fabric.test.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Forge.iml" filepath="$PROJECT_DIR$/.idea/modules/Forge.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Forge.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Forge.main.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/.idea/modules/Forge.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Forge.test.iml" />
 | 
					 | 
				
			||||||
      <module fileurl="file://$PROJECT_DIR$/Minecraft-Window-Title.iml" filepath="$PROJECT_DIR$/Minecraft-Window-Title.iml" />
 | 
					 | 
				
			||||||
    </modules>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										14
									
								
								.idea/modules/Fabric.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/modules/Fabric.iml
									
									
									
										generated
									
									
									
								
							@@ -1,14 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.fabric" externalSystemModuleVersion="v1.1.0" linkedProjectId="Fabric" linkedProjectPath="$MODULE_DIR$/../../Fabric" rootProjectPath="$MODULE_DIR$/../../Fabric" />
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Fabric">
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Fabric/.gradle" />
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Fabric/build" />
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Fabric/run" />
 | 
					 | 
				
			||||||
    </content>
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										122
									
								
								.idea/modules/Fabric.main.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										122
									
								
								.idea/modules/Fabric.main.iml
									
									
									
										generated
									
									
									
								
							@@ -1,122 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.fabric" externalSystemModuleType="sourceSet" externalSystemModuleVersion="v1.1.0" linkedProjectId="Fabric:main" linkedProjectPath="$MODULE_DIR$/../../Fabric" rootProjectPath="$MODULE_DIR$/../../Fabric" />
 | 
					 | 
				
			||||||
  <component name="FacetManager">
 | 
					 | 
				
			||||||
    <facet type="minecraft" name="Minecraft">
 | 
					 | 
				
			||||||
      <configuration>
 | 
					 | 
				
			||||||
        <autoDetectTypes>
 | 
					 | 
				
			||||||
          <platformType>FABRIC</platformType>
 | 
					 | 
				
			||||||
          <platformType>MIXIN</platformType>
 | 
					 | 
				
			||||||
          <platformType>MCP</platformType>
 | 
					 | 
				
			||||||
        </autoDetectTypes>
 | 
					 | 
				
			||||||
      </configuration>
 | 
					 | 
				
			||||||
    </facet>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="McpModuleSettings">
 | 
					 | 
				
			||||||
    <option name="srgType" value="SRG" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Fabric/src/main">
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Fabric/src/main/java" isTestSource="false" />
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Fabric/src/main/resources" type="java-resource" />
 | 
					 | 
				
			||||||
    </content>
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
    <orderEntry type="module-library" scope="PROVIDED">
 | 
					 | 
				
			||||||
      <library>
 | 
					 | 
				
			||||||
        <CLASSES>
 | 
					 | 
				
			||||||
          <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loom/0.2.6-SNAPSHOT/c4870a9dea65b47e62686806437c907ccf5f4b65/fabric-loom-0.2.6-SNAPSHOT.jar!/" />
 | 
					 | 
				
			||||||
        </CLASSES>
 | 
					 | 
				
			||||||
        <JAVADOC />
 | 
					 | 
				
			||||||
        <SOURCES />
 | 
					 | 
				
			||||||
      </library>
 | 
					 | 
				
			||||||
    </orderEntry>
 | 
					 | 
				
			||||||
    <orderEntry type="module-library">
 | 
					 | 
				
			||||||
      <library>
 | 
					 | 
				
			||||||
        <CLASSES>
 | 
					 | 
				
			||||||
          <root url="jar://$USER_HOME$/.gradle/caches/fabric-loom/yarn-1.15.2+build.1-v2-final.jar!/" />
 | 
					 | 
				
			||||||
        </CLASSES>
 | 
					 | 
				
			||||||
        <JAVADOC />
 | 
					 | 
				
			||||||
        <SOURCES />
 | 
					 | 
				
			||||||
      </library>
 | 
					 | 
				
			||||||
    </orderEntry>
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:patchy:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: oshi-project:oshi-core:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:jna:4.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:platform:3.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.ibm.icu:icu4j-core-mojang:51.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:javabridge:1.0.22" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.sf.jopt-simple:jopt-simple:5.0.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: io.netty:netty-all:4.1.25.Final" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.guava:guava:21.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-lang3:3.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-io:commons-io:2.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jutils:jutils:1.0.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:brigadier:1.0.17" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:datafixerupper:2.0.24" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:authlib:1.5.25" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-compress:1.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-logging:commons-logging:1.1.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: it.unimi.dsi:fastutil:8.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-api:2.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-core:2.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:tiny-mappings-parser:0.2.2.14" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:sponge-mixin:0.8+build.18" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:tiny-remapper:0.2.2.64" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:fabric-loader-sat4j:2.3.5.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.jimfs:jimfs:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-analysis:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-commons:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-tree:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-util:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:minecraft:1.15.2-mapped-net.fabricmc.yarn-1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-api:0.4.29+build.290-1.15@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-api-base:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-biomes-v1:0.1.5+3b05f68e0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-blockrenderlayer-v1:1.1.4+c6a8ea890c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-commands-v0:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-containers-v0:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-content-registries-v0:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-crash-report-info-v1:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-dimensions-v1:0.2.4+203491ea0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-events-interaction-v0:0.2.7+a1bd31180c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-events-lifecycle-v0:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-item-groups-v0:0.1.6+ec40b2e10c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-keybindings-v0:0.1.1+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-loot-tables-v1:0.1.5+e08a73050c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-mining-levels-v0:0.1.1+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-models-v0:0.1.0+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-networking-blockentity-v0:0.2.3+e08a73050c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-networking-v0:0.1.7+12515ed90c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-object-builders-v0:0.1.3+e4c9a9c30c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-particles-v1:0.1.1+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-registry-sync-v0:0.2.6+f3d8141b0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-api-v1:0.2.9+aea78a250c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-indigo:0.2.22+203491ea0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-registries-v1:2.0.1+5a0f9a600c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-fluids-v1:0.1.6+12515ed90c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-v0:1.1.0+534104900c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-v1:0.1.0+534104900c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-resource-loader-v0:0.1.10+06c939b30c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-tag-extensions-v0:0.1.3+abd915800c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-textures-v0:1.0.4+821cdba70c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:fabric-loader:0.8.2+build.194@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" scope="RUNTIME" name="Gradle: net.fabricmc:dev-launch-injector:0.2.0+build.6" level="project" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										112
									
								
								.idea/modules/Fabric.test.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										112
									
								
								.idea/modules/Fabric.test.iml
									
									
									
										generated
									
									
									
								
							@@ -1,112 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.fabric" externalSystemModuleType="sourceSet" externalSystemModuleVersion="v1.1.0" linkedProjectId="Fabric:test" linkedProjectPath="$MODULE_DIR$/../../Fabric" rootProjectPath="$MODULE_DIR$/../../Fabric" />
 | 
					 | 
				
			||||||
  <component name="FacetManager">
 | 
					 | 
				
			||||||
    <facet type="minecraft" name="Minecraft">
 | 
					 | 
				
			||||||
      <configuration>
 | 
					 | 
				
			||||||
        <autoDetectTypes>
 | 
					 | 
				
			||||||
          <platformType>FABRIC</platformType>
 | 
					 | 
				
			||||||
          <platformType>MIXIN</platformType>
 | 
					 | 
				
			||||||
          <platformType>MCP</platformType>
 | 
					 | 
				
			||||||
        </autoDetectTypes>
 | 
					 | 
				
			||||||
      </configuration>
 | 
					 | 
				
			||||||
    </facet>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="McpModuleSettings">
 | 
					 | 
				
			||||||
    <option name="srgType" value="SRG" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Fabric/src/test" />
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
    <orderEntry type="module" module-name="Fabric.main" />
 | 
					 | 
				
			||||||
    <orderEntry type="module-library">
 | 
					 | 
				
			||||||
      <library>
 | 
					 | 
				
			||||||
        <CLASSES>
 | 
					 | 
				
			||||||
          <root url="jar://$USER_HOME$/.gradle/caches/fabric-loom/yarn-1.15.2+build.1-v2-final.jar!/" />
 | 
					 | 
				
			||||||
        </CLASSES>
 | 
					 | 
				
			||||||
        <JAVADOC />
 | 
					 | 
				
			||||||
        <SOURCES />
 | 
					 | 
				
			||||||
      </library>
 | 
					 | 
				
			||||||
    </orderEntry>
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:patchy:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: oshi-project:oshi-core:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:jna:4.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:platform:3.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.ibm.icu:icu4j-core-mojang:51.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:javabridge:1.0.22" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.sf.jopt-simple:jopt-simple:5.0.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: io.netty:netty-all:4.1.25.Final" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.guava:guava:21.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-lang3:3.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-io:commons-io:2.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jutils:jutils:1.0.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:brigadier:1.0.17" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:datafixerupper:2.0.24" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:authlib:1.5.25" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-compress:1.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-logging:commons-logging:1.1.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: it.unimi.dsi:fastutil:8.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-api:2.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-core:2.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:tiny-mappings-parser:0.2.2.14" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:sponge-mixin:0.8+build.18" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:tiny-remapper:0.2.2.64" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:fabric-loader-sat4j:2.3.5.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.jimfs:jimfs:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-analysis:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-commons:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-tree:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-util:8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:minecraft:1.15.2-mapped-net.fabricmc.yarn-1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-api:0.4.29+build.290-1.15@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-api-base:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-biomes-v1:0.1.5+3b05f68e0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-blockrenderlayer-v1:1.1.4+c6a8ea890c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-commands-v0:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-containers-v0:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-content-registries-v0:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-crash-report-info-v1:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-dimensions-v1:0.2.4+203491ea0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-events-interaction-v0:0.2.7+a1bd31180c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-events-lifecycle-v0:0.1.2+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-item-groups-v0:0.1.6+ec40b2e10c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-keybindings-v0:0.1.1+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-loot-tables-v1:0.1.5+e08a73050c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-mining-levels-v0:0.1.1+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-models-v0:0.1.0+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-networking-blockentity-v0:0.2.3+e08a73050c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-networking-v0:0.1.7+12515ed90c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-object-builders-v0:0.1.3+e4c9a9c30c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-particles-v1:0.1.1+dfdb52d60c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-registry-sync-v0:0.2.6+f3d8141b0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-api-v1:0.2.9+aea78a250c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-indigo:0.2.22+203491ea0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-renderer-registries-v1:2.0.1+5a0f9a600c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-data-attachment-v1:0.1.3+b7f9825d0c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-fluids-v1:0.1.6+12515ed90c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-v0:1.1.0+534104900c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-rendering-v1:0.1.0+534104900c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-resource-loader-v0:0.1.10+06c939b30c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-tag-extensions-v0:0.1.3+abd915800c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc.fabric-api:fabric-textures-v0:1.0.4+821cdba70c@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.fabricmc:fabric-loader:0.8.2+build.194@net.fabricmc.yarn.1_15_2.1.15.2+build.1-v2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" scope="RUNTIME" name="Gradle: net.fabricmc:dev-launch-injector:0.2.0+build.6" level="project" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="TestModuleProperties" production-module="Fabric.main" />
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										14
									
								
								.idea/modules/Forge.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										14
									
								
								.idea/modules/Forge.iml
									
									
									
										generated
									
									
									
								
							@@ -1,14 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.forge" externalSystemModuleVersion="1.0.2" linkedProjectId="Forge" linkedProjectPath="$MODULE_DIR$/../../Forge" rootProjectPath="$MODULE_DIR$/../../Forge" />
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Forge">
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Forge/.gradle" />
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Forge/build" />
 | 
					 | 
				
			||||||
      <excludeFolder url="file://$MODULE_DIR$/../../Forge/run" />
 | 
					 | 
				
			||||||
    </content>
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										103
									
								
								.idea/modules/Forge.main.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										103
									
								
								.idea/modules/Forge.main.iml
									
									
									
										generated
									
									
									
								
							@@ -1,103 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.forge" externalSystemModuleType="sourceSet" externalSystemModuleVersion="1.0.2" linkedProjectId="Forge:main" linkedProjectPath="$MODULE_DIR$/../../Forge" rootProjectPath="$MODULE_DIR$/../../Forge" />
 | 
					 | 
				
			||||||
  <component name="FacetManager">
 | 
					 | 
				
			||||||
    <facet type="minecraft" name="Minecraft">
 | 
					 | 
				
			||||||
      <configuration>
 | 
					 | 
				
			||||||
        <autoDetectTypes>
 | 
					 | 
				
			||||||
          <platformType>FORGE</platformType>
 | 
					 | 
				
			||||||
          <platformType>MCP</platformType>
 | 
					 | 
				
			||||||
        </autoDetectTypes>
 | 
					 | 
				
			||||||
      </configuration>
 | 
					 | 
				
			||||||
    </facet>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="McpModuleSettings">
 | 
					 | 
				
			||||||
    <option name="mappingFile" value="C:\Projects\Mods\Minecraft-Window-Title\Forge\build\createMcpToSrg\output.tsrg" />
 | 
					 | 
				
			||||||
    <option name="mcpVersion" value="snapshot_20200130-1.15.1" />
 | 
					 | 
				
			||||||
    <option name="minecraftVersion" value="1.15.2" />
 | 
					 | 
				
			||||||
    <option name="srgType" value="TSRG" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager">
 | 
					 | 
				
			||||||
    <output url="file://$MODULE_DIR$/../../Forge/build/classes/java/main" />
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Forge/src/main">
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Forge/src/main/java" isTestSource="false" />
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Forge/src/main/resources" type="java-resource" />
 | 
					 | 
				
			||||||
    </content>
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forge:1.15.2-31.0.14_mapped_snapshot_20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forge:launcher:1.15.2-31.0.14_mapped_snapshot_20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:client:extra:1.15.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:accesstransformers:shadowed:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:eventbus:service:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:coremods:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forgespi:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:modlauncher:5.0.0-milestone.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:modlauncher:api:5.0.0-milestone.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:3.0.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:mergetool:api:1.0.9" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:mappings_snapshot:zip:20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-commons:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-tree:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:grossjava9hacks:1.1.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:unsafe:0.2.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.electronwill.night-config:toml:3.6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.electronwill.night-config:core:3.6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline:3.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.maven:maven-artifact:3.6.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.jodah:typetools:0.6.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecrell:terminalconsoleappender:1.2.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-core:2.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.sf.jopt-simple:jopt-simple:5.0.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:patchy:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: oshi-project:oshi-core:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:jna:4.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:platform:3.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.ibm.icu:icu4j-core-mojang:51.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:javabridge:1.0.22" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: io.netty:netty-all:4.1.25.Final" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.guava:guava:21.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-lang3:3.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-io:commons-io:2.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jutils:jutils:1.0.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:brigadier:1.0.17" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:datafixerupper:2.0.24" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:authlib:1.5.25" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-compress:1.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-logging:commons-logging:1.1.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: it.unimi.dsi:fastutil:8.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:natives-windows:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.antlr:antlr4-runtime:4.7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-util:6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-analysis:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.codehaus.plexus:plexus-utils:3.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline-reader:3.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-linux:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-osx:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-windows:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline-terminal:3.12.1" level="project" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										105
									
								
								.idea/modules/Forge.test.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										105
									
								
								.idea/modules/Forge.test.iml
									
									
									
										generated
									
									
									
								
							@@ -1,105 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module version="4">
 | 
					 | 
				
			||||||
  <component name="ExternalSystem" externalSystem="GRADLE" externalSystemModuleGroup="chylex.customwindowtitle.forge" externalSystemModuleType="sourceSet" externalSystemModuleVersion="1.0.2" linkedProjectId="Forge:test" linkedProjectPath="$MODULE_DIR$/../../Forge" rootProjectPath="$MODULE_DIR$/../../Forge" />
 | 
					 | 
				
			||||||
  <component name="FacetManager">
 | 
					 | 
				
			||||||
    <facet type="minecraft" name="Minecraft">
 | 
					 | 
				
			||||||
      <configuration>
 | 
					 | 
				
			||||||
        <autoDetectTypes>
 | 
					 | 
				
			||||||
          <platformType>FORGE</platformType>
 | 
					 | 
				
			||||||
          <platformType>MCP</platformType>
 | 
					 | 
				
			||||||
        </autoDetectTypes>
 | 
					 | 
				
			||||||
      </configuration>
 | 
					 | 
				
			||||||
    </facet>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="McpModuleSettings">
 | 
					 | 
				
			||||||
    <option name="mappingFile" value="C:\Projects\Mods\Minecraft-Window-Title\Forge\build\createMcpToSrg\output.tsrg" />
 | 
					 | 
				
			||||||
    <option name="mcpVersion" value="snapshot_20200130-1.15.1" />
 | 
					 | 
				
			||||||
    <option name="minecraftVersion" value="1.15.2" />
 | 
					 | 
				
			||||||
    <option name="srgType" value="TSRG" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager">
 | 
					 | 
				
			||||||
    <output-test url="file://$MODULE_DIR$/../../Forge/build/classes/java/test" />
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$/../../Forge/src/test">
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Forge/src/test/java" isTestSource="true" />
 | 
					 | 
				
			||||||
      <sourceFolder url="file://$MODULE_DIR$/../../Forge/src/test/resources" type="java-test-resource" />
 | 
					 | 
				
			||||||
    </content>
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
    <orderEntry type="module" module-name="Forge.main" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forge:1.15.2-31.0.14_mapped_snapshot_20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forge:launcher:1.15.2-31.0.14_mapped_snapshot_20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:client:extra:1.15.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:accesstransformers:shadowed:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:eventbus:service:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:coremods:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:forgespi:2.0.0-milestone.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:modlauncher:5.0.0-milestone.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:modlauncher:api:5.0.0-milestone.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.findbugs:jsr305:3.0.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:mergetool:api:1.0.9" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraft:mappings_snapshot:zip:20200130-1.15.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-commons:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-tree:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: cpw.mods:grossjava9hacks:1.1.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecraftforge:unsafe:0.2.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.electronwill.night-config:toml:3.6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.electronwill.night-config:core:3.6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline:3.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.maven:maven-artifact:3.6.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.jodah:typetools:0.6.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.minecrell:terminalconsoleappender:1.2.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-core:2.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.logging.log4j:log4j-api:2.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.sf.jopt-simple:jopt-simple:5.0.4" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:patchy:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: oshi-project:oshi-core:1.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:jna:4.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.dev.jna:platform:3.4.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.ibm.icu:icu4j-core-mojang:51.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:javabridge:1.0.22" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: io.netty:netty-all:4.1.25.Final" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.guava:guava:21.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-lang3:3.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-io:commons-io:2.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpclient:4.3.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-codec:commons-codec:1.10" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jutils:jutils:1.0.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:brigadier:1.0.17" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:datafixerupper:2.0.24" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.0" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:authlib:1.5.25" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.commons:commons-compress:1.8.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: commons-logging:commons-logging:1.1.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.apache.httpcomponents:httpcore:4.3.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: it.unimi.dsi:fastutil:8.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-jemalloc:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-openal:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-opengl:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-glfw:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-stb:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl-tinyfd:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.lwjgl:lwjgl:natives-windows:3.2.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: com.mojang:text2speech:natives-windows:1.11.3" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.antlr:antlr4-runtime:4.7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-util:6.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.ow2.asm:asm-analysis:7.2" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.codehaus.plexus:plexus-utils:3.2.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline-reader:3.12.1" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-linux:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-osx:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: net.java.jinput:jinput-platform:natives-windows:2.0.5" level="project" />
 | 
					 | 
				
			||||||
    <orderEntry type="library" name="Gradle: org.jline:jline-terminal:3.12.1" level="project" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="TestModuleProperties" production-module="Forge.main" />
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										13
									
								
								.idea/runConfigurations/Build___Merge.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								.idea/runConfigurations/Build___Merge.xml
									
									
									
										generated
									
									
									
								
							@@ -1,13 +0,0 @@
 | 
				
			|||||||
<component name="ProjectRunConfigurationManager">
 | 
					 | 
				
			||||||
  <configuration default="false" name="Build & Merge" type="ShConfigurationType">
 | 
					 | 
				
			||||||
    <option name="INDEPENDENT_SCRIPT_PATH" value="false" />
 | 
					 | 
				
			||||||
    <option name="SCRIPT_PATH" value="$PROJECT_DIR$/BuildMerge.bat" />
 | 
					 | 
				
			||||||
    <option name="SCRIPT_OPTIONS" value="" />
 | 
					 | 
				
			||||||
    <option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
 | 
					 | 
				
			||||||
    <option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
 | 
					 | 
				
			||||||
    <option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
 | 
					 | 
				
			||||||
    <option name="INTERPRETER_PATH" value="" />
 | 
					 | 
				
			||||||
    <option name="INTERPRETER_OPTIONS" value="" />
 | 
					 | 
				
			||||||
    <method v="2" />
 | 
					 | 
				
			||||||
  </configuration>
 | 
					 | 
				
			||||||
</component>
 | 
					 | 
				
			||||||
							
								
								
									
										21
									
								
								.idea/runConfigurations/Fabric__runClient_.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										21
									
								
								.idea/runConfigurations/Fabric__runClient_.xml
									
									
									
										generated
									
									
									
								
							@@ -1,21 +0,0 @@
 | 
				
			|||||||
<component name="ProjectRunConfigurationManager">
 | 
					 | 
				
			||||||
  <configuration default="false" name="Fabric [runClient]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
 | 
					 | 
				
			||||||
    <ExternalSystemSettings>
 | 
					 | 
				
			||||||
      <option name="executionName" />
 | 
					 | 
				
			||||||
      <option name="externalProjectPath" value="$PROJECT_DIR$/Fabric" />
 | 
					 | 
				
			||||||
      <option name="externalSystemIdString" value="GRADLE" />
 | 
					 | 
				
			||||||
      <option name="scriptParameters" value="" />
 | 
					 | 
				
			||||||
      <option name="taskDescriptions">
 | 
					 | 
				
			||||||
        <list />
 | 
					 | 
				
			||||||
      </option>
 | 
					 | 
				
			||||||
      <option name="taskNames">
 | 
					 | 
				
			||||||
        <list>
 | 
					 | 
				
			||||||
          <option value="runClient" />
 | 
					 | 
				
			||||||
        </list>
 | 
					 | 
				
			||||||
      </option>
 | 
					 | 
				
			||||||
      <option name="vmOptions" value="" />
 | 
					 | 
				
			||||||
    </ExternalSystemSettings>
 | 
					 | 
				
			||||||
    <GradleScriptDebugEnabled>true</GradleScriptDebugEnabled>
 | 
					 | 
				
			||||||
    <method v="2" />
 | 
					 | 
				
			||||||
  </configuration>
 | 
					 | 
				
			||||||
</component>
 | 
					 | 
				
			||||||
							
								
								
									
										21
									
								
								.idea/runConfigurations/Forge__runClient_.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										21
									
								
								.idea/runConfigurations/Forge__runClient_.xml
									
									
									
										generated
									
									
									
								
							@@ -1,21 +0,0 @@
 | 
				
			|||||||
<component name="ProjectRunConfigurationManager">
 | 
					 | 
				
			||||||
  <configuration default="false" name="Forge [runClient]" type="GradleRunConfiguration" factoryName="Gradle" nameIsGenerated="true">
 | 
					 | 
				
			||||||
    <ExternalSystemSettings>
 | 
					 | 
				
			||||||
      <option name="executionName" />
 | 
					 | 
				
			||||||
      <option name="externalProjectPath" value="$PROJECT_DIR$/Forge" />
 | 
					 | 
				
			||||||
      <option name="externalSystemIdString" value="GRADLE" />
 | 
					 | 
				
			||||||
      <option name="scriptParameters" value="" />
 | 
					 | 
				
			||||||
      <option name="taskDescriptions">
 | 
					 | 
				
			||||||
        <list />
 | 
					 | 
				
			||||||
      </option>
 | 
					 | 
				
			||||||
      <option name="taskNames">
 | 
					 | 
				
			||||||
        <list>
 | 
					 | 
				
			||||||
          <option value="runClient" />
 | 
					 | 
				
			||||||
        </list>
 | 
					 | 
				
			||||||
      </option>
 | 
					 | 
				
			||||||
      <option name="vmOptions" value="" />
 | 
					 | 
				
			||||||
    </ExternalSystemSettings>
 | 
					 | 
				
			||||||
    <GradleScriptDebugEnabled>true</GradleScriptDebugEnabled>
 | 
					 | 
				
			||||||
    <method v="2" />
 | 
					 | 
				
			||||||
  </configuration>
 | 
					 | 
				
			||||||
</component>
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
python BuildMerge.py
 | 
					 | 
				
			||||||
@@ -1,61 +0,0 @@
 | 
				
			|||||||
import subprocess
 | 
					 | 
				
			||||||
import platform
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import time
 | 
					 | 
				
			||||||
import shutil
 | 
					 | 
				
			||||||
import zipfile
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
root = os.path.abspath(sys.path[0])
 | 
					 | 
				
			||||||
builds = os.path.join(root, "Build")
 | 
					 | 
				
			||||||
combined = os.path.join(builds, "Combined")
 | 
					 | 
				
			||||||
outputjar = "CustomWindowTitle.jar"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gradlew = "gradlew.bat" if platform.system() == "Windows" else "gradlew"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def build(folder):
 | 
					 | 
				
			||||||
    separator = "========={}".format("=" * len(folder))
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    print(separator)
 | 
					 | 
				
			||||||
    print("Building {}".format(folder))
 | 
					 | 
				
			||||||
    print(separator)
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    libs = os.path.join(root, folder, "build", "libs")
 | 
					 | 
				
			||||||
    shutil.rmtree(libs)
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    os.chdir(os.path.join(root, folder))
 | 
					 | 
				
			||||||
    subprocess.run([gradlew, "build"])
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    for fname in os.listdir(libs):
 | 
					 | 
				
			||||||
        if "-dev" not in fname:
 | 
					 | 
				
			||||||
            global outputjar
 | 
					 | 
				
			||||||
            outputjar = fname
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            jar = os.path.join(builds, "{}.{}".format(folder, fname))
 | 
					 | 
				
			||||||
            shutil.copyfile(os.path.join(libs, fname), jar)
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            jar = zipfile.ZipFile(jar)
 | 
					 | 
				
			||||||
            jar.extractall(combined)
 | 
					 | 
				
			||||||
            jar.close()
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if os.path.isdir(builds):
 | 
					 | 
				
			||||||
    shutil.rmtree(builds)
 | 
					 | 
				
			||||||
    time.sleep(0.25)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
os.mkdir(builds)
 | 
					 | 
				
			||||||
os.mkdir(combined)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Forge must run last to overwrite MANIFEST.MF
 | 
					 | 
				
			||||||
build("Fabric")
 | 
					 | 
				
			||||||
build("Forge")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
os.chdir(builds)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
with zipfile.ZipFile(outputjar, "w", compression = zipfile.ZIP_DEFLATED, compresslevel = 9) as jar:
 | 
					 | 
				
			||||||
    for root, dirs, files in os.walk(combined):
 | 
					 | 
				
			||||||
        for fname in files:
 | 
					 | 
				
			||||||
            fname = os.path.join(root, fname)
 | 
					 | 
				
			||||||
            fname = os.path.normpath(fname)
 | 
					 | 
				
			||||||
            jar.write(fname, os.path.relpath(fname, combined))
 | 
					 | 
				
			||||||
							
								
								
									
										9
									
								
								Fabric/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								Fabric/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +0,0 @@
 | 
				
			|||||||
.idea/codeStyles/
 | 
					 | 
				
			||||||
.idea/inspectionProfiles/
 | 
					 | 
				
			||||||
.idea/modules/
 | 
					 | 
				
			||||||
.idea/runConfigurations/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.idea/$CACHE_FILE$
 | 
					 | 
				
			||||||
.idea/dictionaries
 | 
					 | 
				
			||||||
.idea/jarRepositories.xml
 | 
					 | 
				
			||||||
.idea/workspace.xml
 | 
					 | 
				
			||||||
							
								
								
									
										2
									
								
								Fabric/.idea/Fabric.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Fabric/.idea/Fabric.iml
									
									
									
										generated
									
									
									
								
							@@ -1,2 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module type="JAVA_MODULE" version="4" />
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Fabric/.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Fabric/.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="CompilerConfiguration">
 | 
					 | 
				
			||||||
    <bytecodeTargetLevel target="1.8" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Fabric/.idea/encodings.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Fabric/.idea/encodings.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
 | 
					 | 
				
			||||||
    <file url="PROJECT" charset="UTF-8" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										22
									
								
								Fabric/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										22
									
								
								Fabric/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							@@ -1,22 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="GradleMigrationSettings" migrationVersion="1" />
 | 
					 | 
				
			||||||
  <component name="GradleSettings">
 | 
					 | 
				
			||||||
    <option name="linkedExternalProjectsSettings">
 | 
					 | 
				
			||||||
      <GradleProjectSettings>
 | 
					 | 
				
			||||||
        <option name="delegatedBuild" value="true" />
 | 
					 | 
				
			||||||
        <option name="testRunner" value="GRADLE" />
 | 
					 | 
				
			||||||
        <option name="disableWrapperSourceDistributionNotification" value="true" />
 | 
					 | 
				
			||||||
        <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
					 | 
				
			||||||
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
					 | 
				
			||||||
        <option name="gradleJvm" value="1.8" />
 | 
					 | 
				
			||||||
        <option name="modules">
 | 
					 | 
				
			||||||
          <set>
 | 
					 | 
				
			||||||
            <option value="$PROJECT_DIR$" />
 | 
					 | 
				
			||||||
          </set>
 | 
					 | 
				
			||||||
        </option>
 | 
					 | 
				
			||||||
        <option name="useQualifiedModuleNames" value="true" />
 | 
					 | 
				
			||||||
      </GradleProjectSettings>
 | 
					 | 
				
			||||||
    </option>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										13
									
								
								Fabric/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								Fabric/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							@@ -1,13 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="EntryPointsManager">
 | 
					 | 
				
			||||||
    <list size="5">
 | 
					 | 
				
			||||||
      <item index="0" class="java.lang.String" itemvalue="net.minecraftforge.eventbus.api.SubscribeEvent" />
 | 
					 | 
				
			||||||
      <item index="1" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod" />
 | 
					 | 
				
			||||||
      <item index="2" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventHandler" />
 | 
					 | 
				
			||||||
      <item index="3" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.Mixin" />
 | 
					 | 
				
			||||||
      <item index="4" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.injection.Inject" />
 | 
					 | 
				
			||||||
    </list>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Fabric/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Fabric/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="VcsDirectoryMappings">
 | 
					 | 
				
			||||||
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
@@ -1,47 +0,0 @@
 | 
				
			|||||||
plugins{
 | 
					 | 
				
			||||||
	id 'fabric-loom' version '0.2.6-SNAPSHOT'
 | 
					 | 
				
			||||||
	id 'maven-publish'
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sourceCompatibility = JavaVersion.VERSION_1_8
 | 
					 | 
				
			||||||
targetCompatibility = JavaVersion.VERSION_1_8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
archivesBaseName = project.archives_base_name
 | 
					 | 
				
			||||||
version = project.mod_version
 | 
					 | 
				
			||||||
group = project.maven_group
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
minecraft{}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dependencies{
 | 
					 | 
				
			||||||
	minecraft "com.mojang:minecraft:${project.minecraft_version}"
 | 
					 | 
				
			||||||
	mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
 | 
					 | 
				
			||||||
	modCompile "net.fabricmc:fabric-loader:${project.loader_version}"
 | 
					 | 
				
			||||||
	modCompile "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
processResources{
 | 
					 | 
				
			||||||
	inputs.property "version", project.version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	from(sourceSets.main.resources.srcDirs){
 | 
					 | 
				
			||||||
		include "fabric.mod.json"
 | 
					 | 
				
			||||||
		expand "version": project.version
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	from(sourceSets.main.resources.srcDirs){
 | 
					 | 
				
			||||||
		exclude "fabric.mod.json"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// fix jar file name
 | 
					 | 
				
			||||||
version = 'v' + version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// ensure that the encoding is set to UTF-8, no matter what the system default is
 | 
					 | 
				
			||||||
// this fixes some edge cases with special characters not displaying correctly
 | 
					 | 
				
			||||||
// see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html
 | 
					 | 
				
			||||||
tasks.withType(JavaCompile){
 | 
					 | 
				
			||||||
	options.encoding = "UTF-8"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
jar{
 | 
					 | 
				
			||||||
	from "../LICENSE"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										67
									
								
								Fabric/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								Fabric/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					import net.fabricmc.loom.configuration.ide.RunConfigSettings
 | 
				
			||||||
 | 
					import org.gradle.jvm.tasks.Jar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val modId: String by project
 | 
				
			||||||
 | 
					val modSides: String by project
 | 
				
			||||||
 | 
					val minecraftVersion: String by project
 | 
				
			||||||
 | 
					val fabricVersion: String by project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					plugins {
 | 
				
			||||||
 | 
						id("fabric-loom")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dependencies {
 | 
				
			||||||
 | 
						minecraft("com.mojang:minecraft:$minecraftVersion")
 | 
				
			||||||
 | 
						modImplementation("net.fabricmc:fabric-loader:$fabricVersion")
 | 
				
			||||||
 | 
						mappings(loom.officialMojangMappings())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loom {
 | 
				
			||||||
 | 
						runs {
 | 
				
			||||||
 | 
							val runJvmArgs: Set<String> by project
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							configureEach {
 | 
				
			||||||
 | 
								runDir("../run")
 | 
				
			||||||
 | 
								vmArgs(runJvmArgs)
 | 
				
			||||||
 | 
								ideConfigGenerated(true)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							fun side(name: String, configure: RunConfigSettings.() -> Unit) {
 | 
				
			||||||
 | 
								if (modSides == "both" || modSides == name) {
 | 
				
			||||||
 | 
									named(name, configure)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
 | 
									findByName(name)?.let(::remove)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							side("client") {
 | 
				
			||||||
 | 
								configName = "Fabric Client"
 | 
				
			||||||
 | 
								client()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							side("server") {
 | 
				
			||||||
 | 
								configName = "Fabric Server"
 | 
				
			||||||
 | 
								server()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						mixin {
 | 
				
			||||||
 | 
							defaultRefmapName.set("$modId.refmap.json")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tasks.processResources {
 | 
				
			||||||
 | 
						filesMatching("fabric.mod.json") {
 | 
				
			||||||
 | 
							expand(inputs.properties)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tasks.register<Jar>("uncompressedRemapJar") {
 | 
				
			||||||
 | 
						group = "fabric"
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						from(tasks.remapJar.map { it.outputs.files.map(::zipTree) })
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						archiveClassifier.set("uncompressed")
 | 
				
			||||||
 | 
						entryCompression = ZipEntryCompression.STORED // Reduces size of multiloader jar.
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,17 +0,0 @@
 | 
				
			|||||||
# Done to increase the memory available to gradle.
 | 
					 | 
				
			||||||
org.gradle.jvmargs=-Xmx1G
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Fabric Properties
 | 
					 | 
				
			||||||
	# check these on https://fabricmc.net/use
 | 
					 | 
				
			||||||
	minecraft_version=1.15.2
 | 
					 | 
				
			||||||
	yarn_mappings=1.15.2+build.1
 | 
					 | 
				
			||||||
	loader_version=0.7.5+build.178
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Mod Properties
 | 
					 | 
				
			||||||
	mod_version = 1.1.1
 | 
					 | 
				
			||||||
	maven_group = chylex.customwindowtitle.fabric
 | 
					 | 
				
			||||||
	archives_base_name = CustomWindowTitle
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Dependencies
 | 
					 | 
				
			||||||
	# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
 | 
					 | 
				
			||||||
	fabric_version=0.4.29+build.290-1.15
 | 
					 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Fabric/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Fabric/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										188
									
								
								Fabric/gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										188
									
								
								Fabric/gradlew
									
									
									
									
										vendored
									
									
								
							@@ -1,188 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/env sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Copyright 2015 the original author or authors.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
					 | 
				
			||||||
# you may not use this file except in compliance with the License.
 | 
					 | 
				
			||||||
# You may obtain a copy of the License at
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#      https://www.apache.org/licenses/LICENSE-2.0
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Unless required by applicable law or agreed to in writing, software
 | 
					 | 
				
			||||||
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
					 | 
				
			||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					 | 
				
			||||||
# See the License for the specific language governing permissions and
 | 
					 | 
				
			||||||
# limitations under the License.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##############################################################################
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Gradle start up script for UN*X
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##############################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Attempt to set APP_HOME
 | 
					 | 
				
			||||||
# Resolve links: $0 may be a link
 | 
					 | 
				
			||||||
PRG="$0"
 | 
					 | 
				
			||||||
# Need this for relative symlinks.
 | 
					 | 
				
			||||||
while [ -h "$PRG" ] ; do
 | 
					 | 
				
			||||||
    ls=`ls -ld "$PRG"`
 | 
					 | 
				
			||||||
    link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
					 | 
				
			||||||
    if expr "$link" : '/.*' > /dev/null; then
 | 
					 | 
				
			||||||
        PRG="$link"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        PRG=`dirname "$PRG"`"/$link"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
SAVED="`pwd`"
 | 
					 | 
				
			||||||
cd "`dirname \"$PRG\"`/" >/dev/null
 | 
					 | 
				
			||||||
APP_HOME="`pwd -P`"
 | 
					 | 
				
			||||||
cd "$SAVED" >/dev/null
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
APP_NAME="Gradle"
 | 
					 | 
				
			||||||
APP_BASE_NAME=`basename "$0"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
					 | 
				
			||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
					 | 
				
			||||||
MAX_FD="maximum"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
warn () {
 | 
					 | 
				
			||||||
    echo "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die () {
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
    echo "$*"
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# OS specific support (must be 'true' or 'false').
 | 
					 | 
				
			||||||
cygwin=false
 | 
					 | 
				
			||||||
msys=false
 | 
					 | 
				
			||||||
darwin=false
 | 
					 | 
				
			||||||
nonstop=false
 | 
					 | 
				
			||||||
case "`uname`" in
 | 
					 | 
				
			||||||
  CYGWIN* )
 | 
					 | 
				
			||||||
    cygwin=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  Darwin* )
 | 
					 | 
				
			||||||
    darwin=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  MINGW* )
 | 
					 | 
				
			||||||
    msys=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  NONSTOP* )
 | 
					 | 
				
			||||||
    nonstop=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Determine the Java command to use to start the JVM.
 | 
					 | 
				
			||||||
if [ -n "$JAVA_HOME" ] ; then
 | 
					 | 
				
			||||||
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
 | 
					 | 
				
			||||||
        # IBM's JDK on AIX uses strange locations for the executables
 | 
					 | 
				
			||||||
        JAVACMD="$JAVA_HOME/jre/sh/java"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        JAVACMD="$JAVA_HOME/bin/java"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ ! -x "$JAVACMD" ] ; then
 | 
					 | 
				
			||||||
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
location of your Java installation."
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    JAVACMD="java"
 | 
					 | 
				
			||||||
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
location of your Java installation."
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Increase the maximum file descriptors if we can.
 | 
					 | 
				
			||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
 | 
					 | 
				
			||||||
    MAX_FD_LIMIT=`ulimit -H -n`
 | 
					 | 
				
			||||||
    if [ $? -eq 0 ] ; then
 | 
					 | 
				
			||||||
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
 | 
					 | 
				
			||||||
            MAX_FD="$MAX_FD_LIMIT"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        ulimit -n $MAX_FD
 | 
					 | 
				
			||||||
        if [ $? -ne 0 ] ; then
 | 
					 | 
				
			||||||
            warn "Could not set maximum file descriptor limit: $MAX_FD"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# For Darwin, add options to specify how the application appears in the dock
 | 
					 | 
				
			||||||
if $darwin; then
 | 
					 | 
				
			||||||
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# For Cygwin, switch paths to Windows format before running java
 | 
					 | 
				
			||||||
if $cygwin ; then
 | 
					 | 
				
			||||||
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
 | 
					 | 
				
			||||||
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
 | 
					 | 
				
			||||||
    JAVACMD=`cygpath --unix "$JAVACMD"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # We build the pattern for arguments to be converted via cygpath
 | 
					 | 
				
			||||||
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
 | 
					 | 
				
			||||||
    SEP=""
 | 
					 | 
				
			||||||
    for dir in $ROOTDIRSRAW ; do
 | 
					 | 
				
			||||||
        ROOTDIRS="$ROOTDIRS$SEP$dir"
 | 
					 | 
				
			||||||
        SEP="|"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    OURCYGPATTERN="(^($ROOTDIRS))"
 | 
					 | 
				
			||||||
    # Add a user-defined pattern to the cygpath arguments
 | 
					 | 
				
			||||||
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
 | 
					 | 
				
			||||||
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
					 | 
				
			||||||
    i=0
 | 
					 | 
				
			||||||
    for arg in "$@" ; do
 | 
					 | 
				
			||||||
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
 | 
					 | 
				
			||||||
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
 | 
					 | 
				
			||||||
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            eval `echo args$i`="\"$arg\""
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        i=$((i+1))
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    case $i in
 | 
					 | 
				
			||||||
        (0) set -- ;;
 | 
					 | 
				
			||||||
        (1) set -- "$args0" ;;
 | 
					 | 
				
			||||||
        (2) set -- "$args0" "$args1" ;;
 | 
					 | 
				
			||||||
        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
					 | 
				
			||||||
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
					 | 
				
			||||||
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
					 | 
				
			||||||
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
					 | 
				
			||||||
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
					 | 
				
			||||||
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
					 | 
				
			||||||
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Escape application args
 | 
					 | 
				
			||||||
save () {
 | 
					 | 
				
			||||||
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
 | 
					 | 
				
			||||||
    echo " "
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
APP_ARGS=$(save "$@")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
 | 
					 | 
				
			||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
 | 
					 | 
				
			||||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
 | 
					 | 
				
			||||||
  cd "$(dirname "$0")"
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
exec "$JAVACMD" "$@"
 | 
					 | 
				
			||||||
@@ -1,10 +0,0 @@
 | 
				
			|||||||
pluginManagement {
 | 
					 | 
				
			||||||
    repositories {
 | 
					 | 
				
			||||||
        jcenter()
 | 
					 | 
				
			||||||
        maven {
 | 
					 | 
				
			||||||
            name = 'Fabric'
 | 
					 | 
				
			||||||
            url = 'https://maven.fabricmc.net/'
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        gradlePluginPortal()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,132 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.InputStream;
 | 
					 | 
				
			||||||
import java.nio.charset.StandardCharsets;
 | 
					 | 
				
			||||||
import java.nio.file.Files;
 | 
					 | 
				
			||||||
import java.nio.file.Path;
 | 
					 | 
				
			||||||
import java.nio.file.Paths;
 | 
					 | 
				
			||||||
import java.nio.file.StandardOpenOption;
 | 
					 | 
				
			||||||
import java.util.Collections;
 | 
					 | 
				
			||||||
import java.util.HashMap;
 | 
					 | 
				
			||||||
import java.util.LinkedHashMap;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public final class TitleConfig{
 | 
					 | 
				
			||||||
	private static final Map<String, String> DEFAULTS;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static{
 | 
					 | 
				
			||||||
		final Map<String, String> defaults = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		defaults.put("title", "Minecraft {mcversion}");
 | 
					 | 
				
			||||||
		defaults.put("icon16", "");
 | 
					 | 
				
			||||||
		defaults.put("icon32", "");
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		DEFAULTS = Collections.unmodifiableMap(defaults);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static TitleConfig read(final String folder){
 | 
					 | 
				
			||||||
		final Path configFile = Paths.get(folder, "customwindowtitle-client.toml");
 | 
					 | 
				
			||||||
		final Map<String, String> config = new LinkedHashMap<>(DEFAULTS);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			if (!Files.exists(configFile)){
 | 
					 | 
				
			||||||
				Files.write(configFile, config.entrySet().stream().map(entry -> String.format("%s = '%s'", entry.getKey(), entry.getValue())).collect(Collectors.toList()), StandardCharsets.UTF_8);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else{
 | 
					 | 
				
			||||||
				Files.readAllLines(configFile, StandardCharsets.UTF_8).stream().map(String::trim).filter(line -> !line.isEmpty()).forEach(line -> {
 | 
					 | 
				
			||||||
					final String[] split = line.split("=", 2);
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					if (split.length != 2){
 | 
					 | 
				
			||||||
						throw new RuntimeException("CustomWindowTitle configuration has an invalid line: " + line);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					final String key = split[0].trim();
 | 
					 | 
				
			||||||
					final String value = parseTrimmedValue(split[1].trim());
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					if (config.containsKey(key)){
 | 
					 | 
				
			||||||
						config.put(key, value);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					else{
 | 
					 | 
				
			||||||
						throw new RuntimeException("CustomWindowTitle configuration has an invalid key: " + key);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle configuration error", e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final String icon16 = config.get("icon16");
 | 
					 | 
				
			||||||
		final String icon32 = config.get("icon32");
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final Path pathIcon16 = icon16.isEmpty() ? null : Paths.get(folder, icon16);
 | 
					 | 
				
			||||||
		final Path pathIcon32 = icon32.isEmpty() ? null : Paths.get(folder, icon32);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if ((pathIcon16 == null) != (pathIcon32 == null)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle configuration specifies only one icon, both 'icon16' and 'icon32' must be set.");
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (pathIcon16 != null && Files.notExists(pathIcon16)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle 16x16 icon not found: " + pathIcon16);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (pathIcon32 != null && Files.notExists(pathIcon32)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle 32x32 icon not found: " + pathIcon32);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return new TitleConfig(config.get("title"), pathIcon16, pathIcon32);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private static String parseTrimmedValue(String value){
 | 
					 | 
				
			||||||
		if (value.isEmpty()){
 | 
					 | 
				
			||||||
			return value;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final char surrounding = value.charAt(0);
 | 
					 | 
				
			||||||
		final int length = value.length();
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (value.charAt(length - 1) == surrounding){
 | 
					 | 
				
			||||||
			value = value.substring(1, length - 1);
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if (surrounding == '"'){
 | 
					 | 
				
			||||||
				value = value.replace("\\\"", "\"").replace("\\\\", "\\");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return value;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private final String title;
 | 
					 | 
				
			||||||
	private final Path icon16;
 | 
					 | 
				
			||||||
	private final Path icon32;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private TitleConfig(final String title, final Path icon16, final Path icon32){
 | 
					 | 
				
			||||||
		this.title = title;
 | 
					 | 
				
			||||||
		this.icon16 = icon16;
 | 
					 | 
				
			||||||
		this.icon32 = icon32;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public String getTitle(){
 | 
					 | 
				
			||||||
		return title;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean hasIcon(){
 | 
					 | 
				
			||||||
		return icon16 != null && icon32 != null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public InputStream readIcon16(){
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			return Files.newInputStream(icon16, StandardOpenOption.READ);
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle could not open the specified 16x16 icon: " + icon16, e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public InputStream readIcon32(){
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			return Files.newInputStream(icon32, StandardOpenOption.READ);
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle could not open the specified 32x32 icon: " + icon16, e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,46 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
import org.apache.commons.lang3.ArrayUtils;
 | 
					 | 
				
			||||||
import org.apache.commons.lang3.StringUtils;
 | 
					 | 
				
			||||||
import org.apache.logging.log4j.LogManager;
 | 
					 | 
				
			||||||
import org.apache.logging.log4j.Logger;
 | 
					 | 
				
			||||||
import java.util.regex.Matcher;
 | 
					 | 
				
			||||||
import java.util.regex.Pattern;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public final class TitleParser{
 | 
					 | 
				
			||||||
	private static final Pattern tokenRegex = Pattern.compile("\\{([a-z]+)(?::([^}]+))?}");
 | 
					 | 
				
			||||||
	private static final Logger logger = LogManager.getLogger("CustomWindowTitle");
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static String parse(final String input){
 | 
					 | 
				
			||||||
		final StringBuffer buffer = new StringBuffer();
 | 
					 | 
				
			||||||
		final Matcher matcher = tokenRegex.matcher(input);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		while(matcher.find()){
 | 
					 | 
				
			||||||
			final String token = matcher.group(1);
 | 
					 | 
				
			||||||
			final String[] args = StringUtils.split(matcher.group(2), ',');
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			String result = null;
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			try{
 | 
					 | 
				
			||||||
				result = TitleTokens.getTokenFunction(token).apply(args == null ? ArrayUtils.EMPTY_STRING_ARRAY : args);
 | 
					 | 
				
			||||||
			}catch(final TokenException e){
 | 
					 | 
				
			||||||
				logger.warn("Error processing token '" + token + "': " + e.getMessage());
 | 
					 | 
				
			||||||
			}catch(final Throwable t){
 | 
					 | 
				
			||||||
				logger.warn("Error processing token '" + token + "': " + t.getMessage(), t);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if (result == null){
 | 
					 | 
				
			||||||
				matcher.appendReplacement(buffer, input.substring(matcher.start(), matcher.end()));
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else{
 | 
					 | 
				
			||||||
				matcher.appendReplacement(buffer, result);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		matcher.appendTail(buffer);
 | 
					 | 
				
			||||||
		return buffer.toString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// Static class
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private TitleParser(){}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,43 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
import java.util.HashMap;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.function.Function;
 | 
					 | 
				
			||||||
import java.util.function.Supplier;
 | 
					 | 
				
			||||||
import java.util.function.UnaryOperator;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public final class TitleTokens{
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// Registry
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private static final Map<String, Function<String[], String>> tokenMap = new HashMap<>();
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static void registerToken(final String token, final Function<String[], String> processor){
 | 
					 | 
				
			||||||
		tokenMap.putIfAbsent(token, processor);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static Function<String[], String> getTokenFunction(final String token){
 | 
					 | 
				
			||||||
		return tokenMap.getOrDefault(token, args -> null);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// Arguments
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static Function<String[], String> noArgs(final Supplier<String> func){
 | 
					 | 
				
			||||||
		return args -> args.length > 0 ? fail("expected no arguments, got " + args.length) : func.get();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static Function<String[], String> oneArg(final UnaryOperator<String> func){
 | 
					 | 
				
			||||||
		return args -> args.length != 1 ? fail("expected 1 argument, got " + args.length) : func.apply(args[0]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static Function<String[], String> rangeArgs(final int min, final int max, final Function<String[], String> func){
 | 
					 | 
				
			||||||
		return args -> args.length < min || args.length > max ? fail("expected between " + min + " and " + max + " arguments, got " + args.length) : func.apply(args);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private static String fail(final String message){
 | 
					 | 
				
			||||||
		throw new TokenException(message);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	// Static class
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private TitleTokens(){}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class TokenException extends RuntimeException{
 | 
					 | 
				
			||||||
	public TokenException(final String message){
 | 
					 | 
				
			||||||
		super(message);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,30 +1,22 @@
 | 
				
			|||||||
package chylex.customwindowtitle.fabric;
 | 
					package chylex.customwindowtitle.fabric;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TitleChanger;
 | 
				
			||||||
import chylex.customwindowtitle.TitleConfig;
 | 
					import chylex.customwindowtitle.TitleConfig;
 | 
				
			||||||
import chylex.customwindowtitle.TitleParser;
 | 
					import chylex.customwindowtitle.data.CommonTokenData;
 | 
				
			||||||
import net.fabricmc.api.ClientModInitializer;
 | 
					import net.fabricmc.api.ClientModInitializer;
 | 
				
			||||||
import net.fabricmc.loader.api.FabricLoader;
 | 
					import net.fabricmc.loader.api.FabricLoader;
 | 
				
			||||||
import net.minecraft.client.MinecraftClient;
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
import net.minecraft.client.util.Window;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class CustomWindowTitle implements ClientModInitializer{
 | 
					public class CustomWindowTitle implements ClientModInitializer {
 | 
				
			||||||
	private final TitleConfig config;
 | 
						private final TitleConfig config;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public CustomWindowTitle(){
 | 
						public CustomWindowTitle() {
 | 
				
			||||||
		config = TitleConfig.read(FabricLoader.getInstance().getConfigDirectory().getAbsolutePath());
 | 
							config = TitleConfig.load(FabricLoader.getInstance().getConfigDir().toAbsolutePath().toString());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void onInitializeClient(){
 | 
						public void onInitializeClient() {
 | 
				
			||||||
		TokenData.register();
 | 
							CommonTokenData.register(new TokenProvider());
 | 
				
			||||||
		MinecraftClient.getInstance().execute(this::updateTitle);
 | 
							Minecraft.getInstance().execute(() -> TitleChanger.setTitle(config));
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private void updateTitle(){
 | 
					 | 
				
			||||||
		final Window window = MinecraftClient.getInstance().getWindow();
 | 
					 | 
				
			||||||
		window.setTitle(TitleParser.parse(config.getTitle()));
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (config.hasIcon()){
 | 
					 | 
				
			||||||
			window.setIcon(config.readIcon16(), config.readIcon32());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle.fabric;
 | 
					 | 
				
			||||||
import chylex.customwindowtitle.TokenException;
 | 
					 | 
				
			||||||
import net.fabricmc.loader.api.FabricLoader;
 | 
					 | 
				
			||||||
import net.minecraft.SharedConstants;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.noArgs;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.oneArg;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.registerToken;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
final class TokenData{
 | 
					 | 
				
			||||||
	static void register(){
 | 
					 | 
				
			||||||
		registerToken("mcversion", noArgs(TokenData::getMinecraftVersion));
 | 
					 | 
				
			||||||
		registerToken("modversion", oneArg(TokenData::getModVersion));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static String getMinecraftVersion(){
 | 
					 | 
				
			||||||
		return SharedConstants.getGameVersion().getName();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static String getModVersion(final String modId){
 | 
					 | 
				
			||||||
		return FabricLoader.getInstance().getModContainer(modId).orElseThrow(() -> new TokenException("mod info for '" + modId + "' not found")).getMetadata().getVersion().getFriendlyString();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.fabric;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TokenException;
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.data.CommonTokenProvider;
 | 
				
			||||||
 | 
					import net.fabricmc.loader.api.FabricLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class TokenProvider implements CommonTokenProvider {
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public String getModVersion(final String modId) {
 | 
				
			||||||
 | 
							return FabricLoader.getInstance()
 | 
				
			||||||
 | 
								.getModContainer(modId)
 | 
				
			||||||
 | 
								.orElseThrow(() -> new TokenException("mod info for '" + modId + "' not found"))
 | 
				
			||||||
 | 
								.getMetadata()
 | 
				
			||||||
 | 
								.getVersion()
 | 
				
			||||||
 | 
								.getFriendlyString();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,14 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle.fabric.mixin;
 | 
					 | 
				
			||||||
import net.minecraft.client.MinecraftClient;
 | 
					 | 
				
			||||||
import org.spongepowered.asm.mixin.Mixin;
 | 
					 | 
				
			||||||
import org.spongepowered.asm.mixin.injection.At;
 | 
					 | 
				
			||||||
import org.spongepowered.asm.mixin.injection.Inject;
 | 
					 | 
				
			||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@Mixin(MinecraftClient.class)
 | 
					 | 
				
			||||||
public final class DisableVanillaTitle{
 | 
					 | 
				
			||||||
	@Inject(method = "updateWindowTitle()V", at = @At("HEAD"), cancellable = true)
 | 
					 | 
				
			||||||
	private void updateTitle(final CallbackInfo info){
 | 
					 | 
				
			||||||
		info.cancel();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,32 +1,35 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "schemaVersion": 1,
 | 
					  "schemaVersion": 1,
 | 
				
			||||||
  "id": "customwindowtitle",
 | 
					  "id": "${id}",
 | 
				
			||||||
 | 
					  "name": "${name}",
 | 
				
			||||||
 | 
					  "description": "${description}",
 | 
				
			||||||
  "version": "${version}",
 | 
					  "version": "${version}",
 | 
				
			||||||
 | 
					  "license": "${license}",
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  "name": "Custom Window Title",
 | 
					 | 
				
			||||||
  "authors": [
 | 
					  "authors": [
 | 
				
			||||||
    "chylex"
 | 
					    "${author}"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  "contact": {
 | 
					  "contact": {
 | 
				
			||||||
    "homepage": "https://chylex.com",
 | 
					    "homepage": "https://chylex.com",
 | 
				
			||||||
    "sources": "https://github.com/chylex/Minecraft-Window-Title",
 | 
					    "issues": "${issuesURL}",
 | 
				
			||||||
    "issues": "https://github.com/chylex/Minecraft-Window-Title/issues"
 | 
					    "sources": "${sourcesURL}"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  "license": "Unlicense",
 | 
					  "environment": "${sidesForFabric}",
 | 
				
			||||||
 | 
					 | 
				
			||||||
  "environment": "client",
 | 
					 | 
				
			||||||
  "entrypoints": {
 | 
					  "entrypoints": {
 | 
				
			||||||
    "client": [
 | 
					    "client": [
 | 
				
			||||||
      "chylex.customwindowtitle.fabric.CustomWindowTitle"
 | 
					      "chylex.customwindowtitle.fabric.CustomWindowTitle"
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "mixins": [
 | 
					  
 | 
				
			||||||
    "mixins.json"
 | 
					  "mixins": [{
 | 
				
			||||||
  ],
 | 
					    "config": "${id}.mixins.json",
 | 
				
			||||||
 | 
					    "environment": "${sidesForFabric}"
 | 
				
			||||||
 | 
					  }],
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  "depends": {
 | 
					  "depends": {
 | 
				
			||||||
    "fabricloader": ">=0.7.2",
 | 
					    "fabricloader": ">=${minimumFabricVersion}",
 | 
				
			||||||
    "minecraft": ">=1.15"
 | 
					    "minecraft": ">=${minimumMinecraftVersion}"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "required": true,
 | 
					 | 
				
			||||||
  "package": "chylex.customwindowtitle.fabric.mixin",
 | 
					 | 
				
			||||||
  "compatibilityLevel": "JAVA_8",
 | 
					 | 
				
			||||||
  "mixins": [
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  "client": [
 | 
					 | 
				
			||||||
    "DisableVanillaTitle"
 | 
					 | 
				
			||||||
  ],
 | 
					 | 
				
			||||||
  "injectors": {
 | 
					 | 
				
			||||||
    "defaultRequire": 1
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										9
									
								
								Forge/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								Forge/.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,9 +0,0 @@
 | 
				
			|||||||
.idea/codeStyles/
 | 
					 | 
				
			||||||
.idea/inspectionProfiles/
 | 
					 | 
				
			||||||
.idea/modules/
 | 
					 | 
				
			||||||
.idea/runConfigurations/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.idea/$CACHE_FILE$
 | 
					 | 
				
			||||||
.idea/dictionaries
 | 
					 | 
				
			||||||
.idea/jarRepositories.xml
 | 
					 | 
				
			||||||
.idea/workspace.xml
 | 
					 | 
				
			||||||
							
								
								
									
										2
									
								
								Forge/.idea/Forge.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Forge/.idea/Forge.iml
									
									
									
										generated
									
									
									
								
							@@ -1,2 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module type="JAVA_MODULE" version="4" />
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Forge/.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Forge/.idea/compiler.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="CompilerConfiguration">
 | 
					 | 
				
			||||||
    <bytecodeTargetLevel target="1.8" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Forge/.idea/encodings.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Forge/.idea/encodings.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
 | 
					 | 
				
			||||||
    <file url="PROJECT" charset="UTF-8" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										22
									
								
								Forge/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										22
									
								
								Forge/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							@@ -1,22 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="GradleMigrationSettings" migrationVersion="1" />
 | 
					 | 
				
			||||||
  <component name="GradleSettings">
 | 
					 | 
				
			||||||
    <option name="linkedExternalProjectsSettings">
 | 
					 | 
				
			||||||
      <GradleProjectSettings>
 | 
					 | 
				
			||||||
        <option name="delegatedBuild" value="true" />
 | 
					 | 
				
			||||||
        <option name="testRunner" value="GRADLE" />
 | 
					 | 
				
			||||||
        <option name="disableWrapperSourceDistributionNotification" value="true" />
 | 
					 | 
				
			||||||
        <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
					 | 
				
			||||||
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
					 | 
				
			||||||
        <option name="gradleJvm" value="1.8" />
 | 
					 | 
				
			||||||
        <option name="modules">
 | 
					 | 
				
			||||||
          <set>
 | 
					 | 
				
			||||||
            <option value="$PROJECT_DIR$" />
 | 
					 | 
				
			||||||
          </set>
 | 
					 | 
				
			||||||
        </option>
 | 
					 | 
				
			||||||
        <option name="useQualifiedModuleNames" value="true" />
 | 
					 | 
				
			||||||
      </GradleProjectSettings>
 | 
					 | 
				
			||||||
    </option>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										13
									
								
								Forge/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										13
									
								
								Forge/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							@@ -1,13 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="EntryPointsManager">
 | 
					 | 
				
			||||||
    <list size="5">
 | 
					 | 
				
			||||||
      <item index="0" class="java.lang.String" itemvalue="net.minecraftforge.eventbus.api.SubscribeEvent" />
 | 
					 | 
				
			||||||
      <item index="1" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod" />
 | 
					 | 
				
			||||||
      <item index="2" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventHandler" />
 | 
					 | 
				
			||||||
      <item index="3" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.Mixin" />
 | 
					 | 
				
			||||||
      <item index="4" class="java.lang.String" itemvalue="org.spongepowered.asm.mixin.injection.Inject" />
 | 
					 | 
				
			||||||
    </list>
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								Forge/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										6
									
								
								Forge/.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<project version="4">
 | 
					 | 
				
			||||||
  <component name="VcsDirectoryMappings">
 | 
					 | 
				
			||||||
    <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</project>
 | 
					 | 
				
			||||||
@@ -1,82 +0,0 @@
 | 
				
			|||||||
buildscript{
 | 
					 | 
				
			||||||
    repositories{
 | 
					 | 
				
			||||||
        maven{ url = 'https://files.minecraftforge.net/maven' }
 | 
					 | 
				
			||||||
        jcenter()
 | 
					 | 
				
			||||||
        mavenCentral()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dependencies{
 | 
					 | 
				
			||||||
        classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
apply plugin: 'net.minecraftforge.gradle'
 | 
					 | 
				
			||||||
apply plugin: 'eclipse'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def mcversion = "1.15.2"
 | 
					 | 
				
			||||||
def forgeversion = "31.0.14"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def prefixName = 'displayName = '
 | 
					 | 
				
			||||||
def prefixVersion = 'version = '
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def metaLines = file('src/main/resources/META-INF/mods.toml').readLines()
 | 
					 | 
				
			||||||
def metaName = metaLines.find { line -> line.startsWith(prefixName) }.substring(prefixName.length())[1..-2]
 | 
					 | 
				
			||||||
def metaVersion = metaLines.find { line -> line.startsWith(prefixVersion) }.substring(prefixVersion.length())[1..-2]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
group = 'chylex.customwindowtitle.forge'
 | 
					 | 
				
			||||||
version = metaVersion
 | 
					 | 
				
			||||||
archivesBaseName = metaName.replaceAll('\\s', '')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
minecraft{
 | 
					 | 
				
			||||||
    mappings channel: 'snapshot', version: '20200130-1.15.1'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    runs{
 | 
					 | 
				
			||||||
        client{
 | 
					 | 
				
			||||||
            workingDirectory file('run')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            mods{
 | 
					 | 
				
			||||||
                customwindowtitle{
 | 
					 | 
				
			||||||
                    source sourceSets.main
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        server{
 | 
					 | 
				
			||||||
            workingDirectory file('run')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            mods{
 | 
					 | 
				
			||||||
                customwindowtitle{
 | 
					 | 
				
			||||||
                    source sourceSets.main
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dependencies{
 | 
					 | 
				
			||||||
    minecraft 'net.minecraftforge:forge:' + mcversion + '-' + forgeversion
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
jar{
 | 
					 | 
				
			||||||
    archiveName = archivesBaseName + '-1.15+v' + version + '.jar'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    from('../'){
 | 
					 | 
				
			||||||
        include 'LICENSE'
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    manifest{
 | 
					 | 
				
			||||||
        attributes([
 | 
					 | 
				
			||||||
                'Specification-Title'  : 'customwindowtitle',
 | 
					 | 
				
			||||||
                'Specification-Version': '1',
 | 
					 | 
				
			||||||
                'Specification-Vendor' : 'chylex',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                'Implementation-Title'  : metaName,
 | 
					 | 
				
			||||||
                'Implementation-Version': metaVersion,
 | 
					 | 
				
			||||||
                'Implementation-Vendor' : 'chylex',
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
 | 
					 | 
				
			||||||
        ])
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,4 +0,0 @@
 | 
				
			|||||||
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
 | 
					 | 
				
			||||||
# This is required to provide enough memory for the Minecraft decompilation process.
 | 
					 | 
				
			||||||
org.gradle.jvmargs=-Xmx3G
 | 
					 | 
				
			||||||
org.gradle.daemon=false
 | 
					 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								Forge/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Forge/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,5 +0,0 @@
 | 
				
			|||||||
distributionBase=GRADLE_USER_HOME
 | 
					 | 
				
			||||||
distributionPath=wrapper/dists
 | 
					 | 
				
			||||||
zipStoreBase=GRADLE_USER_HOME
 | 
					 | 
				
			||||||
zipStorePath=wrapper/dists
 | 
					 | 
				
			||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip
 | 
					 | 
				
			||||||
							
								
								
									
										172
									
								
								Forge/gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										172
									
								
								Forge/gradlew
									
									
									
									
										vendored
									
									
								
							@@ -1,172 +0,0 @@
 | 
				
			|||||||
#!/usr/bin/env sh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
##############################################################################
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##  Gradle start up script for UN*X
 | 
					 | 
				
			||||||
##
 | 
					 | 
				
			||||||
##############################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Attempt to set APP_HOME
 | 
					 | 
				
			||||||
# Resolve links: $0 may be a link
 | 
					 | 
				
			||||||
PRG="$0"
 | 
					 | 
				
			||||||
# Need this for relative symlinks.
 | 
					 | 
				
			||||||
while [ -h "$PRG" ] ; do
 | 
					 | 
				
			||||||
    ls=`ls -ld "$PRG"`
 | 
					 | 
				
			||||||
    link=`expr "$ls" : '.*-> \(.*\)$'`
 | 
					 | 
				
			||||||
    if expr "$link" : '/.*' > /dev/null; then
 | 
					 | 
				
			||||||
        PRG="$link"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        PRG=`dirname "$PRG"`"/$link"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
SAVED="`pwd`"
 | 
					 | 
				
			||||||
cd "`dirname \"$PRG\"`/" >/dev/null
 | 
					 | 
				
			||||||
APP_HOME="`pwd -P`"
 | 
					 | 
				
			||||||
cd "$SAVED" >/dev/null
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
APP_NAME="Gradle"
 | 
					 | 
				
			||||||
APP_BASE_NAME=`basename "$0"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
					 | 
				
			||||||
DEFAULT_JVM_OPTS=""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
					 | 
				
			||||||
MAX_FD="maximum"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
warn () {
 | 
					 | 
				
			||||||
    echo "$*"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
die () {
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
    echo "$*"
 | 
					 | 
				
			||||||
    echo
 | 
					 | 
				
			||||||
    exit 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# OS specific support (must be 'true' or 'false').
 | 
					 | 
				
			||||||
cygwin=false
 | 
					 | 
				
			||||||
msys=false
 | 
					 | 
				
			||||||
darwin=false
 | 
					 | 
				
			||||||
nonstop=false
 | 
					 | 
				
			||||||
case "`uname`" in
 | 
					 | 
				
			||||||
  CYGWIN* )
 | 
					 | 
				
			||||||
    cygwin=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  Darwin* )
 | 
					 | 
				
			||||||
    darwin=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  MINGW* )
 | 
					 | 
				
			||||||
    msys=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
  NONSTOP* )
 | 
					 | 
				
			||||||
    nonstop=true
 | 
					 | 
				
			||||||
    ;;
 | 
					 | 
				
			||||||
esac
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Determine the Java command to use to start the JVM.
 | 
					 | 
				
			||||||
if [ -n "$JAVA_HOME" ] ; then
 | 
					 | 
				
			||||||
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
 | 
					 | 
				
			||||||
        # IBM's JDK on AIX uses strange locations for the executables
 | 
					 | 
				
			||||||
        JAVACMD="$JAVA_HOME/jre/sh/java"
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        JAVACMD="$JAVA_HOME/bin/java"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    if [ ! -x "$JAVACMD" ] ; then
 | 
					 | 
				
			||||||
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
location of your Java installation."
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
else
 | 
					 | 
				
			||||||
    JAVACMD="java"
 | 
					 | 
				
			||||||
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
location of your Java installation."
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Increase the maximum file descriptors if we can.
 | 
					 | 
				
			||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
 | 
					 | 
				
			||||||
    MAX_FD_LIMIT=`ulimit -H -n`
 | 
					 | 
				
			||||||
    if [ $? -eq 0 ] ; then
 | 
					 | 
				
			||||||
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
 | 
					 | 
				
			||||||
            MAX_FD="$MAX_FD_LIMIT"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        ulimit -n $MAX_FD
 | 
					 | 
				
			||||||
        if [ $? -ne 0 ] ; then
 | 
					 | 
				
			||||||
            warn "Could not set maximum file descriptor limit: $MAX_FD"
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# For Darwin, add options to specify how the application appears in the dock
 | 
					 | 
				
			||||||
if $darwin; then
 | 
					 | 
				
			||||||
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# For Cygwin, switch paths to Windows format before running java
 | 
					 | 
				
			||||||
if $cygwin ; then
 | 
					 | 
				
			||||||
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
 | 
					 | 
				
			||||||
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
 | 
					 | 
				
			||||||
    JAVACMD=`cygpath --unix "$JAVACMD"`
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # We build the pattern for arguments to be converted via cygpath
 | 
					 | 
				
			||||||
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
 | 
					 | 
				
			||||||
    SEP=""
 | 
					 | 
				
			||||||
    for dir in $ROOTDIRSRAW ; do
 | 
					 | 
				
			||||||
        ROOTDIRS="$ROOTDIRS$SEP$dir"
 | 
					 | 
				
			||||||
        SEP="|"
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    OURCYGPATTERN="(^($ROOTDIRS))"
 | 
					 | 
				
			||||||
    # Add a user-defined pattern to the cygpath arguments
 | 
					 | 
				
			||||||
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
 | 
					 | 
				
			||||||
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
					 | 
				
			||||||
    i=0
 | 
					 | 
				
			||||||
    for arg in "$@" ; do
 | 
					 | 
				
			||||||
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
 | 
					 | 
				
			||||||
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
 | 
					 | 
				
			||||||
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            eval `echo args$i`="\"$arg\""
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        i=$((i+1))
 | 
					 | 
				
			||||||
    done
 | 
					 | 
				
			||||||
    case $i in
 | 
					 | 
				
			||||||
        (0) set -- ;;
 | 
					 | 
				
			||||||
        (1) set -- "$args0" ;;
 | 
					 | 
				
			||||||
        (2) set -- "$args0" "$args1" ;;
 | 
					 | 
				
			||||||
        (3) set -- "$args0" "$args1" "$args2" ;;
 | 
					 | 
				
			||||||
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
 | 
					 | 
				
			||||||
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
 | 
					 | 
				
			||||||
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
 | 
					 | 
				
			||||||
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
 | 
					 | 
				
			||||||
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
 | 
					 | 
				
			||||||
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
 | 
					 | 
				
			||||||
    esac
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Escape application args
 | 
					 | 
				
			||||||
save () {
 | 
					 | 
				
			||||||
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
 | 
					 | 
				
			||||||
    echo " "
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
APP_ARGS=$(save "$@")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
 | 
					 | 
				
			||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
 | 
					 | 
				
			||||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
 | 
					 | 
				
			||||||
  cd "$(dirname "$0")"
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
exec "$JAVACMD" "$@"
 | 
					 | 
				
			||||||
							
								
								
									
										84
									
								
								Forge/gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										84
									
								
								Forge/gradlew.bat
									
									
									
									
										vendored
									
									
								
							@@ -1,84 +0,0 @@
 | 
				
			|||||||
@if "%DEBUG%" == "" @echo off
 | 
					 | 
				
			||||||
@rem ##########################################################################
 | 
					 | 
				
			||||||
@rem
 | 
					 | 
				
			||||||
@rem  Gradle startup script for Windows
 | 
					 | 
				
			||||||
@rem
 | 
					 | 
				
			||||||
@rem ##########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@rem Set local scope for the variables with windows NT shell
 | 
					 | 
				
			||||||
if "%OS%"=="Windows_NT" setlocal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set DIRNAME=%~dp0
 | 
					 | 
				
			||||||
if "%DIRNAME%" == "" set DIRNAME=.
 | 
					 | 
				
			||||||
set APP_BASE_NAME=%~n0
 | 
					 | 
				
			||||||
set APP_HOME=%DIRNAME%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
					 | 
				
			||||||
set DEFAULT_JVM_OPTS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@rem Find java.exe
 | 
					 | 
				
			||||||
if defined JAVA_HOME goto findJavaFromJavaHome
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set JAVA_EXE=java.exe
 | 
					 | 
				
			||||||
%JAVA_EXE% -version >NUL 2>&1
 | 
					 | 
				
			||||||
if "%ERRORLEVEL%" == "0" goto init
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo.
 | 
					 | 
				
			||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
					 | 
				
			||||||
echo.
 | 
					 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
echo location of your Java installation.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
goto fail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:findJavaFromJavaHome
 | 
					 | 
				
			||||||
set JAVA_HOME=%JAVA_HOME:"=%
 | 
					 | 
				
			||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if exist "%JAVA_EXE%" goto init
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
echo.
 | 
					 | 
				
			||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
					 | 
				
			||||||
echo.
 | 
					 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					 | 
				
			||||||
echo location of your Java installation.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
goto fail
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:init
 | 
					 | 
				
			||||||
@rem Get command-line arguments, handling Windows variants
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:win9xME_args
 | 
					 | 
				
			||||||
@rem Slurp the command line arguments.
 | 
					 | 
				
			||||||
set CMD_LINE_ARGS=
 | 
					 | 
				
			||||||
set _SKIP=2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:win9xME_args_slurp
 | 
					 | 
				
			||||||
if "x%~1" == "x" goto execute
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set CMD_LINE_ARGS=%*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:execute
 | 
					 | 
				
			||||||
@rem Setup the command line
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@rem Execute Gradle
 | 
					 | 
				
			||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:end
 | 
					 | 
				
			||||||
@rem End local scope for the variables with windows NT shell
 | 
					 | 
				
			||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:fail
 | 
					 | 
				
			||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 | 
					 | 
				
			||||||
rem the _cmd.exe /c_ return code!
 | 
					 | 
				
			||||||
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
 | 
					 | 
				
			||||||
exit /b 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:mainEnd
 | 
					 | 
				
			||||||
if "%OS%"=="Windows_NT" endlocal
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:omega
 | 
					 | 
				
			||||||
@@ -1,132 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
import java.io.IOException;
 | 
					 | 
				
			||||||
import java.io.InputStream;
 | 
					 | 
				
			||||||
import java.nio.charset.StandardCharsets;
 | 
					 | 
				
			||||||
import java.nio.file.Files;
 | 
					 | 
				
			||||||
import java.nio.file.Path;
 | 
					 | 
				
			||||||
import java.nio.file.Paths;
 | 
					 | 
				
			||||||
import java.nio.file.StandardOpenOption;
 | 
					 | 
				
			||||||
import java.util.Collections;
 | 
					 | 
				
			||||||
import java.util.HashMap;
 | 
					 | 
				
			||||||
import java.util.LinkedHashMap;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public final class TitleConfig{
 | 
					 | 
				
			||||||
	private static final Map<String, String> DEFAULTS;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static{
 | 
					 | 
				
			||||||
		final Map<String, String> defaults = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		defaults.put("title", "Minecraft {mcversion}");
 | 
					 | 
				
			||||||
		defaults.put("icon16", "");
 | 
					 | 
				
			||||||
		defaults.put("icon32", "");
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		DEFAULTS = Collections.unmodifiableMap(defaults);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public static TitleConfig read(final String folder){
 | 
					 | 
				
			||||||
		final Path configFile = Paths.get(folder, "customwindowtitle-client.toml");
 | 
					 | 
				
			||||||
		final Map<String, String> config = new LinkedHashMap<>(DEFAULTS);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			if (!Files.exists(configFile)){
 | 
					 | 
				
			||||||
				Files.write(configFile, config.entrySet().stream().map(entry -> String.format("%s = '%s'", entry.getKey(), entry.getValue())).collect(Collectors.toList()), StandardCharsets.UTF_8);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			else{
 | 
					 | 
				
			||||||
				Files.readAllLines(configFile, StandardCharsets.UTF_8).stream().map(String::trim).filter(line -> !line.isEmpty()).forEach(line -> {
 | 
					 | 
				
			||||||
					final String[] split = line.split("=", 2);
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					if (split.length != 2){
 | 
					 | 
				
			||||||
						throw new RuntimeException("CustomWindowTitle configuration has an invalid line: " + line);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					final String key = split[0].trim();
 | 
					 | 
				
			||||||
					final String value = parseTrimmedValue(split[1].trim());
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					if (config.containsKey(key)){
 | 
					 | 
				
			||||||
						config.put(key, value);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					else{
 | 
					 | 
				
			||||||
						throw new RuntimeException("CustomWindowTitle configuration has an invalid key: " + key);
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				});
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle configuration error", e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final String icon16 = config.get("icon16");
 | 
					 | 
				
			||||||
		final String icon32 = config.get("icon32");
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final Path pathIcon16 = icon16.isEmpty() ? null : Paths.get(folder, icon16);
 | 
					 | 
				
			||||||
		final Path pathIcon32 = icon32.isEmpty() ? null : Paths.get(folder, icon32);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if ((pathIcon16 == null) != (pathIcon32 == null)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle configuration specifies only one icon, both 'icon16' and 'icon32' must be set.");
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (pathIcon16 != null && Files.notExists(pathIcon16)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle 16x16 icon not found: " + pathIcon16);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (pathIcon32 != null && Files.notExists(pathIcon32)){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle 32x32 icon not found: " + pathIcon32);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return new TitleConfig(config.get("title"), pathIcon16, pathIcon32);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private static String parseTrimmedValue(String value){
 | 
					 | 
				
			||||||
		if (value.isEmpty()){
 | 
					 | 
				
			||||||
			return value;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		final char surrounding = value.charAt(0);
 | 
					 | 
				
			||||||
		final int length = value.length();
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (value.charAt(length - 1) == surrounding){
 | 
					 | 
				
			||||||
			value = value.substring(1, length - 1);
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			if (surrounding == '"'){
 | 
					 | 
				
			||||||
				value = value.replace("\\\"", "\"").replace("\\\\", "\\");
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return value;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private final String title;
 | 
					 | 
				
			||||||
	private final Path icon16;
 | 
					 | 
				
			||||||
	private final Path icon32;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private TitleConfig(final String title, final Path icon16, final Path icon32){
 | 
					 | 
				
			||||||
		this.title = title;
 | 
					 | 
				
			||||||
		this.icon16 = icon16;
 | 
					 | 
				
			||||||
		this.icon32 = icon32;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public String getTitle(){
 | 
					 | 
				
			||||||
		return title;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public boolean hasIcon(){
 | 
					 | 
				
			||||||
		return icon16 != null && icon32 != null;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public InputStream readIcon16(){
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			return Files.newInputStream(icon16, StandardOpenOption.READ);
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle could not open the specified 16x16 icon: " + icon16, e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public InputStream readIcon32(){
 | 
					 | 
				
			||||||
		try{
 | 
					 | 
				
			||||||
			return Files.newInputStream(icon32, StandardOpenOption.READ);
 | 
					 | 
				
			||||||
		}catch(final IOException e){
 | 
					 | 
				
			||||||
			throw new RuntimeException("CustomWindowTitle could not open the specified 32x32 icon: " + icon16, e);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class TokenException extends RuntimeException{
 | 
					 | 
				
			||||||
	public TokenException(final String message){
 | 
					 | 
				
			||||||
		super(message);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,40 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle.forge;
 | 
					 | 
				
			||||||
import chylex.customwindowtitle.TitleConfig;
 | 
					 | 
				
			||||||
import chylex.customwindowtitle.TitleParser;
 | 
					 | 
				
			||||||
import net.minecraft.client.MainWindow;
 | 
					 | 
				
			||||||
import net.minecraft.client.Minecraft;
 | 
					 | 
				
			||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.ExtensionPoint;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.ModLoadingContext;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.common.Mod;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.loading.FMLPaths;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.network.FMLNetworkConstants;
 | 
					 | 
				
			||||||
import org.apache.commons.lang3.tuple.Pair;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@Mod("customwindowtitle")
 | 
					 | 
				
			||||||
public class CustomWindowTitle{
 | 
					 | 
				
			||||||
	private final TitleConfig config;
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	public CustomWindowTitle(){
 | 
					 | 
				
			||||||
		config = TitleConfig.read(FMLPaths.CONFIGDIR.get().toString());
 | 
					 | 
				
			||||||
		ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.DISPLAYTEST, () -> Pair.of(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
 | 
					 | 
				
			||||||
		FMLJavaModLoadingContext.get().getModEventBus().register(this);
 | 
					 | 
				
			||||||
		TokenData.register();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	@SubscribeEvent
 | 
					 | 
				
			||||||
	public void onClientSetup(final FMLClientSetupEvent e){
 | 
					 | 
				
			||||||
		e.getMinecraftSupplier().get().execute(this::updateTitle);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	private void updateTitle(){
 | 
					 | 
				
			||||||
		final MainWindow window = Minecraft.getInstance().getMainWindow();
 | 
					 | 
				
			||||||
		window.func_230148_b_(TitleParser.parse(config.getTitle()));
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (config.hasIcon()){
 | 
					 | 
				
			||||||
			window.setWindowIcon(config.readIcon16(), config.readIcon32());
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,36 +0,0 @@
 | 
				
			|||||||
package chylex.customwindowtitle.forge;
 | 
					 | 
				
			||||||
import chylex.customwindowtitle.TokenException;
 | 
					 | 
				
			||||||
import net.minecraft.util.SharedConstants;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.ModList;
 | 
					 | 
				
			||||||
import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo;
 | 
					 | 
				
			||||||
import net.minecraftforge.forgespi.language.IModInfo;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.noArgs;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.oneArg;
 | 
					 | 
				
			||||||
import static chylex.customwindowtitle.TitleTokens.registerToken;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
final class TokenData{
 | 
					 | 
				
			||||||
	static void register(){
 | 
					 | 
				
			||||||
		registerToken("mcversion", noArgs(TokenData::getMinecraftVersion));
 | 
					 | 
				
			||||||
		registerToken("modversion", oneArg(TokenData::getModVersion));
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static String getMinecraftVersion(){
 | 
					 | 
				
			||||||
		return SharedConstants.getVersion().getName();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	static String getModVersion(final String modId){
 | 
					 | 
				
			||||||
		final ModFileInfo file = ModList.get().getModFileById(modId);
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		if (file == null){
 | 
					 | 
				
			||||||
			throw new TokenException("mod file for '" + modId + "' not found");
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		for(final IModInfo info : file.getMods()){
 | 
					 | 
				
			||||||
			if (info.getModId().equals(modId)){
 | 
					 | 
				
			||||||
				return info.getVersion().toString();
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		throw new TokenException("mod info for '" + modId + "' not found");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "CustomWindowTitle": "coremods/main.js"
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,26 +0,0 @@
 | 
				
			|||||||
modLoader = "javafml"
 | 
					 | 
				
			||||||
loaderVersion = "[31,)"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
authors = "chylex"
 | 
					 | 
				
			||||||
license = "Unlicense"
 | 
					 | 
				
			||||||
issueTrackerURL = "https://github.com/chylex/Minecraft-Window-Title/issues"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[mods]]
 | 
					 | 
				
			||||||
modId = "customwindowtitle"
 | 
					 | 
				
			||||||
version = "1.1.1"
 | 
					 | 
				
			||||||
displayName = "Custom Window Title"
 | 
					 | 
				
			||||||
displayURL = "https://github.com/chylex/Minecraft-Window-Title"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[dependencies.customwindowtitle]]
 | 
					 | 
				
			||||||
modId = "minecraft"
 | 
					 | 
				
			||||||
mandatory = true
 | 
					 | 
				
			||||||
versionRange = "[1.15.2,)"
 | 
					 | 
				
			||||||
ordering = "NONE"
 | 
					 | 
				
			||||||
side = "CLIENT"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[[dependencies.customwindowtitle]]
 | 
					 | 
				
			||||||
modId = "forge"
 | 
					 | 
				
			||||||
mandatory = true
 | 
					 | 
				
			||||||
versionRange = "[31,)"
 | 
					 | 
				
			||||||
ordering = "NONE"
 | 
					 | 
				
			||||||
side = "CLIENT"
 | 
					 | 
				
			||||||
@@ -1,19 +0,0 @@
 | 
				
			|||||||
function initializeCoreMod(){
 | 
					 | 
				
			||||||
    var opcodes = Java.type("org.objectweb.asm.Opcodes");
 | 
					 | 
				
			||||||
    var InsnNode = Java.type("org.objectweb.asm.tree.InsnNode");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
        "CustomWindowTitle": {
 | 
					 | 
				
			||||||
            "target": {
 | 
					 | 
				
			||||||
                "type": "METHOD",
 | 
					 | 
				
			||||||
                "class": "net.minecraft.client.Minecraft",
 | 
					 | 
				
			||||||
                "methodName": "func_230150_b_",
 | 
					 | 
				
			||||||
                "methodDesc": "()V"
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            "transformer": function(methodNode){
 | 
					 | 
				
			||||||
                methodNode.instructions.insert(new InsnNode(opcodes.RETURN));
 | 
					 | 
				
			||||||
                return methodNode;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,7 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
    "pack": {
 | 
					 | 
				
			||||||
        "description": "Custom Window Title",
 | 
					 | 
				
			||||||
        "pack_format": 5,
 | 
					 | 
				
			||||||
        "_comment": ""
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,11 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<module type="JAVA_MODULE" version="4">
 | 
					 | 
				
			||||||
  <component name="NewModuleRootManager" inherit-compiler-output="true">
 | 
					 | 
				
			||||||
    <exclude-output />
 | 
					 | 
				
			||||||
    <content url="file://$MODULE_DIR$" />
 | 
					 | 
				
			||||||
    <orderEntry type="inheritedJdk" />
 | 
					 | 
				
			||||||
    <orderEntry type="sourceFolder" forTests="false" />
 | 
					 | 
				
			||||||
    <orderEntry type="module" module-name="Fabric" />
 | 
					 | 
				
			||||||
    <orderEntry type="module" module-name="Forge" />
 | 
					 | 
				
			||||||
  </component>
 | 
					 | 
				
			||||||
</module>
 | 
					 | 
				
			||||||
							
								
								
									
										51
									
								
								NeoForge/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								NeoForge/build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					import net.neoforged.moddevgradle.dsl.RunModel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val modId: String by project
 | 
				
			||||||
 | 
					val modSides: String by project
 | 
				
			||||||
 | 
					val neoForgeVersion: String by project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					plugins {
 | 
				
			||||||
 | 
						id("net.neoforged.moddev")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					neoForge {
 | 
				
			||||||
 | 
						version = neoForgeVersion
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						mods {
 | 
				
			||||||
 | 
							register(modId) {
 | 
				
			||||||
 | 
								sourceSet(sourceSets.main.get())
 | 
				
			||||||
 | 
								sourceSet(rootProject.sourceSets.main.get())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						runs {
 | 
				
			||||||
 | 
							val runJvmArgs: Set<String> by project
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							configureEach {
 | 
				
			||||||
 | 
								gameDirectory = file("../run")
 | 
				
			||||||
 | 
								jvmArguments.addAll(runJvmArgs)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							fun side(name: String, configure: RunModel.() -> Unit) {
 | 
				
			||||||
 | 
								if (modSides == "both" || modSides == name) {
 | 
				
			||||||
 | 
									register(name, configure)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							side("client") {
 | 
				
			||||||
 | 
								ideName.set("NeoForge Client")
 | 
				
			||||||
 | 
								client()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							side("server") {
 | 
				
			||||||
 | 
								ideName.set("NeoForge Server")
 | 
				
			||||||
 | 
								server()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tasks.processResources {
 | 
				
			||||||
 | 
						filesMatching("META-INF/neoforge.mods.toml") {
 | 
				
			||||||
 | 
							expand(inputs.properties)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.neoforge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TitleChanger;
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TitleConfig;
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.data.CommonTokenData;
 | 
				
			||||||
 | 
					import net.neoforged.bus.api.IEventBus;
 | 
				
			||||||
 | 
					import net.neoforged.bus.api.SubscribeEvent;
 | 
				
			||||||
 | 
					import net.neoforged.fml.common.Mod;
 | 
				
			||||||
 | 
					import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent;
 | 
				
			||||||
 | 
					import net.neoforged.fml.loading.FMLPaths;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Mod("customwindowtitle")
 | 
				
			||||||
 | 
					public class CustomWindowTitle {
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private final TitleConfig config;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public CustomWindowTitle(IEventBus eventBus) {
 | 
				
			||||||
 | 
							config = TitleConfig.load(FMLPaths.CONFIGDIR.get().toString());
 | 
				
			||||||
 | 
							eventBus.addListener(this::onClientSetup);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@SubscribeEvent
 | 
				
			||||||
 | 
						public void onClientSetup(final FMLClientSetupEvent e) {
 | 
				
			||||||
 | 
							CommonTokenData.register(new TokenProvider());
 | 
				
			||||||
 | 
							e.enqueueWork(() -> TitleChanger.setTitle(config));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.neoforge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TokenException;
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.data.CommonTokenProvider;
 | 
				
			||||||
 | 
					import net.neoforged.fml.ModList;
 | 
				
			||||||
 | 
					import net.neoforged.neoforgespi.language.IModFileInfo;
 | 
				
			||||||
 | 
					import net.neoforged.neoforgespi.language.IModInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class TokenProvider implements CommonTokenProvider {
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public String getModVersion(final String modId) {
 | 
				
			||||||
 | 
							final IModFileInfo file = ModList.get().getModFileById(modId);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (file == null) {
 | 
				
			||||||
 | 
								throw new TokenException("mod file for '" + modId + "' not found");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							for (final IModInfo info : file.getMods()) {
 | 
				
			||||||
 | 
								if (info.getModId().equals(modId)) {
 | 
				
			||||||
 | 
									return info.getVersion().toString();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							throw new TokenException("mod info for '" + modId + "' not found");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										30
									
								
								NeoForge/src/main/resources/META-INF/neoforge.mods.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								NeoForge/src/main/resources/META-INF/neoforge.mods.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					modLoader = "javafml"
 | 
				
			||||||
 | 
					loaderVersion = "[0,)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					license = "${license}"
 | 
				
			||||||
 | 
					issueTrackerURL = "${issuesURL}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[mods]]
 | 
				
			||||||
 | 
					modId = "${id}"
 | 
				
			||||||
 | 
					displayName = "${name}"
 | 
				
			||||||
 | 
					displayURL = "${sourcesURL}"
 | 
				
			||||||
 | 
					description = "${description}"
 | 
				
			||||||
 | 
					authors = "${author}"
 | 
				
			||||||
 | 
					version = "${version}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[mixins]]
 | 
				
			||||||
 | 
					config = "${id}.mixins.json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[dependencies.${id}]]
 | 
				
			||||||
 | 
					modId = "minecraft"
 | 
				
			||||||
 | 
					type = "required"
 | 
				
			||||||
 | 
					versionRange = "[${minimumMinecraftVersion},)"
 | 
				
			||||||
 | 
					ordering = "NONE"
 | 
				
			||||||
 | 
					side = "${sidesForNeoForge}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[dependencies.${id}]]
 | 
				
			||||||
 | 
					modId = "neoforge"
 | 
				
			||||||
 | 
					type = "required"
 | 
				
			||||||
 | 
					versionRange = "[${minimumNeoForgeVersion},)"
 | 
				
			||||||
 | 
					ordering = "NONE"
 | 
				
			||||||
 | 
					side = "${sidesForNeoForge}"
 | 
				
			||||||
							
								
								
									
										46
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								README.md
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Installation
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The mod supports [Forge](https://files.minecraftforge.net/) and [Fabric](https://fabricmc.net/) (*) mod loaders, **the same mod file will work in both**. Follow either mod loader's installation guide, then [download the mod file](https://www.curseforge.com/minecraft/mc-mods/custom-window-title/files) for your Minecraft version, and install it into the **.minecraft/mods** folder.
 | 
					The mod supports [NeoForge](https://neoforged.net/) and [Fabric](https://fabricmc.net/) (*) mod loaders. Follow either mod loader's installation guide, then download the mod file for your Minecraft version from [CurseForge](https://www.curseforge.com/minecraft/mc-mods/custom-window-title/files) or [Modrinth](https://modrinth.com/mod/custom-window-title/versions), and install it into the `.minecraft/mods` folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(*) Fabric API is **not** required.
 | 
					(*) Fabric API is **not** required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -10,12 +10,11 @@ The mod supports [Forge](https://files.minecraftforge.net/) and [Fabric](https:/
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Run the game once to create the configuration file. By default, the window title will be set to **Minecraft _<version>_**. Unlike in vanilla 1.15.2 onwards, the title will not change when you enter a world/server.
 | 
					Run the game once to create the configuration file. By default, the window title will be set to **Minecraft _<version>_**. Unlike in vanilla 1.15.2 onwards, the title will not change when you enter a world/server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To change the title or icon, navigate to the **.minecraft/config** folder, and open **customwindowtitle-client.toml** in a text editor. You will see the following entries:
 | 
					To change the title or icon, navigate to the `.minecraft/config` folder, and open `customwindowtitle-client.toml` in a text editor. You will see the following entries:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```toml
 | 
					```toml
 | 
				
			||||||
title = 'Minecraft {mcversion}'  
 | 
					title = 'Minecraft {mcversion}'  
 | 
				
			||||||
icon16 = ''  
 | 
					icon = ''  
 | 
				
			||||||
icon32 = ''
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Only edit text inside quotes or apostrophes.
 | 
					Only edit text inside quotes or apostrophes.
 | 
				
			||||||
@@ -24,28 +23,38 @@ Only edit text inside quotes or apostrophes.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
You can use the following special tokens in the _title_ configuration entry:
 | 
					You can use the following special tokens in the _title_ configuration entry:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* **{mcversion}** - current Minecraft version
 | 
					* `{mcversion}` - current Minecraft version
 | 
				
			||||||
* **{modversion:<span style="text-decoration: underline;">modid</span>}** - version of installed mod with the identifier _modid_
 | 
					* `{modversion:<mod_id>}` - version of installed mod with the identifier `<mod_id>`
 | 
				
			||||||
 | 
					* `{username}` - current username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
If any of the tokens aren't working, search the game log for **CustomWindowTitle** and you should see the reason, otherwise please file an issue on the [issue tracker](https://github.com/chylex/Minecraft-Window-Title/issues) with as many details as possible.
 | 
					If any of the tokens aren't working, search the game log for **CustomWindowTitle** and you should see the reason, otherwise please file an issue on the [issue tracker](https://github.com/chylex/Minecraft-Window-Title/issues) with as many details as possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Changing the Icon
 | 
					### Changing the Icon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
You must create two PNG images with sizes 16x16 and 32x32 pixels. The images **must be saved with transparency** even if they don't use it, **otherwise the icons will appear corrupted**. In Krita for example, you must check _Store alpha channel (transparency)_ when saving the image.
 | 
					#### Minecraft 1.21+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The _icon16_ and _icon32_ configuration entries point to the PNG files relative to the **.minecraft/config** folder. For example, if you place the two icons in a folder named _customwindowtitle_ as follows:
 | 
					**This feature is only available in Custom Window Title 1.4.0 and newer.**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `.minecraft/config/customwindowtitle-client.toml`
 | 
					Create a square PNG image whose dimensions are a power of two, such as 32x32 or 48x48. Put the PNG file into the `.minecraft/config` folder, either directly or into a subfolder.
 | 
				
			||||||
* `.minecraft/config/customwindowtitle/icon16.png`
 | 
					 | 
				
			||||||
* `.minecraft/config/customwindowtitle/icon32.png`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Then, the two icon entries should look like this:
 | 
					The icon **must be saved with transparency** even if it doesn't use it, otherwise the icon may be corrupted or not appear at all. In Krita, for example, you must check _Store alpha channel (transparency)_ when saving.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The _icon_ configuration entry points to the PNG file relative to `.minecraft/config`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example, if you placed the icon into `.minecraft/config/customwindowtitle/icon.png`, then the configuration entry should look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```toml
 | 
					```toml
 | 
				
			||||||
icon16 = 'customwindowtitle/icon16.png'  
 | 
					icon = 'customwindowtitle/icon.png'
 | 
				
			||||||
icon32 = 'customwindowtitle/icon32.png'
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This feature is not available in Minecraft 1.20.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.19 and older
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead of one `icon` configuration entry, there are two configuration entries `icon16` and `icon32` for icons with dimensions 16x16 and 32x32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Screenshots
 | 
					## Screenshots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
These screenshots were taken using the following example configuration:
 | 
					These screenshots were taken using the following example configuration:
 | 
				
			||||||
@@ -58,6 +67,11 @@ title = "Minecraft {mcversion} - Custom Window Title {modversion:customwindowtit
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# For Developers
 | 
					# For Developers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Currently the common source files (package `chylex.customwindowtitle`) are just duplicated in the Forge and Fabric folders, and the jar files are combined with a horrible python script. If anyone has the time and patience to clean it up, I'd appreciate a Pull Request :P
 | 
					The mod sources are organized into 3 projects:
 | 
				
			||||||
 | 
					- `src/` contains common source files and mixins
 | 
				
			||||||
 | 
					- `Fabric/src/` contains source files specific for Fabric
 | 
				
			||||||
 | 
					- `NeoForge/src/` contains source files specific for NeoForge
 | 
				
			||||||
 | 
					
 | 
				
			||||||
For now, you can build either separate Forge and Fabric projects using `gradlew build` in either folder, or run `python BuildMerge.py` to automatically build both and combine them into a single `.jar` file.
 | 
					The `assemble` Gradle task creates a single `.jar` file for both mod loaders in the `build/dist` folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When building against a Minecraft version that is only supported by one mod loader, open `gradle.properties` and comment or remove either `neoForgeVersion` or `fabricVersion` to disable them.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										214
									
								
								build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,214 @@
 | 
				
			|||||||
 | 
					@file:Suppress("ConvertLambdaToReference")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.gradle.jvm.tasks.Jar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val modId: String by project
 | 
				
			||||||
 | 
					val modName: String by project
 | 
				
			||||||
 | 
					val modDescription: String by project
 | 
				
			||||||
 | 
					val modAuthor: String by project
 | 
				
			||||||
 | 
					val modVersion: String by project
 | 
				
			||||||
 | 
					val modLicense: String by project
 | 
				
			||||||
 | 
					val modSourcesURL: String by project
 | 
				
			||||||
 | 
					val modIssuesURL: String by project
 | 
				
			||||||
 | 
					val modSides: String by project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val minecraftVersion: String by project
 | 
				
			||||||
 | 
					val mixinVersion: String by project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val minimumMinecraftVersion: String by project
 | 
				
			||||||
 | 
					val minimumNeoForgeVersion: String by project
 | 
				
			||||||
 | 
					val minimumFabricVersion: String by project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val modNameStripped = modName.replace(" ", "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					plugins {
 | 
				
			||||||
 | 
						idea
 | 
				
			||||||
 | 
						`java-library`
 | 
				
			||||||
 | 
						id("fabric-loom")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					idea {
 | 
				
			||||||
 | 
						module {
 | 
				
			||||||
 | 
							excludeDirs.add(file("gradle"))
 | 
				
			||||||
 | 
							excludeDirs.add(file("run"))
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (findProject(":NeoForge") == null) {
 | 
				
			||||||
 | 
								excludeDirs.add(file("NeoForge"))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (findProject(":Fabric") == null) {
 | 
				
			||||||
 | 
								excludeDirs.add(file("Fabric"))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					repositories {
 | 
				
			||||||
 | 
						mavenCentral()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					base {
 | 
				
			||||||
 | 
						archivesName.set("$modNameStripped-Common")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loom {
 | 
				
			||||||
 | 
						runs {
 | 
				
			||||||
 | 
							named("client") {
 | 
				
			||||||
 | 
								ideConfigGenerated(false)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							findByName("server")?.let(::remove)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dependencies {
 | 
				
			||||||
 | 
						minecraft("com.mojang:minecraft:$minecraftVersion")
 | 
				
			||||||
 | 
						mappings(loom.officialMojangMappings())
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						compileOnly("net.fabricmc:sponge-mixin:$mixinVersion")
 | 
				
			||||||
 | 
						api("com.google.code.findbugs:jsr305:3.0.2")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					allprojects {
 | 
				
			||||||
 | 
						group = "com.$modAuthor.$modId"
 | 
				
			||||||
 | 
						version = modVersion
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						apply(plugin = "java-library")
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						extensions.getByType<JavaPluginExtension>().apply {
 | 
				
			||||||
 | 
							toolchain.languageVersion.set(JavaLanguageVersion.of(21))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.withType<JavaCompile> {
 | 
				
			||||||
 | 
							options.encoding = "UTF-8"
 | 
				
			||||||
 | 
							options.release.set(21)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						val runJvmArgs = mutableSetOf<String>().also {
 | 
				
			||||||
 | 
							extra["runJvmArgs"] = it
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (project.javaToolchains.launcherFor(java.toolchain).map { it.metadata.vendor }.orNull == "JetBrains") {
 | 
				
			||||||
 | 
							runJvmArgs.add("-XX:+AllowEnhancedClassRedefinition")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						dependencies {
 | 
				
			||||||
 | 
							implementation("org.jetbrains:annotations:24.1.0")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.withType<ProcessResources> {
 | 
				
			||||||
 | 
							val (sidesForNeoForge, sidesForFabric) = when (modSides) {
 | 
				
			||||||
 | 
								"both"   -> Pair("BOTH", "*")
 | 
				
			||||||
 | 
								"client" -> Pair("CLIENT", "client")
 | 
				
			||||||
 | 
								"server" -> Pair("SERVER", "server")
 | 
				
			||||||
 | 
								else     -> error("Invalid modSides value: $modSides")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							inputs.property("id", modId)
 | 
				
			||||||
 | 
							inputs.property("name", modName)
 | 
				
			||||||
 | 
							inputs.property("description", modDescription)
 | 
				
			||||||
 | 
							inputs.property("version", modVersion)
 | 
				
			||||||
 | 
							inputs.property("author", modAuthor)
 | 
				
			||||||
 | 
							inputs.property("license", modLicense)
 | 
				
			||||||
 | 
							inputs.property("sourcesURL", modSourcesURL)
 | 
				
			||||||
 | 
							inputs.property("issuesURL", modIssuesURL)
 | 
				
			||||||
 | 
							inputs.property("sidesForNeoForge", sidesForNeoForge)
 | 
				
			||||||
 | 
							inputs.property("sidesForFabric", sidesForFabric)
 | 
				
			||||||
 | 
							inputs.property("minimumMinecraftVersion", minimumMinecraftVersion)
 | 
				
			||||||
 | 
							inputs.property("minimumNeoForgeVersion", minimumNeoForgeVersion)
 | 
				
			||||||
 | 
							inputs.property("minimumFabricVersion", minimumFabricVersion)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							from(rootProject.file("logo.png")) {
 | 
				
			||||||
 | 
								into("assets/$modId")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.withType<AbstractArchiveTask>().configureEach {
 | 
				
			||||||
 | 
							isPreserveFileTimestamps = false
 | 
				
			||||||
 | 
							isReproducibleFileOrder = true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					subprojects {
 | 
				
			||||||
 | 
						dependencies {
 | 
				
			||||||
 | 
							implementation(project(rootProject.path, configuration = "namedElements"))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						base {
 | 
				
			||||||
 | 
							archivesName.set("$modNameStripped-${project.name}")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.compileJava {
 | 
				
			||||||
 | 
							source({ rootProject.sourceSets.main.get().allSource })
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.processResources {
 | 
				
			||||||
 | 
							from(rootProject.sourceSets.main.get().resources) {
 | 
				
			||||||
 | 
								expand(inputs.properties)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.jar {
 | 
				
			||||||
 | 
							entryCompression = ZipEntryCompression.STORED // Reduces size of multiloader jar.
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							manifest {
 | 
				
			||||||
 | 
								packageInformation(modId, "$modNameStripped-${project.name}")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						tasks.test {
 | 
				
			||||||
 | 
							onlyIf { false }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fun Manifest.packageInformation(specificationTitle: String, implementationTitle: String) {
 | 
				
			||||||
 | 
						attributes(
 | 
				
			||||||
 | 
							"Specification-Title" to specificationTitle,
 | 
				
			||||||
 | 
							"Specification-Vendor" to modAuthor,
 | 
				
			||||||
 | 
							"Specification-Version" to "1",
 | 
				
			||||||
 | 
							"Implementation-Title" to implementationTitle,
 | 
				
			||||||
 | 
							"Implementation-Vendor" to modAuthor,
 | 
				
			||||||
 | 
							"Implementation-Version" to modVersion,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val multiloaderSources = sourceSets.register("multiloader")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val multiloaderJar = tasks.register<Jar>("multiloaderJar") {
 | 
				
			||||||
 | 
						group = "build"
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						archiveBaseName.set(modNameStripped)
 | 
				
			||||||
 | 
						archiveVersion.set("$minecraftVersion+v$modVersion")
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						destinationDirectory = layout.buildDirectory.dir("dist")
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						fun includeJar(project: Project, jarTaskName: String) {
 | 
				
			||||||
 | 
							from(project.tasks.named(jarTaskName).map { it.outputs }) {
 | 
				
			||||||
 | 
								into("jars")
 | 
				
			||||||
 | 
								rename { "$modNameStripped-${project.name}.jar" }
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						findProject(":NeoForge")?.let { includeJar(it, "jar") }
 | 
				
			||||||
 | 
						findProject(":Fabric")?.let { includeJar(it, "uncompressedRemapJar") }
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						from(rootProject.file("LICENSE"))
 | 
				
			||||||
 | 
						from(multiloaderSources.map { it.output })
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						manifest {
 | 
				
			||||||
 | 
							packageInformation("$modId-multiloader", modNameStripped)
 | 
				
			||||||
 | 
							attributes("FMLModType" to "GAMELIBRARY")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tasks.named<ProcessResources>("processMultiloaderResources").configure {
 | 
				
			||||||
 | 
						inputs.property("group", project.group)
 | 
				
			||||||
 | 
						inputs.property("jarPrefix", modNameStripped)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						filesMatching(listOf("fabric.mod.json", "META-INF/jarjar/metadata.json")) {
 | 
				
			||||||
 | 
							expand(inputs.properties)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tasks.assemble {
 | 
				
			||||||
 | 
						finalizedBy(multiloaderJar)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										65
									
								
								docs/CURSEFORGE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								docs/CURSEFORGE.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The mod supports [NeoForge](https://neoforged.net/) and [Fabric](https://fabricmc.net/) (*) mod loaders. Follow either mod loader's installation guide, then [download the mod file](https://www.curseforge.com/minecraft/mc-mods/custom-window-title/files) for your Minecraft version, and install it into the `.minecraft/mods` folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(*) Fabric API is **not** required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Run the game once to create the configuration file. By default, the window title will be set to **Minecraft _<version>_**. Unlike in vanilla 1.15.2 onwards, the title will not change when you enter a world/server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To change the title or icon, navigate to the `.minecraft/config` folder, and open `customwindowtitle-client.toml` in a text editor. You will see the following entries:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					title = 'Minecraft {mcversion}'  
 | 
				
			||||||
 | 
					icon16 = ''  
 | 
				
			||||||
 | 
					icon32 = ''
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Only edit text inside quotes or apostrophes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changing the Title
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can use the following special tokens in the _title_ configuration entry:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `{mcversion}` - current Minecraft version
 | 
				
			||||||
 | 
					* `{modversion:mod_id}` - version of installed mod with the identifier `mod_id`
 | 
				
			||||||
 | 
					* `{username}` - current username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any of the tokens aren't working, search the game log for **CustomWindowTitle** and you should see the reason, otherwise please file an issue on the [issue tracker](https://github.com/chylex/Minecraft-Window-Title/issues) with as many details as possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changing the Icon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.21+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**This feature is only available in Custom Window Title 1.4.0 and newer.**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Create a square PNG image whose dimensions are a power of two, such as 32x32 or 48x48. Put the PNG file into the `.minecraft/config` folder, either directly or into a subfolder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The icon **must be saved with transparency** even if it doesn't use it, otherwise the icon may be corrupted or not appear at all. In Krita, for example, you must check _Store alpha channel (transparency)_ when saving.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The _icon_ configuration entry points to the PNG file relative to `.minecraft/config`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example, if you placed the icon into `.minecraft/config/customwindowtitle/icon.png`, then the configuration entry should look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					icon = 'customwindowtitle/icon.png'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This feature is not available in Minecraft 1.20.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.19 and older
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead of one `icon` configuration entry, there are two configuration entries `icon16` and `icon32` for icons with dimensions 16x16 and 32x32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Screenshots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These screenshots were taken using the following example configuration:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					title = "Minecraft {mcversion} - Custom Window Title {modversion:customwindowtitle}"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<img src="https://media.forgecdn.net/attachments/277/212/customwindowtitlefabric.png" width="417" height="284"><img src="https://media.forgecdn.net/attachments/277/213/customwindowtitleforge.png" alt="" width="417" height="284">
 | 
				
			||||||
							
								
								
									
										66
									
								
								docs/MODRINTH.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								docs/MODRINTH.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The mod supports [NeoForge](https://neoforged.net/) and [Fabric](https://fabricmc.net/) (*) mod loaders. Follow either mod loader's installation guide, then [download the mod file](https://modrinth.com/mod/custom-window-title/versions) for your Minecraft version, and install it into the `.minecraft/mods` folder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(*) Fabric API is **not** required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Configuration
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Run the game once to create the configuration file. By default, the window title will be set to **Minecraft _<version>_**. Unlike in vanilla 1.15.2 onwards, the title will not change when you enter a world/server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To change the title or icon, navigate to the `.minecraft/config` folder, and open `customwindowtitle-client.toml` in a text editor. You will see the following entries:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					title = 'Minecraft {mcversion}'  
 | 
				
			||||||
 | 
					icon16 = ''  
 | 
				
			||||||
 | 
					icon32 = ''
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Only edit text inside quotes or apostrophes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changing the Title
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can use the following special tokens in the _title_ configuration entry:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `{mcversion}` - current Minecraft version
 | 
				
			||||||
 | 
					* `{modversion:<mod_id>}` - version of installed mod with the identifier `<mod_id>`
 | 
				
			||||||
 | 
					* `{username}` - current username
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If any of the tokens aren't working, search the game log for **CustomWindowTitle** and you should see the reason, otherwise please file an issue on the [issue tracker](https://github.com/chylex/Minecraft-Window-Title/issues) with as many details as possible.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changing the Icon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.21+
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**This feature is only available in Custom Window Title 1.4.0 and newer.**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Create a square PNG image whose dimensions are a power of two, such as 32x32 or 48x48. Put the PNG file into the `.minecraft/config` folder, either directly or into a subfolder.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The icon **must be saved with transparency** even if it doesn't use it, otherwise the icon may be corrupted or not appear at all. In Krita, for example, you must check _Store alpha channel (transparency)_ when saving.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The _icon_ configuration entry points to the PNG file relative to `.minecraft/config`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For example, if you placed the icon into `.minecraft/config/customwindowtitle/icon.png`, then the configuration entry should look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					icon = 'customwindowtitle/icon.png'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This feature is not available in Minecraft 1.20.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Minecraft 1.19 and older
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Instead of one `icon` configuration entry, there are two configuration entries `icon16` and `icon32` for icons with dimensions 16x16 and 32x32.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Screenshots
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These screenshots were taken using the following example configuration:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```toml
 | 
				
			||||||
 | 
					title = "Minecraft {mcversion} - Custom Window Title {modversion:customwindowtitle}"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										32
									
								
								gradle.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								gradle.properties
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					# Mod
 | 
				
			||||||
 | 
					modId=customwindowtitle
 | 
				
			||||||
 | 
					modName=Custom Window Title
 | 
				
			||||||
 | 
					modDescription=Customize window title and icon.
 | 
				
			||||||
 | 
					modAuthor=chylex
 | 
				
			||||||
 | 
					modVersion=1.4.0
 | 
				
			||||||
 | 
					modLicense=Unlicense
 | 
				
			||||||
 | 
					modSourcesURL=https://github.com/chylex/Minecraft-Window-Title
 | 
				
			||||||
 | 
					modIssuesURL=https://github.com/chylex/Minecraft-Window-Title/issues
 | 
				
			||||||
 | 
					modSides=client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dependencies
 | 
				
			||||||
 | 
					minecraftVersion=1.21.4
 | 
				
			||||||
 | 
					neoForgeVersion=21.4.77-beta
 | 
				
			||||||
 | 
					neoModDevVersion=2.0.76
 | 
				
			||||||
 | 
					fabricVersion=0.16.10
 | 
				
			||||||
 | 
					loomVersion=1.9
 | 
				
			||||||
 | 
					mixinVersion=0.12.5+mixin.0.8.5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# https://projects.neoforged.net/neoforged/neoforge
 | 
				
			||||||
 | 
					# https://projects.neoforged.net/neoforged/moddevgradle
 | 
				
			||||||
 | 
					# https://fabricmc.net/develop/
 | 
				
			||||||
 | 
					# https://github.com/FabricMC/fabric-loom/releases
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Constraints
 | 
				
			||||||
 | 
					minimumMinecraftVersion=1.21
 | 
				
			||||||
 | 
					minimumNeoForgeVersion=21.0.0-beta
 | 
				
			||||||
 | 
					minimumFabricVersion=0.12.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Gradle
 | 
				
			||||||
 | 
					org.gradle.jvmargs=-Xmx3G
 | 
				
			||||||
 | 
					org.gradle.daemon=false
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -1,5 +1,7 @@
 | 
				
			|||||||
distributionBase=GRADLE_USER_HOME
 | 
					distributionBase=GRADLE_USER_HOME
 | 
				
			||||||
distributionPath=wrapper/dists
 | 
					distributionPath=wrapper/dists
 | 
				
			||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
 | 
					distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
 | 
				
			||||||
 | 
					networkTimeout=10000
 | 
				
			||||||
 | 
					validateDistributionUrl=true
 | 
				
			||||||
zipStoreBase=GRADLE_USER_HOME
 | 
					zipStoreBase=GRADLE_USER_HOME
 | 
				
			||||||
zipStorePath=wrapper/dists
 | 
					zipStorePath=wrapper/dists
 | 
				
			||||||
							
								
								
									
										251
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								gradlew
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,251 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright © 2015-2021 the original authors.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					# you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					# You may obtain a copy of the License at
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#      https://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					# distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					# See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					# limitations under the License.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   Gradle start up script for POSIX generated by Gradle.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   Important for running:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
 | 
				
			||||||
 | 
					#       noncompliant, but you have some other compliant shell such as ksh or
 | 
				
			||||||
 | 
					#       bash, then to run this script, type that shell name before the whole
 | 
				
			||||||
 | 
					#       command line, like:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#           ksh Gradle
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#       Busybox and similar reduced shells will NOT work, because this script
 | 
				
			||||||
 | 
					#       requires all of these POSIX shell features:
 | 
				
			||||||
 | 
					#         * functions;
 | 
				
			||||||
 | 
					#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
 | 
				
			||||||
 | 
					#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
 | 
				
			||||||
 | 
					#         * compound commands having a testable exit status, especially «case»;
 | 
				
			||||||
 | 
					#         * various built-in commands including «command», «set», and «ulimit».
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   Important for patching:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   (2) This script targets any POSIX shell, so it avoids extensions provided
 | 
				
			||||||
 | 
					#       by Bash, Ksh, etc; in particular arrays are avoided.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#       The "traditional" practice of packing multiple parameters into a
 | 
				
			||||||
 | 
					#       space-separated string is a well documented source of bugs and security
 | 
				
			||||||
 | 
					#       problems, so this is (mostly) avoided, by progressively accumulating
 | 
				
			||||||
 | 
					#       options in "$@", and eventually passing that to Java.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
 | 
				
			||||||
 | 
					#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
 | 
				
			||||||
 | 
					#       see the in-line comments for details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#       There are tweaks for specific operating systems such as AIX, CygWin,
 | 
				
			||||||
 | 
					#       Darwin, MinGW, and NonStop.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   (3) This script is generated from the Groovy template
 | 
				
			||||||
 | 
					#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
 | 
				
			||||||
 | 
					#       within the Gradle project.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#       You can find Gradle at https://github.com/gradle/gradle/.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Attempt to set APP_HOME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Resolve links: $0 may be a link
 | 
				
			||||||
 | 
					app_path=$0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Need this for daisy-chained symlinks.
 | 
				
			||||||
 | 
					while
 | 
				
			||||||
 | 
					    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
 | 
				
			||||||
 | 
					    [ -h "$app_path" ]
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
					    ls=$( ls -ld "$app_path" )
 | 
				
			||||||
 | 
					    link=${ls#*' -> '}
 | 
				
			||||||
 | 
					    case $link in             #(
 | 
				
			||||||
 | 
					      /*)   app_path=$link ;; #(
 | 
				
			||||||
 | 
					      *)    app_path=$APP_HOME$link ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This is normally unused
 | 
				
			||||||
 | 
					# shellcheck disable=SC2034
 | 
				
			||||||
 | 
					APP_BASE_NAME=${0##*/}
 | 
				
			||||||
 | 
					# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
 | 
				
			||||||
 | 
					APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use the maximum available, or set MAX_FD != -1 to use that value.
 | 
				
			||||||
 | 
					MAX_FD=maximum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					warn () {
 | 
				
			||||||
 | 
					    echo "$*"
 | 
				
			||||||
 | 
					} >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					die () {
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    echo "$*"
 | 
				
			||||||
 | 
					    echo
 | 
				
			||||||
 | 
					    exit 1
 | 
				
			||||||
 | 
					} >&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# OS specific support (must be 'true' or 'false').
 | 
				
			||||||
 | 
					cygwin=false
 | 
				
			||||||
 | 
					msys=false
 | 
				
			||||||
 | 
					darwin=false
 | 
				
			||||||
 | 
					nonstop=false
 | 
				
			||||||
 | 
					case "$( uname )" in                #(
 | 
				
			||||||
 | 
					  CYGWIN* )         cygwin=true  ;; #(
 | 
				
			||||||
 | 
					  Darwin* )         darwin=true  ;; #(
 | 
				
			||||||
 | 
					  MSYS* | MINGW* )  msys=true    ;; #(
 | 
				
			||||||
 | 
					  NONSTOP* )        nonstop=true ;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Determine the Java command to use to start the JVM.
 | 
				
			||||||
 | 
					if [ -n "$JAVA_HOME" ] ; then
 | 
				
			||||||
 | 
					    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
 | 
				
			||||||
 | 
					        # IBM's JDK on AIX uses strange locations for the executables
 | 
				
			||||||
 | 
					        JAVACMD=$JAVA_HOME/jre/sh/java
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        JAVACMD=$JAVA_HOME/bin/java
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					    if [ ! -x "$JAVACMD" ] ; then
 | 
				
			||||||
 | 
					        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please set the JAVA_HOME variable in your environment to match the
 | 
				
			||||||
 | 
					location of your Java installation."
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    JAVACMD=java
 | 
				
			||||||
 | 
					    if ! command -v java >/dev/null 2>&1
 | 
				
			||||||
 | 
					    then
 | 
				
			||||||
 | 
					        die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please set the JAVA_HOME variable in your environment to match the
 | 
				
			||||||
 | 
					location of your Java installation."
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Increase the maximum file descriptors if we can.
 | 
				
			||||||
 | 
					if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
 | 
				
			||||||
 | 
					    case $MAX_FD in #(
 | 
				
			||||||
 | 
					      max*)
 | 
				
			||||||
 | 
					        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
 | 
				
			||||||
 | 
					        # shellcheck disable=SC2039,SC3045
 | 
				
			||||||
 | 
					        MAX_FD=$( ulimit -H -n ) ||
 | 
				
			||||||
 | 
					            warn "Could not query maximum file descriptor limit"
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					    case $MAX_FD in  #(
 | 
				
			||||||
 | 
					      '' | soft) :;; #(
 | 
				
			||||||
 | 
					      *)
 | 
				
			||||||
 | 
					        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
 | 
				
			||||||
 | 
					        # shellcheck disable=SC2039,SC3045
 | 
				
			||||||
 | 
					        ulimit -n "$MAX_FD" ||
 | 
				
			||||||
 | 
					            warn "Could not set maximum file descriptor limit to $MAX_FD"
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Collect all arguments for the java command, stacking in reverse order:
 | 
				
			||||||
 | 
					#   * args from the command line
 | 
				
			||||||
 | 
					#   * the main class name
 | 
				
			||||||
 | 
					#   * -classpath
 | 
				
			||||||
 | 
					#   * -D...appname settings
 | 
				
			||||||
 | 
					#   * --module-path (only if needed)
 | 
				
			||||||
 | 
					#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# For Cygwin or MSYS, switch paths to Windows format before running java
 | 
				
			||||||
 | 
					if "$cygwin" || "$msys" ; then
 | 
				
			||||||
 | 
					    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
 | 
				
			||||||
 | 
					    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    JAVACMD=$( cygpath --unix "$JAVACMD" )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Now convert the arguments - kludge to limit ourselves to /bin/sh
 | 
				
			||||||
 | 
					    for arg do
 | 
				
			||||||
 | 
					        if
 | 
				
			||||||
 | 
					            case $arg in                                #(
 | 
				
			||||||
 | 
					              -*)   false ;;                            # don't mess with options #(
 | 
				
			||||||
 | 
					              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
 | 
				
			||||||
 | 
					                    [ -e "$t" ] ;;                      #(
 | 
				
			||||||
 | 
					              *)    false ;;
 | 
				
			||||||
 | 
					            esac
 | 
				
			||||||
 | 
					        then
 | 
				
			||||||
 | 
					            arg=$( cygpath --path --ignore --mixed "$arg" )
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        # Roll the args list around exactly as many times as the number of
 | 
				
			||||||
 | 
					        # args, so each arg winds up back in the position where it started, but
 | 
				
			||||||
 | 
					        # possibly modified.
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
 | 
					        # NB: a `for` loop captures its iteration list before it begins, so
 | 
				
			||||||
 | 
					        # changing the positional parameters here affects neither the number of
 | 
				
			||||||
 | 
					        # iterations, nor the values presented in `arg`.
 | 
				
			||||||
 | 
					        shift                   # remove old arg
 | 
				
			||||||
 | 
					        set -- "$@" "$arg"      # push replacement arg
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
				
			||||||
 | 
					DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Collect all arguments for the java command:
 | 
				
			||||||
 | 
					#   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
 | 
				
			||||||
 | 
					#     and any embedded shellness will be escaped.
 | 
				
			||||||
 | 
					#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
 | 
				
			||||||
 | 
					#     treated as '${Hostname}' itself on the command line.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -- \
 | 
				
			||||||
 | 
					        "-Dorg.gradle.appname=$APP_BASE_NAME" \
 | 
				
			||||||
 | 
					        -classpath "$CLASSPATH" \
 | 
				
			||||||
 | 
					        org.gradle.wrapper.GradleWrapperMain \
 | 
				
			||||||
 | 
					        "$@"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Stop when "xargs" is not available.
 | 
				
			||||||
 | 
					if ! command -v xargs >/dev/null 2>&1
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    die "xargs is not available"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use "xargs" to parse quoted args.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# In Bash we could simply go:
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
 | 
				
			||||||
 | 
					#   set -- "${ARGS[@]}" "$@"
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# but POSIX shell has neither arrays nor command substitution, so instead we
 | 
				
			||||||
 | 
					# post-process each arg (as a line of input to sed) to backslash-escape any
 | 
				
			||||||
 | 
					# character that might be a shell metacharacter, then use eval to reverse
 | 
				
			||||||
 | 
					# that process (while maintaining the separation between arguments), and wrap
 | 
				
			||||||
 | 
					# the whole thing up as a single "set" statement.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This will of course break if any of these variables contains a newline or
 | 
				
			||||||
 | 
					# an unmatched quote.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					eval "set -- $(
 | 
				
			||||||
 | 
					        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
 | 
				
			||||||
 | 
					        xargs -n1 |
 | 
				
			||||||
 | 
					        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
 | 
				
			||||||
 | 
					        tr '\n' ' '
 | 
				
			||||||
 | 
					    )" '"$@"'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exec "$JAVACMD" "$@"
 | 
				
			||||||
							
								
								
									
										60
									
								
								Fabric/gradlew.bat → gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								Fabric/gradlew.bat → gradlew.bat
									
									
									
									
										vendored
									
									
								
							@@ -13,8 +13,10 @@
 | 
				
			|||||||
@rem See the License for the specific language governing permissions and
 | 
					@rem See the License for the specific language governing permissions and
 | 
				
			||||||
@rem limitations under the License.
 | 
					@rem limitations under the License.
 | 
				
			||||||
@rem
 | 
					@rem
 | 
				
			||||||
 | 
					@rem SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 | 
					@rem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@if "%DEBUG%" == "" @echo off
 | 
					@if "%DEBUG%"=="" @echo off
 | 
				
			||||||
@rem ##########################################################################
 | 
					@rem ##########################################################################
 | 
				
			||||||
@rem
 | 
					@rem
 | 
				
			||||||
@rem  Gradle startup script for Windows
 | 
					@rem  Gradle startup script for Windows
 | 
				
			||||||
@@ -25,10 +27,14 @@
 | 
				
			|||||||
if "%OS%"=="Windows_NT" setlocal
 | 
					if "%OS%"=="Windows_NT" setlocal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set DIRNAME=%~dp0
 | 
					set DIRNAME=%~dp0
 | 
				
			||||||
if "%DIRNAME%" == "" set DIRNAME=.
 | 
					if "%DIRNAME%"=="" set DIRNAME=.
 | 
				
			||||||
 | 
					@rem This is normally unused
 | 
				
			||||||
set APP_BASE_NAME=%~n0
 | 
					set APP_BASE_NAME=%~n0
 | 
				
			||||||
set APP_HOME=%DIRNAME%
 | 
					set APP_HOME=%DIRNAME%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@rem Resolve any "." and ".." in APP_HOME to make it shorter.
 | 
				
			||||||
 | 
					for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
					@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 | 
				
			||||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 | 
					set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
set JAVA_EXE=java.exe
 | 
					set JAVA_EXE=java.exe
 | 
				
			||||||
%JAVA_EXE% -version >NUL 2>&1
 | 
					%JAVA_EXE% -version >NUL 2>&1
 | 
				
			||||||
if "%ERRORLEVEL%" == "0" goto init
 | 
					if %ERRORLEVEL% equ 0 goto execute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 | 
					echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					echo Please set the JAVA_HOME variable in your environment to match the 1>&2
 | 
				
			||||||
echo location of your Java installation.
 | 
					echo location of your Java installation. 1>&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
goto fail
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,48 +57,36 @@ goto fail
 | 
				
			|||||||
set JAVA_HOME=%JAVA_HOME:"=%
 | 
					set JAVA_HOME=%JAVA_HOME:"=%
 | 
				
			||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
					set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if exist "%JAVA_EXE%" goto init
 | 
					if exist "%JAVA_EXE%" goto execute
 | 
				
			||||||
 | 
					
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
 | 
					echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
 | 
				
			||||||
echo.
 | 
					echo. 1>&2
 | 
				
			||||||
echo Please set the JAVA_HOME variable in your environment to match the
 | 
					echo Please set the JAVA_HOME variable in your environment to match the 1>&2
 | 
				
			||||||
echo location of your Java installation.
 | 
					echo location of your Java installation. 1>&2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
goto fail
 | 
					goto fail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:init
 | 
					 | 
				
			||||||
@rem Get command-line arguments, handling Windows variants
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:win9xME_args
 | 
					 | 
				
			||||||
@rem Slurp the command line arguments.
 | 
					 | 
				
			||||||
set CMD_LINE_ARGS=
 | 
					 | 
				
			||||||
set _SKIP=2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:win9xME_args_slurp
 | 
					 | 
				
			||||||
if "x%~1" == "x" goto execute
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set CMD_LINE_ARGS=%*
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:execute
 | 
					:execute
 | 
				
			||||||
@rem Setup the command line
 | 
					@rem Setup the command line
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 | 
					set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@rem Execute Gradle
 | 
					@rem Execute Gradle
 | 
				
			||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
 | 
					"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:end
 | 
					:end
 | 
				
			||||||
@rem End local scope for the variables with windows NT shell
 | 
					@rem End local scope for the variables with windows NT shell
 | 
				
			||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
 | 
					if %ERRORLEVEL% equ 0 goto mainEnd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:fail
 | 
					:fail
 | 
				
			||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 | 
					rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 | 
				
			||||||
rem the _cmd.exe /c_ return code!
 | 
					rem the _cmd.exe /c_ return code!
 | 
				
			||||||
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
 | 
					set EXIT_CODE=%ERRORLEVEL%
 | 
				
			||||||
exit /b 1
 | 
					if %EXIT_CODE% equ 0 set EXIT_CODE=1
 | 
				
			||||||
 | 
					if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
 | 
				
			||||||
 | 
					exit /b %EXIT_CODE%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:mainEnd
 | 
					:mainEnd
 | 
				
			||||||
if "%OS%"=="Windows_NT" endlocal
 | 
					if "%OS%"=="Windows_NT" endlocal
 | 
				
			||||||
							
								
								
									
										29
									
								
								settings.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								settings.gradle.kts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					rootProject.name = "Minecraft-Window-Title"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pluginManagement {
 | 
				
			||||||
 | 
						repositories {
 | 
				
			||||||
 | 
							gradlePluginPortal()
 | 
				
			||||||
 | 
							maven(url = "https://maven.neoforged.net/releases") { name = "NeoForge" }
 | 
				
			||||||
 | 
							maven(url = "https://maven.fabricmc.net/") { name = "Fabric" }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						plugins {
 | 
				
			||||||
 | 
							val neoModDevVersion = settings.extra.get("neoModDevVersion") as? String
 | 
				
			||||||
 | 
							if (neoModDevVersion != null) {
 | 
				
			||||||
 | 
								id("net.neoforged.moddev") version neoModDevVersion
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							val loomVersion = settings.extra.get("loomVersion") as? String
 | 
				
			||||||
 | 
							if (loomVersion != null) {
 | 
				
			||||||
 | 
								id("fabric-loom") version "$loomVersion-SNAPSHOT"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (settings.extra.has("neoForgeVersion")) {
 | 
				
			||||||
 | 
						include("NeoForge")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (settings.extra.has("fabricVersion")) {
 | 
				
			||||||
 | 
						include("Fabric")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										60
									
								
								src/main/java/chylex/customwindowtitle/IconChanger.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/main/java/chylex/customwindowtitle/IconChanger.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
 | 
					import org.lwjgl.glfw.GLFW;
 | 
				
			||||||
 | 
					import org.lwjgl.glfw.GLFWImage;
 | 
				
			||||||
 | 
					import org.lwjgl.stb.STBImage;
 | 
				
			||||||
 | 
					import org.lwjgl.system.MemoryStack;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.nio.ByteBuffer;
 | 
				
			||||||
 | 
					import java.nio.IntBuffer;
 | 
				
			||||||
 | 
					import java.nio.file.Files;
 | 
				
			||||||
 | 
					import java.nio.file.Path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public final class IconChanger {
 | 
				
			||||||
 | 
						private IconChanger() {}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static void setIcon(Path iconPath) {
 | 
				
			||||||
 | 
							long windowHandle = Minecraft.getInstance().getWindow().getWindow();
 | 
				
			||||||
 | 
							setWindowIcon(windowHandle, iconPath);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static void setWindowIcon(long windowHandle, Path iconPath) {
 | 
				
			||||||
 | 
							try (MemoryStack stack = MemoryStack.stackPush()) {
 | 
				
			||||||
 | 
								IntBuffer w = stack.mallocInt(1);
 | 
				
			||||||
 | 
								IntBuffer h = stack.mallocInt(1);
 | 
				
			||||||
 | 
								IntBuffer channels = stack.mallocInt(1);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								ByteBuffer icon = loadIcon(iconPath, w, h, channels);
 | 
				
			||||||
 | 
								if (icon == null) {
 | 
				
			||||||
 | 
									return;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								try (GLFWImage glfwImage1 = GLFWImage.malloc(); GLFWImage glfwImage2 = GLFWImage.malloc(); GLFWImage.Buffer icons = GLFWImage.malloc(2)) {
 | 
				
			||||||
 | 
									glfwImage1.set(w.get(0), h.get(0), icon);
 | 
				
			||||||
 | 
									glfwImage2.set(w.get(0), h.get(0), icon);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									icons.put(0, glfwImage1);
 | 
				
			||||||
 | 
									icons.put(1, glfwImage2);
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									GLFW.glfwSetWindowIcon(windowHandle, icons);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} catch (Exception e) {
 | 
				
			||||||
 | 
								System.err.println("Failed to set window icon: " + iconPath);
 | 
				
			||||||
 | 
								e.printStackTrace();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static ByteBuffer loadIcon(Path path, IntBuffer w, IntBuffer h, IntBuffer channels) throws IOException {
 | 
				
			||||||
 | 
							byte[] iconBytes = Files.readAllBytes(path);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							ByteBuffer buffer = ByteBuffer.allocateDirect(iconBytes.length).put(iconBytes).flip();
 | 
				
			||||||
 | 
							ByteBuffer icon = STBImage.stbi_load_from_memory(buffer, w, h, channels, 4);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (icon == null) {
 | 
				
			||||||
 | 
								System.err.println("Failed to load image from memory for: " + path + " - " + STBImage.stbi_failure_reason());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return icon;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/main/java/chylex/customwindowtitle/TitleChanger.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/main/java/chylex/customwindowtitle/TitleChanger.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public final class TitleChanger {
 | 
				
			||||||
 | 
						private TitleChanger() {}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static void setTitle(TitleConfig config) {
 | 
				
			||||||
 | 
							Minecraft.getInstance().getWindow().setTitle(TitleParser.parse(config.getTitle()));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										127
									
								
								src/main/java/chylex/customwindowtitle/TitleConfig.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								src/main/java/chylex/customwindowtitle/TitleConfig.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.ImmutableMap;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.nio.charset.StandardCharsets;
 | 
				
			||||||
 | 
					import java.nio.file.Files;
 | 
				
			||||||
 | 
					import java.nio.file.Path;
 | 
				
			||||||
 | 
					import java.nio.file.Paths;
 | 
				
			||||||
 | 
					import java.util.LinkedHashMap;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public final class TitleConfig {
 | 
				
			||||||
 | 
						private static final String KEY_TITLE = "title";
 | 
				
			||||||
 | 
						private static final String KEY_ICON = "icon";
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static final ImmutableMap<String, String> DEFAULTS = ImmutableMap.<String, String>builder()
 | 
				
			||||||
 | 
							.put(KEY_TITLE, "Minecraft {mcversion}")
 | 
				
			||||||
 | 
							.put(KEY_ICON, "")
 | 
				
			||||||
 | 
							.buildOrThrow();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static volatile TitleConfig instance;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static TitleConfig getInstance() {
 | 
				
			||||||
 | 
							return instance;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public static TitleConfig load(String folder) {
 | 
				
			||||||
 | 
							if (instance != null) {
 | 
				
			||||||
 | 
								throw new IllegalStateException("TitleConfig has already been loaded and cannot be loaded again.");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (instance == null) {
 | 
				
			||||||
 | 
								synchronized(TitleConfig.class) {
 | 
				
			||||||
 | 
									if (instance == null) {
 | 
				
			||||||
 | 
										instance = loadImpl(folder);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return instance;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static TitleConfig loadImpl(String folder) {
 | 
				
			||||||
 | 
							Path configFile = Paths.get(folder, "customwindowtitle-client.toml");
 | 
				
			||||||
 | 
							Map<String, String> config = new LinkedHashMap<>(DEFAULTS);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								if (!Files.exists(configFile)) {
 | 
				
			||||||
 | 
									Files.write(configFile, config.entrySet().stream()
 | 
				
			||||||
 | 
										.map(entry -> String.format("%s = '%s'", entry.getKey(), entry.getValue()))
 | 
				
			||||||
 | 
										.collect(Collectors.toList()), StandardCharsets.UTF_8);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else {
 | 
				
			||||||
 | 
									Files.readAllLines(configFile, StandardCharsets.UTF_8).stream()
 | 
				
			||||||
 | 
										.map(String::trim)
 | 
				
			||||||
 | 
										.filter(line -> !line.isEmpty())
 | 
				
			||||||
 | 
										.forEach(line -> {
 | 
				
			||||||
 | 
											String[] split = line.split("=", 2);
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											if (split.length != 2) {
 | 
				
			||||||
 | 
												throw new RuntimeException("CustomWindowTitle configuration has an invalid line: " + line);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											String key = split[0].trim();
 | 
				
			||||||
 | 
											String value = parseTrimmedValue(split[1].trim());
 | 
				
			||||||
 | 
											
 | 
				
			||||||
 | 
											if (config.containsKey(key)) {
 | 
				
			||||||
 | 
												config.put(key, value);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											else {
 | 
				
			||||||
 | 
												throw new RuntimeException("CustomWindowTitle configuration has an invalid key: " + key);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								throw new RuntimeException("CustomWindowTitle configuration error", e);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							String iconPathStr = config.get(KEY_ICON);
 | 
				
			||||||
 | 
							Path iconPath = iconPathStr.isEmpty() ? null : Paths.get(folder, iconPathStr);
 | 
				
			||||||
 | 
							if (iconPath != null && Files.notExists(iconPath)) {
 | 
				
			||||||
 | 
								throw new RuntimeException("CustomWindowTitle configuration points to a missing icon: " + iconPath);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return new TitleConfig(config.get(KEY_TITLE), iconPath);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private static String parseTrimmedValue(String value) {
 | 
				
			||||||
 | 
							if (value.isEmpty()) {
 | 
				
			||||||
 | 
								return value;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							final char surrounding = value.charAt(0);
 | 
				
			||||||
 | 
							final int length = value.length();
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if (value.charAt(length - 1) == surrounding) {
 | 
				
			||||||
 | 
								value = value.substring(1, length - 1);
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								if (surrounding == '"') {
 | 
				
			||||||
 | 
									value = value.replace("\\\"", "\"").replace("\\\\", "\\");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return value;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private final String title;
 | 
				
			||||||
 | 
						private final Path icon;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private TitleConfig(final String title, final Path icon) {
 | 
				
			||||||
 | 
							this.title = title;
 | 
				
			||||||
 | 
							this.icon = icon;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public String getTitle() {
 | 
				
			||||||
 | 
							return title;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public boolean hasIcon() {
 | 
				
			||||||
 | 
							return icon != null;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						public Path getIconPath() {
 | 
				
			||||||
 | 
							return icon;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.apache.commons.lang3.ArrayUtils;
 | 
					import org.apache.commons.lang3.ArrayUtils;
 | 
				
			||||||
import org.apache.commons.lang3.StringUtils;
 | 
					import org.apache.commons.lang3.StringUtils;
 | 
				
			||||||
import org.apache.logging.log4j.LogManager;
 | 
					import org.apache.logging.log4j.LogManager;
 | 
				
			||||||
@@ -6,32 +7,32 @@ import org.apache.logging.log4j.Logger;
 | 
				
			|||||||
import java.util.regex.Matcher;
 | 
					import java.util.regex.Matcher;
 | 
				
			||||||
import java.util.regex.Pattern;
 | 
					import java.util.regex.Pattern;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public final class TitleParser{
 | 
					final class TitleParser {
 | 
				
			||||||
	private static final Pattern tokenRegex = Pattern.compile("\\{([a-z]+)(?::([^}]+))?}");
 | 
						private static final Pattern tokenRegex = Pattern.compile("\\{([a-z]+)(?::([^}]+))?}");
 | 
				
			||||||
	private static final Logger logger = LogManager.getLogger("CustomWindowTitle");
 | 
						private static final Logger logger = LogManager.getLogger("CustomWindowTitle");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static String parse(final String input){
 | 
						public static String parse(final String input) {
 | 
				
			||||||
		final StringBuffer buffer = new StringBuffer();
 | 
							final StringBuilder buffer = new StringBuilder();
 | 
				
			||||||
		final Matcher matcher = tokenRegex.matcher(input);
 | 
							final Matcher matcher = tokenRegex.matcher(input);
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		while(matcher.find()){
 | 
							while (matcher.find()) {
 | 
				
			||||||
			final String token = matcher.group(1);
 | 
								final String token = matcher.group(1);
 | 
				
			||||||
			final String[] args = StringUtils.split(matcher.group(2), ',');
 | 
								final String[] args = StringUtils.split(matcher.group(2), ',');
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			String result = null;
 | 
								String result = null;
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			try{
 | 
								try {
 | 
				
			||||||
				result = TitleTokens.getTokenFunction(token).apply(args == null ? ArrayUtils.EMPTY_STRING_ARRAY : args);
 | 
									result = TitleTokens.getTokenFunction(token).apply(args == null ? ArrayUtils.EMPTY_STRING_ARRAY : args);
 | 
				
			||||||
			}catch(final TokenException e){
 | 
								} catch (final TokenException e) {
 | 
				
			||||||
				logger.warn("Error processing token '" + token + "': " + e.getMessage());
 | 
									logger.warn("Error processing token '" + token + "': " + e.getMessage());
 | 
				
			||||||
			}catch(final Throwable t){
 | 
								} catch (final Throwable t) {
 | 
				
			||||||
				logger.warn("Error processing token '" + token + "': " + t.getMessage(), t);
 | 
									logger.warn("Error processing token '" + token + "': " + t.getMessage(), t);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
			if (result == null){
 | 
								if (result == null) {
 | 
				
			||||||
				matcher.appendReplacement(buffer, input.substring(matcher.start(), matcher.end()));
 | 
									matcher.appendReplacement(buffer, input.substring(matcher.start(), matcher.end()));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else{
 | 
								else {
 | 
				
			||||||
				matcher.appendReplacement(buffer, result);
 | 
									matcher.appendReplacement(buffer, result);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -42,5 +43,5 @@ public final class TitleParser{
 | 
				
			|||||||
	
 | 
						
 | 
				
			||||||
	// Static class
 | 
						// Static class
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	private TitleParser(){}
 | 
						private TitleParser() {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,43 +1,44 @@
 | 
				
			|||||||
package chylex.customwindowtitle;
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.function.Function;
 | 
					import java.util.function.Function;
 | 
				
			||||||
import java.util.function.Supplier;
 | 
					import java.util.function.Supplier;
 | 
				
			||||||
import java.util.function.UnaryOperator;
 | 
					import java.util.function.UnaryOperator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public final class TitleTokens{
 | 
					public final class TitleTokens {
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Registry
 | 
						// Registry
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	private static final Map<String, Function<String[], String>> tokenMap = new HashMap<>();
 | 
						private static final Map<String, Function<String[], String>> tokenMap = new HashMap<>();
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static void registerToken(final String token, final Function<String[], String> processor){
 | 
						public static void registerToken(final String token, final Function<String[], String> processor) {
 | 
				
			||||||
		tokenMap.putIfAbsent(token, processor);
 | 
							tokenMap.putIfAbsent(token, processor);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static Function<String[], String> getTokenFunction(final String token){
 | 
						public static Function<String[], String> getTokenFunction(final String token) {
 | 
				
			||||||
		return tokenMap.getOrDefault(token, args -> null);
 | 
							return tokenMap.getOrDefault(token, args -> null);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Arguments
 | 
						// Arguments
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static Function<String[], String> noArgs(final Supplier<String> func){
 | 
						public static Function<String[], String> noArgs(final Supplier<String> func) {
 | 
				
			||||||
		return args -> args.length > 0 ? fail("expected no arguments, got " + args.length) : func.get();
 | 
							return args -> args.length > 0 ? fail("expected no arguments, got " + args.length) : func.get();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static Function<String[], String> oneArg(final UnaryOperator<String> func){
 | 
						public static Function<String[], String> oneArg(final UnaryOperator<String> func) {
 | 
				
			||||||
		return args -> args.length != 1 ? fail("expected 1 argument, got " + args.length) : func.apply(args[0]);
 | 
							return args -> args.length != 1 ? fail("expected 1 argument, got " + args.length) : func.apply(args[0]);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static Function<String[], String> rangeArgs(final int min, final int max, final Function<String[], String> func){
 | 
						public static Function<String[], String> rangeArgs(final int min, final int max, final Function<String[], String> func) {
 | 
				
			||||||
		return args -> args.length < min || args.length > max ? fail("expected between " + min + " and " + max + " arguments, got " + args.length) : func.apply(args);
 | 
							return args -> args.length < min || args.length > max ? fail("expected between " + min + " and " + max + " arguments, got " + args.length) : func.apply(args);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	private static String fail(final String message){
 | 
						private static String fail(final String message) {
 | 
				
			||||||
		throw new TokenException(message);
 | 
							throw new TokenException(message);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Static class
 | 
						// Static class
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	private TitleTokens(){}
 | 
						private TitleTokens() {}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class TokenException extends RuntimeException {
 | 
				
			||||||
 | 
						public TokenException(final String message) {
 | 
				
			||||||
 | 
							super(message);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static chylex.customwindowtitle.TitleTokens.noArgs;
 | 
				
			||||||
 | 
					import static chylex.customwindowtitle.TitleTokens.oneArg;
 | 
				
			||||||
 | 
					import static chylex.customwindowtitle.TitleTokens.registerToken;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public final class CommonTokenData {
 | 
				
			||||||
 | 
						public static void register(final CommonTokenProvider provider) {
 | 
				
			||||||
 | 
							registerToken("mcversion", noArgs(provider::getMinecraftVersion));
 | 
				
			||||||
 | 
							registerToken("modversion", oneArg(provider::getModVersion));
 | 
				
			||||||
 | 
							registerToken("username", noArgs(provider::getUsername));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						private CommonTokenData() {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.minecraft.SharedConstants;
 | 
				
			||||||
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public interface CommonTokenProvider {
 | 
				
			||||||
 | 
						default String getMinecraftVersion() {
 | 
				
			||||||
 | 
							return SharedConstants.getCurrentVersion().getName();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						String getModVersion(final String modId);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						default String getUsername() {
 | 
				
			||||||
 | 
							return Minecraft.getInstance().getUser().getName();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.mixin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.Mixin;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.At;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.Inject;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Mixin(Minecraft.class)
 | 
				
			||||||
 | 
					public final class DisableVanillaTitle {
 | 
				
			||||||
 | 
						@Inject(method = "updateTitle()V", at = @At("HEAD"), cancellable = true)
 | 
				
			||||||
 | 
						private void updateTitle(final CallbackInfo info) {
 | 
				
			||||||
 | 
							info.cancel();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					package chylex.customwindowtitle.mixin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.IconChanger;
 | 
				
			||||||
 | 
					import chylex.customwindowtitle.TitleConfig;
 | 
				
			||||||
 | 
					import net.minecraft.client.Minecraft;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.Mixin;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.At;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.Inject;
 | 
				
			||||||
 | 
					import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Mixin(Minecraft.class)
 | 
				
			||||||
 | 
					public final class InitializeCustomIcon {
 | 
				
			||||||
 | 
						@Inject(method = "onResourceLoadFinished", at = @At("HEAD"))
 | 
				
			||||||
 | 
						private void onFinishedLoading(CallbackInfo callbackInfo) {
 | 
				
			||||||
 | 
							TitleConfig config = TitleConfig.getInstance();
 | 
				
			||||||
 | 
							if (config != null && config.hasIcon()) {
 | 
				
			||||||
 | 
								IconChanger.setIcon(config.getIconPath());
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								src/main/resources/customwindowtitle.mixins.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/main/resources/customwindowtitle.mixins.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "required": true,
 | 
				
			||||||
 | 
					  "minVersion": "0.8",
 | 
				
			||||||
 | 
					  "package": "chylex.customwindowtitle.mixin",
 | 
				
			||||||
 | 
					  "refmap": "customwindowtitle.refmap.json",
 | 
				
			||||||
 | 
					  "compatibilityLevel": "JAVA_17",
 | 
				
			||||||
 | 
					  "client": [
 | 
				
			||||||
 | 
					    "DisableVanillaTitle",
 | 
				
			||||||
 | 
					    "InitializeCustomIcon"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "injectors": {
 | 
				
			||||||
 | 
					    "defaultRequire": 1
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/main/resources/pack.mcmeta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/main/resources/pack.mcmeta
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "pack": {
 | 
				
			||||||
 | 
					        "description": "${name}",
 | 
				
			||||||
 | 
					        "pack_format": 7,
 | 
				
			||||||
 | 
					        "_comment": ""
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/multiloader/resources/META-INF/jarjar/metadata.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/multiloader/resources/META-INF/jarjar/metadata.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "jars": [{
 | 
				
			||||||
 | 
					    "identifier": {
 | 
				
			||||||
 | 
					      "group": "${group}",
 | 
				
			||||||
 | 
					      "artifact": "${id}"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "version": {
 | 
				
			||||||
 | 
					      "artifactVersion": "${version}",
 | 
				
			||||||
 | 
					      "range": "[${version}]"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "path": "jars/${jarPrefix}-NeoForge.jar"
 | 
				
			||||||
 | 
					  }]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										32
									
								
								src/multiloader/resources/fabric.mod.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/multiloader/resources/fabric.mod.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "schemaVersion": 1,
 | 
				
			||||||
 | 
					  "id": "${id}_multiloader",
 | 
				
			||||||
 | 
					  "name": "${name} (Multiloader)",
 | 
				
			||||||
 | 
					  "description": "${description}",
 | 
				
			||||||
 | 
					  "version": "${version}",
 | 
				
			||||||
 | 
					  "license": "${license}",
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  "authors": [
 | 
				
			||||||
 | 
					    "${author}"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  "contact": {
 | 
				
			||||||
 | 
					    "homepage": "https://chylex.com",
 | 
				
			||||||
 | 
					    "issues": "${issuesURL}",
 | 
				
			||||||
 | 
					    "sources": "${sourcesURL}"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  "environment": "${sidesForFabric}",
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  "jars": [{
 | 
				
			||||||
 | 
					      "file": "jars/${jarPrefix}-Fabric.jar"
 | 
				
			||||||
 | 
					  }],
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  "custom": {
 | 
				
			||||||
 | 
					    "modmenu": {
 | 
				
			||||||
 | 
					      "parent": "${id}",
 | 
				
			||||||
 | 
					      "badges": [ "library" ],
 | 
				
			||||||
 | 
					      "update_checker": false
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user