Init
This commit is contained in:
43
.gitignore
vendored
Normal file
43
.gitignore
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
.gradle
|
||||
build/
|
||||
!gradle/wrapper/gradle-wrapper.jar
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
.kotlin
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
out/
|
||||
!**/src/main/**/out/
|
||||
!**/src/test/**/out/
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
bin/
|
||||
!**/src/main/**/bin/
|
||||
!**/src/test/**/bin/
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Ignored default folder with query files
|
||||
/queries/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
||||
Hytale
|
||||
6
.idea/copilot.data.migration.agent.xml
generated
Normal file
6
.idea/copilot.data.migration.agent.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AgentMigrationStateService">
|
||||
<option name="migrationStatus" value="COMPLETED" />
|
||||
</component>
|
||||
</project>
|
||||
16
.idea/gradle.xml
generated
Normal file
16
.idea/gradle.xml
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
</set>
|
||||
</option>
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
7
.idea/kotlinc.xml
generated
Normal file
7
.idea/kotlinc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="KotlinJpsPluginSettings">
|
||||
<option name="externalSystemId" value="Gradle" />
|
||||
<option name="version" value="2.1.20" />
|
||||
</component>
|
||||
</project>
|
||||
11
.idea/misc.xml
generated
Normal file
11
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="23" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
BIN
.intellijPlatform/coroutines-javaagent.jar
Normal file
BIN
.intellijPlatform/coroutines-javaagent.jar
Normal file
Binary file not shown.
@@ -0,0 +1,12 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.ai.grazie.spell.gec.engine.local" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.ai.grazie.spell.gec.engine.local" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.libraries.lucene.common" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.compose.foundation.desktop" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.compose.foundation.desktop" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.kotlinx.io" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.kotlinx.io" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,12 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.ktor.client" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.ktor.client" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.libraries.kotlinx.io" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.lucene.common" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.lucene.common" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.microba" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.microba" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.libraries.skiko" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.libraries.skiko" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.backend" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.backend" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.compose" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.compose" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.jewel.foundation" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.jewel.foundation" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.jewel.ideLafBridge" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.jewel.ideLafBridge" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.jewel.ui" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.jewel.ui" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,14 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.vcs.impl" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.vcs.impl" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.backend" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.libraries.microba" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.platform.vcs.impl.shared" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,12 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.vcs.impl.lang" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.vcs.impl.lang" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.vcs.impl" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,10 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.platform.vcs.impl.shared" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.platform.vcs.impl.shared" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,14 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.properties.backend" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.properties.backend" ext="jar" conf="default" url="plugins/properties/lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.backend" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.properties.backend.psi" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.spellchecker" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,12 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.properties.backend.psi" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.properties.backend.psi" ext="jar" conf="default" url="plugins/properties/lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.backend" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,15 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledModule" module="intellij.spellchecker" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="intellij.spellchecker" ext="jar" conf="default" url="lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.backend" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.platform.vcs.impl" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.libraries.lucene.common" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.libraries.ai.grazie.spell.gec.engine.local" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,41 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledPlugin" module="com.intellij.java" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="aether-dependency-resolver" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="completion-ranking-java" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="debugger-memory-agent" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="java-impl-frontend" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="java-impl" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="javac2" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jb-jdi" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jgoodies-common" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jps-builders-6" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jps-builders" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jps-javac-extension" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jps-launcher" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jshell-frontend" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="jshell-protocol" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="kotlin-metadata" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="maven-resolver-connector-basic" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="maven-resolver-transport-file" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="maven-resolver-transport-http" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="netty-codec-protobuf" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="sa-jdwp" ext="jar" conf="default" url="plugins/java/lib"/>
|
||||
<artifact name="intellij.java.debugger.impl.frontend" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.execution.impl.backend" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.execution.impl.frontend" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.featuresTrainer" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.structuralSearch" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.unscramble" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.java.vcs" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.jvm.analysis.impl" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
<artifact name="intellij.profiler.ultimate" ext="jar" conf="default" url="plugins/java/lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.platform.vcs.impl.lang" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledModule" name="intellij.spellchecker" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,12 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledPlugin" module="com.intellij.modules.json" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="json" ext="jar" conf="default" url="plugins/json/lib"/>
|
||||
<artifact name="intellij.json.backend" ext="jar" conf="default" url="plugins/json/lib/modules"/>
|
||||
<artifact name="intellij.json.frontend.split" ext="jar" conf="default" url="plugins/json/lib/modules"/>
|
||||
</publications>
|
||||
<dependencies/>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,27 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledPlugin" module="org.jetbrains.idea.maven" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="artifact-resolver-m31" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="jetbrains.idea.maven.indexer.api.rt" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven-event-listener" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven-jps" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven-server-indexer" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven-server-telemetry" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven-server" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven3-server-common" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven3-server" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven36-server" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="maven40-server" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="plexus-archiver" ext="jar" conf="default" url="plugins/maven/lib"/>
|
||||
<artifact name="intellij.maven.profiler" ext="jar" conf="default" url="plugins/maven/lib/modules"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.properties.backend" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledPlugin" name="com.intellij.java" rev="IU-252.27397.103"/>
|
||||
<dependency org="bundledPlugin" name="org.jetbrains.idea.reposearch" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
@@ -0,0 +1,16 @@
|
||||
<ivy-module version="2.0">
|
||||
<info organisation="bundledPlugin" module="org.jetbrains.idea.reposearch" revision="IU-252.27397.103"/>
|
||||
<configurations>
|
||||
<conf name="default" visibility="public"/>
|
||||
</configurations>
|
||||
<publications>
|
||||
<artifact name="kotlinx-document-store-mvstore" ext="jar" conf="default" url="plugins/repository-search/lib"/>
|
||||
<artifact name="ktor-client-logging" ext="jar" conf="default" url="plugins/repository-search/lib"/>
|
||||
<artifact name="maven-model" ext="jar" conf="default" url="plugins/repository-search/lib"/>
|
||||
<artifact name="package-search-api-client" ext="jar" conf="default" url="plugins/repository-search/lib"/>
|
||||
<artifact name="repository-search" ext="jar" conf="default" url="plugins/repository-search/lib"/>
|
||||
</publications>
|
||||
<dependencies>
|
||||
<dependency org="bundledModule" name="intellij.libraries.ktor.client" rev="IU-252.27397.103"/>
|
||||
</dependencies>
|
||||
</ivy-module>
|
||||
1
.intellijPlatform/self-update.lock
Normal file
1
.intellijPlatform/self-update.lock
Normal file
@@ -0,0 +1 @@
|
||||
2026-01-13
|
||||
23
.run/Run IDE with Plugin.run.xml
Normal file
23
.run/Run IDE with Plugin.run.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Run IDE with Plugin" type="GradleRunConfiguration" factoryName="Gradle">
|
||||
<log_file alias="idea.log" path="$PROJECT_DIR$/build/idea-sandbox/system/log/idea.log"/>
|
||||
<ExternalSystemSettings>
|
||||
<option name="executionName"/>
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$"/>
|
||||
<option name="externalSystemIdString" value="GRADLE"/>
|
||||
<option name="scriptParameters" value=""/>
|
||||
<option name="taskDescriptions">
|
||||
<list/>
|
||||
</option>
|
||||
<option name="taskNames">
|
||||
<list>
|
||||
<option value="runIde"/>
|
||||
</list>
|
||||
</option>
|
||||
<option name="vmOptions" value=""/>
|
||||
</ExternalSystemSettings>
|
||||
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
|
||||
<DebugAllEnabled>false</DebugAllEnabled>
|
||||
<method v="2"/>
|
||||
</configuration>
|
||||
</component>
|
||||
18
LICENSE
Normal file
18
LICENSE
Normal file
@@ -0,0 +1,18 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 UnlegitDqrk
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
|
||||
following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial
|
||||
portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
|
||||
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
121
README.md
Normal file
121
README.md
Normal file
@@ -0,0 +1,121 @@
|
||||
# HytaleWizardIntelliJ
|
||||
|
||||
Hytale plugin for the IntelliJ Wizard UI
|
||||
|
||||
# IntelliJ Platform Plugin Template
|
||||
|
||||
[](https://twitter.com/JBPlatform)
|
||||
[][jb:forum]
|
||||
|
||||
## Plugin template structure
|
||||
|
||||
A generated project contains the following content structure:
|
||||
|
||||
```
|
||||
.
|
||||
├── .run/ Predefined Run/Debug Configurations
|
||||
├── build/ Output build directory
|
||||
├── gradle
|
||||
│ ├── wrapper/ Gradle Wrapper
|
||||
├── src Plugin sources
|
||||
│ ├── main
|
||||
│ │ ├── kotlin/ Kotlin production sources
|
||||
│ │ └── resources/ Resources - plugin.xml, icons, messages
|
||||
├── .gitignore Git ignoring rules
|
||||
├── build.gradle.kts Gradle build configuration
|
||||
├── gradle.properties Gradle configuration properties
|
||||
├── gradlew *nix Gradle Wrapper script
|
||||
├── gradlew.bat Windows Gradle Wrapper script
|
||||
├── README.md README
|
||||
└── settings.gradle.kts Gradle project settings
|
||||
```
|
||||
|
||||
In addition to the configuration files, the most crucial part is the `src` directory, which contains our implementation
|
||||
and the manifest for our plugin – [plugin.xml][file:plugin.xml].
|
||||
|
||||
> [!NOTE]
|
||||
> To use Java in your plugin, create the `/src/main/java` directory.
|
||||
|
||||
## Plugin configuration file
|
||||
|
||||
The plugin configuration file is a [plugin.xml][file:plugin.xml] file located in the `src/main/resources/META-INF`
|
||||
directory.
|
||||
It provides general information about the plugin, its dependencies, extensions, and listeners.
|
||||
|
||||
You can read more about this file in the [Plugin Configuration File][docs:plugin.xml] section of our documentation.
|
||||
|
||||
If you're still not quite sure what this is all about, read our
|
||||
introduction: [What is the IntelliJ Platform?][docs:intro]
|
||||
|
||||
$H$H Predefined Run/Debug configurations
|
||||
|
||||
Within the default project structure, there is a `.run` directory provided containing predefined *Run/Debug
|
||||
configurations* that expose corresponding Gradle tasks:
|
||||
|
||||
| Configuration name | Description |
|
||||
|--------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Run Plugin | Runs [`:runIde`][gh:intellij-platform-gradle-plugin-runIde] IntelliJ Platform Gradle Plugin task. Use the *Debug* icon for plugin debugging. |
|
||||
| Run Tests | Runs [`:test`][gradle:lifecycle-tasks] Gradle task. |
|
||||
| Run Verifications | Runs [`:verifyPlugin`][gh:intellij-platform-gradle-plugin-verifyPlugin] IntelliJ Platform Gradle Plugin task to check the plugin compatibility against the specified IntelliJ IDEs. |
|
||||
|
||||
> [!NOTE]
|
||||
> You can find the logs from the running task in the `idea.log` tab.
|
||||
|
||||
## Publishing the plugin
|
||||
|
||||
> [!TIP]
|
||||
> Make sure to follow all guidelines listed in [Publishing a Plugin][docs:publishing] to follow all recommended and
|
||||
> required steps.
|
||||
|
||||
Releasing a plugin to [JetBrains Marketplace](https://plugins.jetbrains.com) is a straightforward operation that uses
|
||||
the `publishPlugin` Gradle task provided by
|
||||
the [intellij-platform-gradle-plugin][gh:intellij-platform-gradle-plugin-docs].
|
||||
|
||||
You can also upload the plugin to the [JetBrains Plugin Repository](https://plugins.jetbrains.com/plugin/upload)
|
||||
manually via UI.
|
||||
|
||||
## Useful links
|
||||
|
||||
- [IntelliJ Platform SDK Plugin SDK][docs]
|
||||
- [IntelliJ Platform Gradle Plugin Documentation][gh:intellij-platform-gradle-plugin-docs]
|
||||
- [IntelliJ Platform Explorer][jb:ipe]
|
||||
- [JetBrains Marketplace Quality Guidelines][jb:quality-guidelines]
|
||||
- [IntelliJ Platform UI Guidelines][jb:ui-guidelines]
|
||||
- [JetBrains Marketplace Paid Plugins][jb:paid-plugins]
|
||||
- [IntelliJ SDK Code Samples][gh:code-samples]
|
||||
|
||||
[docs]: https://plugins.jetbrains.com/docs/intellij
|
||||
|
||||
[docs:intro]: https://plugins.jetbrains.com/docs/intellij/intellij-platform.html?from=IJPluginTemplate
|
||||
|
||||
[docs:plugin.xml]: https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html?from=IJPluginTemplate
|
||||
|
||||
[docs:publishing]: https://plugins.jetbrains.com/docs/intellij/publishing-plugin.html?from=IJPluginTemplate
|
||||
|
||||
[file:plugin.xml]: ./src/main/resources/META-INF/plugin.xml
|
||||
|
||||
[gh:code-samples]: https://github.com/JetBrains/intellij-sdk-code-samples
|
||||
|
||||
[gh:intellij-platform-gradle-plugin]: https://github.com/JetBrains/intellij-platform-gradle-plugin
|
||||
|
||||
[gh:intellij-platform-gradle-plugin-docs]: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html
|
||||
|
||||
[gh:intellij-platform-gradle-plugin-runIde]: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-tasks.html#runIde
|
||||
|
||||
[gh:intellij-platform-gradle-plugin-verifyPlugin]: https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin-tasks.html#verifyPlugin
|
||||
|
||||
[gradle:lifecycle-tasks]: https://docs.gradle.org/current/userguide/java_plugin.html#lifecycle_tasks
|
||||
|
||||
[jb:github]: https://github.com/JetBrains/.github/blob/main/profile/README.md
|
||||
|
||||
[jb:forum]: https://platform.jetbrains.com/
|
||||
|
||||
[jb:quality-guidelines]: https://plugins.jetbrains.com/docs/marketplace/quality-guidelines.html
|
||||
|
||||
[jb:paid-plugins]: https://plugins.jetbrains.com/docs/marketplace/paid-plugins-marketplace.html
|
||||
|
||||
[jb:quality-guidelines]: https://plugins.jetbrains.com/docs/marketplace/quality-guidelines.html
|
||||
|
||||
[jb:ipe]: https://jb.gg/ipe
|
||||
|
||||
[jb:ui-guidelines]: https://jetbrains.github.io/ui
|
||||
48
build.gradle.kts
Normal file
48
build.gradle.kts
Normal file
@@ -0,0 +1,48 @@
|
||||
plugins {
|
||||
id("java")
|
||||
id("org.jetbrains.intellij.platform") version "2.10.2"
|
||||
}
|
||||
|
||||
group = "dev.unlegitdqrk"
|
||||
version = "1.0-SNAPSHOT"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
intellijPlatform {
|
||||
defaultRepositories()
|
||||
}
|
||||
}
|
||||
|
||||
// Dependencies for the plugin
|
||||
dependencies {
|
||||
intellijPlatform {
|
||||
intellijIdea("2025.2.4")
|
||||
testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform)
|
||||
|
||||
// Bundled Plugins for the project (if necessary)
|
||||
bundledPlugin("com.intellij.java")
|
||||
bundledPlugin("com.intellij.modules.json")
|
||||
bundledPlugin("org.jetbrains.idea.maven")
|
||||
}
|
||||
}
|
||||
|
||||
intellijPlatform {
|
||||
pluginConfiguration {
|
||||
ideaVersion {
|
||||
sinceBuild = "252.25557"
|
||||
}
|
||||
changeNotes = """
|
||||
Initial version
|
||||
""".trimIndent()
|
||||
}
|
||||
}
|
||||
|
||||
tasks {
|
||||
// Set JVM compatibility versions for Java 21
|
||||
withType<JavaCompile> {
|
||||
sourceCompatibility = "21"
|
||||
targetCompatibility = "21"
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
}
|
||||
|
||||
5
gradle.properties
Normal file
5
gradle.properties
Normal file
@@ -0,0 +1,5 @@
|
||||
# Enable Gradle Configuration Cache -> https://docs.gradle.org/current/userguide/configuration_cache.html
|
||||
org.gradle.configuration-cache=true
|
||||
# Enable Gradle Build Cache -> https://docs.gradle.org/current/userguide/build_cache.html
|
||||
org.gradle.caching=true
|
||||
org.jetbrains.intellij.platform.selfUpdateCheck=false
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
5
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
234
gradlew
vendored
Normal file
234
gradlew
vendored
Normal file
@@ -0,0 +1,234 @@
|
||||
#!/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.
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# 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/master/subprojects/plugins/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
|
||||
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=${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 "$*"
|
||||
} >&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
|
||||
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" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
case $MAX_FD in #(
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
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
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# 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" "$@"
|
||||
89
gradlew.bat
vendored
Normal file
89
gradlew.bat
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
@rem
|
||||
@rem Copyright 2015 the original author or authors.
|
||||
@rem
|
||||
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@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 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.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
@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 execute
|
||||
|
||||
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 execute
|
||||
|
||||
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
|
||||
|
||||
: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 %*
|
||||
|
||||
: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
|
||||
8
settings.gradle.kts
Normal file
8
settings.gradle.kts
Normal file
@@ -0,0 +1,8 @@
|
||||
rootProject.name = "Hytale"
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,543 @@
|
||||
package dev.unlegitdqrk.wizard;
|
||||
|
||||
import com.intellij.ide.projectView.ProjectView;
|
||||
import com.intellij.ide.util.PropertiesComponent;
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.util.projectWizard.WizardContext;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.application.WriteAction;
|
||||
import com.intellij.openapi.module.ModifiableModuleModel;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleType;
|
||||
import com.intellij.openapi.module.ModuleTypeManager;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.JavaSdk;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.roots.ContentEntry;
|
||||
import com.intellij.openapi.roots.ModifiableRootModel;
|
||||
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
|
||||
import com.intellij.openapi.startup.StartupManager;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.LocalFileSystem;
|
||||
import com.intellij.openapi.vfs.VfsUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.progress.ProcessCanceledException;
|
||||
import dev.unlegitdqrk.wizard.table.AuthorRow;
|
||||
import dev.unlegitdqrk.wizard.table.KeyValueRow;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jps.model.java.JavaResourceRootType;
|
||||
import org.jetbrains.jps.model.java.JavaSourceRootType;
|
||||
import org.jetbrains.idea.maven.project.MavenProjectsManager;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Path;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ModuleBuilder that generates a Hytale JavaPlugin project (Maven only) with manifest.json.
|
||||
*/
|
||||
public final class CustomProjectModuleBuilder extends ModuleBuilder {
|
||||
private Sdk selectedJdk;
|
||||
|
||||
private String groupId;
|
||||
private String artifactId;
|
||||
private String projectVersion;
|
||||
|
||||
private String javaPackage;
|
||||
private String mainClassName;
|
||||
|
||||
private String hytaleServerVersion;
|
||||
|
||||
// Manifest fields (exact casing as provided)
|
||||
private String manifestGroup;
|
||||
private String manifestName;
|
||||
private String manifestVersion;
|
||||
private String manifestDescription;
|
||||
private String manifestWebsite;
|
||||
private String manifestServerVersion;
|
||||
|
||||
private List<AuthorRow> authors = List.of();
|
||||
private List<KeyValueRow> dependencies = List.of();
|
||||
private List<KeyValueRow> optionalDependencies = List.of();
|
||||
private List<KeyValueRow> loadBefore = List.of();
|
||||
|
||||
private boolean manifestDisabledByDefault;
|
||||
private boolean manifestIncludesAssetPack;
|
||||
|
||||
@Override
|
||||
public @NotNull ModuleType<?> getModuleType() {
|
||||
ModuleType<?> type = ModuleTypeManager.getInstance().findByID(HytaleModuleType.ID);
|
||||
return type != null ? type : new HytaleModuleType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setupRootModel(@NotNull ModifiableRootModel model) throws ConfigurationException {
|
||||
String contentPath = getContentEntryPath();
|
||||
if (contentPath == null || contentPath.isBlank()) {
|
||||
throw new ConfigurationException("Content entry path is empty.");
|
||||
}
|
||||
|
||||
VirtualFile rootDir = createAndGetRootDir(contentPath);
|
||||
model.addContentEntry(rootDir);
|
||||
|
||||
// Create Maven standard layout only (do NOT mark roots here)
|
||||
VirtualFile srcMainJava = mkdirs(rootDir, "src/main/java");
|
||||
VirtualFile srcMainRes = mkdirs(rootDir, "src/main/resources");
|
||||
VirtualFile srcTestJava = mkdirs(rootDir, "src/test/java");
|
||||
VirtualFile srcTestRes = mkdirs(rootDir, "src/test/resources");
|
||||
|
||||
generateBuildFiles(rootDir); // creates pom.xml
|
||||
generateSourcesAndResources(srcMainJava, srcMainRes);
|
||||
|
||||
// SDK handling
|
||||
if (selectedJdk != null && com.intellij.openapi.projectRoots.ProjectJdkTable.getInstance().findJdk(selectedJdk.getName()) != null)
|
||||
model.setSdk(selectedJdk);
|
||||
else model.inheritSdk();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleWizardStep @NotNull [] createWizardSteps(@NotNull WizardContext wizardContext,
|
||||
@NotNull ModulesProvider modulesProvider) {
|
||||
if (isBlank(artifactId) && wizardContext.getProjectName() != null) {
|
||||
artifactId = wizardContext.getProjectName();
|
||||
}
|
||||
if (isBlank(manifestName) && wizardContext.getProjectName() != null) {
|
||||
manifestName = wizardContext.getProjectName();
|
||||
}
|
||||
if (isBlank(mainClassName)) {
|
||||
mainClassName = "MyPlugin";
|
||||
}
|
||||
return new ModuleWizardStep[]{new CustomProjectWizardStep(this)};
|
||||
}
|
||||
|
||||
private void generateBuildFiles(VirtualFile rootDir) throws ConfigurationException {
|
||||
requireNonBlank(groupId, "groupId");
|
||||
requireNonBlank(artifactId, "artifactId");
|
||||
requireNonBlank(projectVersion, "version");
|
||||
requireNonBlank(hytaleServerVersion, "Hytale Server Version");
|
||||
|
||||
String pomVersion = hytaleServerVersion.equalsIgnoreCase("?") || hytaleServerVersion.equalsIgnoreCase("*") ? "VERSION" : hytaleServerVersion;
|
||||
writeText(rootDir, "pom.xml", pomXml(groupId, artifactId, projectVersion, pomVersion));
|
||||
}
|
||||
|
||||
private void generateSourcesAndResources(VirtualFile srcMainJava, VirtualFile srcMainResources)
|
||||
throws ConfigurationException {
|
||||
|
||||
requireNonBlank(javaPackage, "Java package");
|
||||
requireNonBlank(mainClassName, "Main class name");
|
||||
|
||||
requireNonBlank(manifestGroup, "manifest Group");
|
||||
requireNonBlank(manifestName, "manifest Name");
|
||||
requireNonBlank(manifestVersion, "manifest Version");
|
||||
requireNonBlank(manifestServerVersion, "manifest ServerVersion");
|
||||
|
||||
final String pkgPath = javaPackage.replace('.', '/');
|
||||
final VirtualFile pkgDir = mkdirs(srcMainJava, pkgPath);
|
||||
|
||||
writeText(pkgDir, mainClassName + ".java", hytaleMainClass(javaPackage, mainClassName));
|
||||
writeText(srcMainResources, "manifest.json", hytaleManifestJson());
|
||||
}
|
||||
|
||||
private String hytaleManifestJson() throws ConfigurationException {
|
||||
final String mainFqn = javaPackage + "." + mainClassName;
|
||||
|
||||
final Map<String, String> deps = toMapValidated("Dependencies", dependencies);
|
||||
final Map<String, String> optDeps = toMapValidated("OptionalDependencies", optionalDependencies);
|
||||
final Map<String, String> lb = toMapValidated("LoadBefore", loadBefore);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("{\n");
|
||||
sb.append(" \"Group\": ").append(jsonString(manifestGroup)).append(",\n");
|
||||
sb.append(" \"Name\": ").append(jsonString(manifestName)).append(",\n");
|
||||
sb.append(" \"Version\": ").append(jsonString(manifestVersion)).append(",\n");
|
||||
sb.append(" \"Description\": ").append(jsonString(nullToEmpty(manifestDescription))).append(",\n");
|
||||
sb.append(" \"Main\": ").append(jsonString(mainFqn)).append(",\n");
|
||||
sb.append(" \"Website\": ").append(jsonString(nullToEmpty(manifestWebsite))).append(",\n");
|
||||
sb.append(" \"Authors\": ").append(authorsJsonArray()).append(",\n");
|
||||
sb.append(" \"ServerVersion\": ").append(jsonString(manifestServerVersion)).append(",\n");
|
||||
sb.append(" \"Dependencies\": ").append(jsonObject(deps)).append(",\n");
|
||||
sb.append(" \"OptionalDependencies\": ").append(jsonObject(optDeps)).append(",\n");
|
||||
sb.append(" \"LoadBefore\": ").append(jsonObject(lb)).append(",\n");
|
||||
sb.append(" \"DisabledByDefault\": ").append(manifestDisabledByDefault).append(",\n");
|
||||
sb.append(" \"IncludesAssetPack\": ").append(manifestIncludesAssetPack).append("\n");
|
||||
sb.append("}\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private String authorsJsonArray() throws ConfigurationException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("[");
|
||||
|
||||
boolean first = true;
|
||||
for (int i = 0; i < authors.size(); i++) {
|
||||
AuthorRow r = authors.get(i);
|
||||
String name = safeTrim(r == null ? null : r.getName());
|
||||
String website = safeTrim(r == null ? null : r.getWebsite());
|
||||
|
||||
boolean empty = name.isEmpty() && website.isEmpty();
|
||||
if (empty) continue;
|
||||
|
||||
if (name.isEmpty()) {
|
||||
throw new ConfigurationException("Authors row " + (i + 1) + " is missing Name.");
|
||||
}
|
||||
|
||||
if (!first) sb.append(", ");
|
||||
first = false;
|
||||
|
||||
sb.append("{ ");
|
||||
sb.append("\"Name\": ").append(jsonString(name));
|
||||
if (!website.isEmpty()) {
|
||||
sb.append(", \"Website\": ").append(jsonString(website));
|
||||
}
|
||||
sb.append(" }");
|
||||
}
|
||||
|
||||
sb.append("]");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static Map<String, String> toMapValidated(String field, List<KeyValueRow> rows)
|
||||
throws ConfigurationException {
|
||||
|
||||
Map<String, String> map = new LinkedHashMap<>();
|
||||
if (rows == null) return map;
|
||||
|
||||
for (int i = 0; i < rows.size(); i++) {
|
||||
KeyValueRow r = rows.get(i);
|
||||
String k = safeTrim(r == null ? null : r.getKey());
|
||||
String v = safeTrim(r == null ? null : r.getValue());
|
||||
|
||||
boolean empty = k.isEmpty() && v.isEmpty();
|
||||
if (empty) continue;
|
||||
|
||||
if (k.isEmpty()) throw new ConfigurationException(field + " row " + (i + 1) + " is missing Key.");
|
||||
if (v.isEmpty()) throw new ConfigurationException(field + " row " + (i + 1) + " is missing Value.");
|
||||
|
||||
if (map.containsKey(k)) {
|
||||
throw new ConfigurationException(field + " contains duplicate key: " + k);
|
||||
}
|
||||
map.put(k, v);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
private static String jsonObject(Map<String, String> map) {
|
||||
if (map == null || map.isEmpty()) return "{}";
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("{\n");
|
||||
|
||||
int i = 0;
|
||||
for (Map.Entry<String, String> e : map.entrySet()) {
|
||||
sb.append(" ").append(jsonString(e.getKey())).append(": ").append(jsonString(e.getValue()));
|
||||
i++;
|
||||
if (i < map.size()) sb.append(",");
|
||||
sb.append("\n");
|
||||
}
|
||||
|
||||
sb.append(" }");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private static String jsonString(String s) {
|
||||
String v = s == null ? "" : s;
|
||||
return "\"" + v
|
||||
.replace("\\", "\\\\")
|
||||
.replace("\"", "\\\"")
|
||||
.replace("\r", "\\r")
|
||||
.replace("\n", "\\n")
|
||||
.replace("\t", "\\t") + "\"";
|
||||
}
|
||||
|
||||
private static String nullToEmpty(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
|
||||
private static String safeTrim(String s) {
|
||||
return s == null ? "" : s.trim();
|
||||
}
|
||||
|
||||
private static String pomXml(String groupId, String artifactId, String projectVersion, String hytaleDependencyVersion)
|
||||
throws ConfigurationException {
|
||||
|
||||
String hv = requireMavenVersion(hytaleDependencyVersion, "Hytale dependency version");
|
||||
|
||||
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n" +
|
||||
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
|
||||
" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n" +
|
||||
" <modelVersion>4.0.0</modelVersion>\n" +
|
||||
"\n" +
|
||||
" <groupId>" + xmlEscape(groupId) + "</groupId>\n" +
|
||||
" <artifactId>" + xmlEscape(artifactId) + "</artifactId>\n" +
|
||||
" <version>" + xmlEscape(projectVersion) + "</version>\n" +
|
||||
" <packaging>jar</packaging>\n" +
|
||||
"\n" +
|
||||
" <properties>\n" +
|
||||
" <maven.compiler.source>25</maven.compiler.source>\n" +
|
||||
" <maven.compiler.target>25</maven.compiler.target>\n" +
|
||||
" <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n" +
|
||||
" </properties>\n" +
|
||||
"\n" +
|
||||
" <dependencies>\n" +
|
||||
" <dependency>\n" +
|
||||
" <groupId>com.hypixel.hytale</groupId>\n" +
|
||||
" <artifactId>Server</artifactId>\n" +
|
||||
" <version>" + xmlEscape(hv) + "</version>\n" +
|
||||
" </dependency>\n" +
|
||||
" </dependencies>\n" +
|
||||
"</project>\n";
|
||||
}
|
||||
|
||||
private static String requireMavenVersion(String value, String fieldName) throws ConfigurationException {
|
||||
String v = value == null ? "" : value.trim();
|
||||
if (v.isEmpty()) {
|
||||
throw new ConfigurationException(fieldName + " must not be empty.");
|
||||
}
|
||||
if (v.contains("*") || v.contains("?")) {
|
||||
throw new ConfigurationException(fieldName + " must not contain '*' or '?'.");
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
private static final String HYTALE_WIZARD_KEY = "dev.unlegitdqrk.hytaleWizardProject";
|
||||
|
||||
@Override
|
||||
public @NotNull List<com.intellij.openapi.module.Module> commit(@NotNull Project project,
|
||||
@Nullable com.intellij.openapi.module.ModifiableModuleModel model,
|
||||
@Nullable com.intellij.openapi.roots.ui.configuration.ModulesProvider modulesProvider) {
|
||||
List<com.intellij.openapi.module.Module> modules = super.commit(project, model, modulesProvider);
|
||||
if (modules == null || modules.isEmpty()) {
|
||||
return modules == null ? List.of() : modules;
|
||||
}
|
||||
|
||||
StartupManager.getInstance(project).runAfterOpened(() -> {
|
||||
if (project.isDisposed()) return;
|
||||
|
||||
ApplicationManager.getApplication().invokeLater(() -> {
|
||||
if (project.isDisposed()) return;
|
||||
|
||||
PropertiesComponent.getInstance(project).setValue(HYTALE_WIZARD_KEY, true);
|
||||
|
||||
// Ensure Project View repaints after Maven re-import/reload
|
||||
ProjectView.getInstance(project).refresh();
|
||||
}, ModalityState.nonModal(), project.getDisposed());
|
||||
});
|
||||
|
||||
scheduleMavenImportAfterProjectOpened(project);
|
||||
return modules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Imports the generated Maven project asynchronously without forcing a synchronous full update.
|
||||
*
|
||||
* <p>Do NOT call forceUpdateAllProjectsOrFindAllAvailablePomFiles() here.
|
||||
* It can trigger synchronous update paths (updateAllMavenProjectsSync) under locks.</p>
|
||||
*
|
||||
* @param project the IntelliJ project
|
||||
*/
|
||||
private void importMavenProjectInBackground(@NotNull Project project) {
|
||||
try {
|
||||
if (project.isDisposed()) return;
|
||||
|
||||
String contentPath = getContentEntryPath();
|
||||
if (contentPath == null || contentPath.isBlank()) return;
|
||||
|
||||
Path pomPath = Path.of(contentPath).resolve("pom.xml");
|
||||
VirtualFile pomVf = LocalFileSystem.getInstance().refreshAndFindFileByNioFile(pomPath);
|
||||
if (pomVf == null || !pomVf.isValid() || project.isDisposed()) return;
|
||||
|
||||
MavenProjectsManager maven = MavenProjectsManager.getInstance(project);
|
||||
|
||||
List<VirtualFile> managed = maven.getProjectsFiles();
|
||||
if (!managed.contains(pomVf)) {
|
||||
// IMPORTANT: This must NOT run on the EDT (it can touch Maven Wrapper + VFS).
|
||||
maven.addManagedFiles(List.of(pomVf));
|
||||
}
|
||||
|
||||
// Triggers import/resolve asynchronously.
|
||||
maven.scheduleImportAndResolve();
|
||||
} catch (ProcessCanceledException pce) {
|
||||
throw pce;
|
||||
} catch (Throwable ignored) {
|
||||
// Intentionally swallow to avoid breaking project creation flow.
|
||||
// If you want, log via Logger.getInstance(...).warn(...)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedules Maven import only after the project is fully opened.
|
||||
*
|
||||
* <p>Triggering Maven update/resolve too early (during project creation) can lead to
|
||||
* modal sync updates and lock contention inside MavenProjectsManager, which in turn
|
||||
* may freeze the UI or stall coroutines.</p>
|
||||
*
|
||||
* @param project the IntelliJ project
|
||||
*/
|
||||
private void scheduleMavenImportAfterProjectOpened(@NotNull Project project) {
|
||||
StartupManager.getInstance(project).runAfterOpened(() -> {
|
||||
if (project.isDisposed()) return;
|
||||
ApplicationManager.getApplication().executeOnPooledThread(() -> importMavenProjectInBackground(project));
|
||||
});
|
||||
}
|
||||
|
||||
private static String xmlEscape(String s) {
|
||||
String v = s == null ? "" : s;
|
||||
return v.replace("&", "&")
|
||||
.replace("<", "<")
|
||||
.replace(">", ">")
|
||||
.replace("\"", """)
|
||||
.replace("'", "'");
|
||||
}
|
||||
|
||||
private static String hytaleMainClass(String pkg, String cls) {
|
||||
return "package " + pkg + ";\n\n" +
|
||||
"import com.hypixel.hytale.server.core.plugin.JavaPlugin;\n" +
|
||||
"import com.hypixel.hytale.server.core.plugin.JavaPluginInit;\n" +
|
||||
"\n" +
|
||||
"import javax.annotation.Nonnull;\n" +
|
||||
"import java.util.logging.Level;\n\n" +
|
||||
"/**\n" +
|
||||
" * Hytale server plugin.\n" +
|
||||
" */\n" +
|
||||
"public class " + cls + " extends JavaPlugin {\n\n" +
|
||||
" private static " + cls + " instance;\n\n" +
|
||||
" /**\n" +
|
||||
" * Creates the plugin instance.\n" +
|
||||
" *\n" +
|
||||
" * @param init plugin initialization context\n" +
|
||||
" */\n" +
|
||||
" public " + cls + "(@Nonnull JavaPluginInit init) {\n" +
|
||||
" super(init);\n" +
|
||||
" }\n\n" +
|
||||
" /**\n" +
|
||||
" * @return plugin singleton instance\n" +
|
||||
" */\n" +
|
||||
" public static " + cls + " get() {\n" +
|
||||
" return instance;\n" +
|
||||
" }\n\n" +
|
||||
" @Override\n" +
|
||||
" protected void setup() {\n" +
|
||||
" instance = this;\n" +
|
||||
" getLogger().at(Level.INFO).log(\"Plugin setup complete!\");\n" +
|
||||
" super.setup();\n" +
|
||||
" }\n\n" +
|
||||
" @Override\n" +
|
||||
" protected void start() {\n" +
|
||||
" getLogger().at(Level.INFO).log(\"Plugin started!\");\n" +
|
||||
" super.start();\n" +
|
||||
" }\n\n" +
|
||||
" @Override\n" +
|
||||
" protected void shutdown() {\n" +
|
||||
" getLogger().at(Level.INFO).log(\"Plugin shutting down!\");\n" +
|
||||
" super.shutdown();\n" +
|
||||
" }\n" +
|
||||
"}\n";
|
||||
}
|
||||
|
||||
private static VirtualFile createAndGetRootDir(String contentPath) throws ConfigurationException {
|
||||
try {
|
||||
return WriteAction.computeAndWait(() -> {
|
||||
FileUtil.createDirectory(new java.io.File(contentPath));
|
||||
VirtualFile vf = VfsUtil.findFileByIoFile(new java.io.File(contentPath), true);
|
||||
if (vf == null) {
|
||||
throw new IOException("Failed to resolve content root: " + contentPath);
|
||||
}
|
||||
return vf;
|
||||
});
|
||||
} catch (ProcessCanceledException pce) {
|
||||
// Must not be swallowed; IntelliJ uses this for cooperative cancellation.
|
||||
throw pce;
|
||||
} catch (Throwable t) {
|
||||
throw new ConfigurationException("Failed to create project root: " + t.getMessage(), t.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static VirtualFile mkdirs(VirtualFile root, String relPath) throws ConfigurationException {
|
||||
try {
|
||||
return WriteAction.computeAndWait(() -> VfsUtil.createDirectories(root.getPath() + "/" + relPath));
|
||||
} catch (ProcessCanceledException pce) {
|
||||
throw pce;
|
||||
} catch (IOException e) {
|
||||
throw new ConfigurationException("Failed to create directories: " + relPath, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeText(VirtualFile dir, String name, String content) throws ConfigurationException {
|
||||
try {
|
||||
WriteAction.run(() -> {
|
||||
VirtualFile f = dir.findChild(name);
|
||||
if (f == null) {
|
||||
f = dir.createChildData(CustomProjectModuleBuilder.class, name);
|
||||
}
|
||||
f.setBinaryContent(content.getBytes(StandardCharsets.UTF_8));
|
||||
});
|
||||
} catch (ProcessCanceledException pce) {
|
||||
throw pce;
|
||||
} catch (IOException ioe) {
|
||||
throw new ConfigurationException(
|
||||
"Failed to write file: " + dir.getPath() + "/" + name + " (" + ioe.getMessage() + ")",
|
||||
ioe.getMessage()
|
||||
);
|
||||
} catch (RuntimeException re) {
|
||||
Throwable cause = re.getCause() == null ? re : re.getCause();
|
||||
throw new ConfigurationException(
|
||||
"Failed to write file: " + dir.getPath() + "/" + name + " (" + cause.getMessage() + ")",
|
||||
cause.getMessage()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private static void requireNonBlank(String v, String field) throws ConfigurationException {
|
||||
if (isBlank(v)) {
|
||||
throw new ConfigurationException(field + " must not be empty.");
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isBlank(String v) {
|
||||
return v == null || v.trim().isEmpty();
|
||||
}
|
||||
|
||||
// --- setters used by wizard step ---
|
||||
/**
|
||||
* Sets the JDK selected in the wizard UI.
|
||||
*
|
||||
* @param selectedJdk selected JDK (may be null to inherit)
|
||||
*/
|
||||
public void setSelectedJdk(Sdk selectedJdk) {
|
||||
this.selectedJdk = selectedJdk;
|
||||
}
|
||||
|
||||
public void setGroupId(String groupId) { this.groupId = groupId; }
|
||||
public void setArtifactId(String artifactId) { this.artifactId = artifactId; }
|
||||
public void setProjectVersion(String projectVersion) { this.projectVersion = projectVersion; }
|
||||
|
||||
public void setJavaPackage(String javaPackage) { this.javaPackage = javaPackage; }
|
||||
public void setMainClassName(String mainClassName) { this.mainClassName = mainClassName; }
|
||||
|
||||
public void setHytaleServerVersion(String hytaleServerVersion) { this.hytaleServerVersion = hytaleServerVersion; }
|
||||
|
||||
public void setManifestGroup(String manifestGroup) { this.manifestGroup = manifestGroup; }
|
||||
public void setManifestName(String manifestName) { this.manifestName = manifestName; }
|
||||
public void setManifestVersion(String manifestVersion) { this.manifestVersion = manifestVersion; }
|
||||
public void setManifestDescription(String manifestDescription) { this.manifestDescription = manifestDescription; }
|
||||
public void setManifestWebsite(String manifestWebsite) { this.manifestWebsite = manifestWebsite; }
|
||||
public void setManifestServerVersion(String manifestServerVersion) { this.manifestServerVersion = manifestServerVersion; }
|
||||
|
||||
public void setAuthors(List<AuthorRow> authors) { this.authors = authors == null ? List.of() : authors; }
|
||||
public void setDependencies(List<KeyValueRow> dependencies) { this.dependencies = dependencies == null ? List.of() : dependencies; }
|
||||
public void setOptionalDependencies(List<KeyValueRow> optionalDependencies) { this.optionalDependencies = optionalDependencies == null ? List.of() : optionalDependencies; }
|
||||
public void setLoadBefore(List<KeyValueRow> loadBefore) { this.loadBefore = loadBefore == null ? List.of() : loadBefore; }
|
||||
|
||||
public void setManifestDisabledByDefault(boolean manifestDisabledByDefault) { this.manifestDisabledByDefault = manifestDisabledByDefault; }
|
||||
public void setManifestIncludesAssetPack(boolean manifestIncludesAssetPack) { this.manifestIncludesAssetPack = manifestIncludesAssetPack; }
|
||||
}
|
||||
@@ -0,0 +1,494 @@
|
||||
package dev.unlegitdqrk.wizard;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.openapi.options.ConfigurationException;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.JavaSdk;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.projectRoots.SdkTypeId;
|
||||
import com.intellij.openapi.roots.ui.configuration.JdkComboBox;
|
||||
import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import dev.unlegitdqrk.wizard.table.AuthorTableModel;
|
||||
import dev.unlegitdqrk.wizard.table.KeyValueTableModel;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import java.awt.*;
|
||||
import java.util.Objects;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Wizard UI for creating a Hytale Java plugin project (Maven only).
|
||||
*
|
||||
* <p>Auto bindings:
|
||||
* <ul>
|
||||
* <li>groupId -> Java package, Manifest Group</li>
|
||||
* <li>artifactId -> Main class, Manifest Name</li>
|
||||
* <li>version -> Manifest Version</li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>Bindings are disabled for a target field once the user edits that target field manually.
|
||||
*/
|
||||
public final class CustomProjectWizardStep extends ModuleWizardStep {
|
||||
|
||||
private static final Pattern JAVA_PACKAGE =
|
||||
Pattern.compile("[A-Za-z_$][A-Za-z\\d_$]*(\\.[A-Za-z_$][A-Za-z\\d_$]*)*");
|
||||
private static final Pattern JAVA_IDENTIFIER =
|
||||
Pattern.compile("[A-Za-z_$][A-Za-z\\d_$]*");
|
||||
|
||||
private final CustomProjectModuleBuilder builder;
|
||||
|
||||
private JPanel root;
|
||||
|
||||
// Maven
|
||||
private JTextField groupId;
|
||||
private JTextField artifactId;
|
||||
private JTextField version;
|
||||
private JTextField hytaleServerVersion;
|
||||
|
||||
// Java
|
||||
private JTextField javaPackage;
|
||||
private JTextField mainClass;
|
||||
|
||||
// Manifest
|
||||
private JTextField manifestGroup;
|
||||
private JTextField manifestName;
|
||||
private JTextField manifestVersion;
|
||||
private JTextArea manifestDescription;
|
||||
private JTextField manifestWebsite;
|
||||
private JTextField manifestServerVersion;
|
||||
|
||||
private AuthorTableModel authorsModel;
|
||||
private KeyValueTableModel depsModel;
|
||||
private KeyValueTableModel optDepsModel;
|
||||
private KeyValueTableModel loadBeforeModel;
|
||||
|
||||
private JCheckBox manifestDisabledByDefault;
|
||||
private JCheckBox manifestIncludesAssetPack;
|
||||
|
||||
// JDK
|
||||
private ProjectSdksModel sdksModel;
|
||||
private JdkComboBox jdkCombo;
|
||||
|
||||
/**
|
||||
* Creates the wizard step.
|
||||
*
|
||||
* @param builder module builder to store user selections into
|
||||
*/
|
||||
public CustomProjectWizardStep(@NotNull CustomProjectModuleBuilder builder) {
|
||||
this.builder = builder;
|
||||
initUi();
|
||||
installAutoBindings();
|
||||
}
|
||||
|
||||
@Override
|
||||
public JComponent getComponent() {
|
||||
return new JScrollPane(root);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateDataModel() {
|
||||
// Maven
|
||||
builder.setGroupId(trim(groupId.getText()));
|
||||
builder.setArtifactId(trim(artifactId.getText()));
|
||||
builder.setProjectVersion(trim(version.getText()));
|
||||
builder.setHytaleServerVersion(trim(hytaleServerVersion.getText()));
|
||||
|
||||
// Java
|
||||
builder.setJavaPackage(trim(javaPackage.getText()));
|
||||
builder.setMainClassName(trim(mainClass.getText()));
|
||||
|
||||
// Manifest
|
||||
builder.setManifestGroup(trim(manifestGroup.getText()));
|
||||
builder.setManifestName(trim(manifestName.getText()));
|
||||
builder.setManifestVersion(trim(manifestVersion.getText()));
|
||||
builder.setManifestDescription(trim(manifestDescription.getText()));
|
||||
builder.setManifestWebsite(trim(manifestWebsite.getText()));
|
||||
builder.setManifestServerVersion(trim(manifestServerVersion.getText()));
|
||||
|
||||
builder.setAuthors(authorsModel.getRows());
|
||||
builder.setDependencies(depsModel.getRows());
|
||||
builder.setOptionalDependencies(optDepsModel.getRows());
|
||||
builder.setLoadBefore(loadBeforeModel.getRows());
|
||||
|
||||
builder.setManifestDisabledByDefault(manifestDisabledByDefault.isSelected());
|
||||
builder.setManifestIncludesAssetPack(manifestIncludesAssetPack.isSelected());
|
||||
|
||||
try {
|
||||
sdksModel.apply();
|
||||
} catch (ConfigurationException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
Sdk selected = jdkCombo.getSelectedJdk();
|
||||
builder.setSelectedJdk(selected);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate() throws ConfigurationException {
|
||||
if (trim(groupId.getText()).isEmpty()) throw new ConfigurationException("groupId must not be empty.");
|
||||
if (trim(artifactId.getText()).isEmpty()) throw new ConfigurationException("artifactId must not be empty.");
|
||||
if (trim(version.getText()).isEmpty()) throw new ConfigurationException("version must not be empty.");
|
||||
if (trim(hytaleServerVersion.getText()).isEmpty()) throw new ConfigurationException("Hytale Server Version must not be empty.");
|
||||
|
||||
String pkg = trim(javaPackage.getText());
|
||||
if (pkg.isEmpty() || !JAVA_PACKAGE.matcher(pkg).matches()) {
|
||||
throw new ConfigurationException("Invalid Java package.");
|
||||
}
|
||||
|
||||
String cls = trim(mainClass.getText());
|
||||
if (cls.isEmpty() || !JAVA_IDENTIFIER.matcher(cls).matches()) {
|
||||
throw new ConfigurationException("Invalid main class name.");
|
||||
}
|
||||
|
||||
if (trim(manifestGroup.getText()).isEmpty()) throw new ConfigurationException("Manifest Group must not be empty.");
|
||||
if (trim(manifestName.getText()).isEmpty()) throw new ConfigurationException("Manifest Name must not be empty.");
|
||||
if (trim(manifestVersion.getText()).isEmpty()) throw new ConfigurationException("Manifest Version must not be empty.");
|
||||
if (trim(manifestServerVersion.getText()).isEmpty()) throw new ConfigurationException("Manifest ServerVersion must not be empty.");
|
||||
|
||||
// JDK required? If you want to enforce:
|
||||
// if (jdkCombo.getSelectedJdk() == null) throw new ConfigurationException("Please select a JDK.");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void initUi() {
|
||||
root = new JPanel();
|
||||
root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS));
|
||||
|
||||
// --- Maven fields ---
|
||||
groupId = new JTextField("");
|
||||
artifactId = new JTextField();
|
||||
version = new JTextField("1.0.0");
|
||||
hytaleServerVersion = new JTextField("*");
|
||||
|
||||
// --- Java fields ---
|
||||
javaPackage = new JTextField();
|
||||
mainClass = new JTextField();
|
||||
|
||||
// --- Manifest fields ---
|
||||
manifestGroup = new JTextField();
|
||||
manifestName = new JTextField();
|
||||
manifestVersion = new JTextField();
|
||||
manifestDescription = new JTextArea(3, 40);
|
||||
manifestWebsite = new JTextField();
|
||||
manifestServerVersion = new JTextField("*");
|
||||
|
||||
authorsModel = new AuthorTableModel();
|
||||
depsModel = new KeyValueTableModel();
|
||||
optDepsModel = new KeyValueTableModel();
|
||||
loadBeforeModel = new KeyValueTableModel();
|
||||
|
||||
manifestDisabledByDefault = new JCheckBox("DisabledByDefault", false);
|
||||
manifestIncludesAssetPack = new JCheckBox("IncludesAssetPack", false);
|
||||
|
||||
// --- JDK combo (only Java SDKs) ---
|
||||
sdksModel = new ProjectSdksModel();
|
||||
sdksModel.reset(null); // loads SDKs from ProjectJdkTable
|
||||
|
||||
Condition<SdkTypeId> onlyJavaSdks = typeId -> typeId instanceof JavaSdk;
|
||||
|
||||
jdkCombo = new JdkComboBox(
|
||||
(Project) null,
|
||||
sdksModel,
|
||||
onlyJavaSdks, // sdkTypeFilter
|
||||
null, // sdkFilter
|
||||
onlyJavaSdks, // creationFilter (only allow creating Java SDKs)
|
||||
null // onNewSdkAdded
|
||||
);
|
||||
|
||||
// --- Collapsible sections like Minecraft wizard ---
|
||||
CollapsibleSection maven = new CollapsibleSection("Maven", true);
|
||||
maven.getContent().add(formRow("groupId:", groupId));
|
||||
maven.getContent().add(formRow("artifactId:", artifactId));
|
||||
maven.getContent().add(formRow("version:", version));
|
||||
maven.getContent().add(formRow("Hytale Server Version:", hytaleServerVersion));
|
||||
|
||||
CollapsibleSection java = new CollapsibleSection("Java", true);
|
||||
java.getContent().add(formRow("package:", javaPackage));
|
||||
java.getContent().add(formRow("Main class:", mainClass));
|
||||
|
||||
CollapsibleSection buildSystemProps = new CollapsibleSection("Build System Properties", false);
|
||||
buildSystemProps.getContent().add(formRow("JDK:", jdkCombo));
|
||||
|
||||
CollapsibleSection manifest = new CollapsibleSection("Manifest", true);
|
||||
manifest.getContent().add(formRow("Group:", manifestGroup));
|
||||
manifest.getContent().add(formRow("Name:", manifestName));
|
||||
manifest.getContent().add(formRow("Version:", manifestVersion));
|
||||
manifest.getContent().add(formRow("Website:", manifestWebsite));
|
||||
manifest.getContent().add(formRow("ServerVersion:", manifestServerVersion));
|
||||
manifest.getContent().add(textAreaRow("Description:", manifestDescription));
|
||||
|
||||
// Compact tables (smaller rows like you requested)
|
||||
JPanel flags = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0));
|
||||
flags.add(manifestDisabledByDefault);
|
||||
flags.add(manifestIncludesAssetPack);
|
||||
manifest.getContent().add(flags);
|
||||
|
||||
manifest.getContent().add(compactTableBlock("Authors", authorsModel));
|
||||
manifest.getContent().add(compactTableBlock("Dependencies", depsModel));
|
||||
manifest.getContent().add(compactTableBlock("OptionalDependencies", optDepsModel));
|
||||
manifest.getContent().add(compactTableBlock("LoadBefore", loadBeforeModel));
|
||||
|
||||
// Layout
|
||||
root.add(maven);
|
||||
root.add(Box.createVerticalStrut(6));
|
||||
root.add(java);
|
||||
root.add(Box.createVerticalStrut(6));
|
||||
root.add(buildSystemProps);
|
||||
root.add(Box.createVerticalStrut(6));
|
||||
root.add(manifest);
|
||||
}
|
||||
|
||||
private void installAutoBindings() {
|
||||
new OneWayAutoBinding(groupId, javaPackage, s -> s);
|
||||
new OneWayAutoBinding(groupId, manifestGroup, s -> s);
|
||||
|
||||
new OneWayAutoBinding(artifactId, mainClass, CustomProjectWizardStep::artifactIdToJavaClassName);
|
||||
new OneWayAutoBinding(artifactId, manifestName, s -> s);
|
||||
|
||||
new OneWayAutoBinding(version, manifestVersion, s -> s);
|
||||
}
|
||||
|
||||
private static JPanel formRow(String label, JComponent field) {
|
||||
JPanel row = new JPanel(new GridBagLayout());
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
c.insets = new Insets(4, 6, 4, 6);
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
|
||||
c.gridx = 0;
|
||||
c.gridy = 0;
|
||||
c.weightx = 0;
|
||||
row.add(new JLabel(label), c);
|
||||
|
||||
c.gridx = 1;
|
||||
c.weightx = 1;
|
||||
row.add(field, c);
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
private static JPanel textAreaRow(String label, JTextArea area) {
|
||||
JPanel row = new JPanel(new GridBagLayout());
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
c.insets = new Insets(4, 6, 4, 6);
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
|
||||
c.gridx = 0;
|
||||
c.gridy = 0;
|
||||
c.weightx = 0;
|
||||
row.add(new JLabel(label), c);
|
||||
|
||||
c.gridx = 1;
|
||||
c.weightx = 1;
|
||||
JScrollPane sp = new JScrollPane(area);
|
||||
sp.setPreferredSize(new Dimension(400, 72));
|
||||
row.add(sp, c);
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
private static JPanel compactTableBlock(String title, Object model) {
|
||||
JPanel block = new JPanel(new BorderLayout());
|
||||
block.setBorder(BorderFactory.createTitledBorder(title));
|
||||
|
||||
JTable table = new JTable((javax.swing.table.TableModel) model);
|
||||
table.setFillsViewportHeight(true);
|
||||
|
||||
// Smaller rows
|
||||
table.setRowHeight(18);
|
||||
|
||||
// Compact viewport height (~5 rows)
|
||||
JScrollPane sp = new JScrollPane(table);
|
||||
sp.setPreferredSize(new Dimension(520, table.getRowHeight() * 6));
|
||||
|
||||
block.add(sp, BorderLayout.CENTER);
|
||||
|
||||
JButton add = new JButton("Add");
|
||||
JButton remove = new JButton("Remove");
|
||||
|
||||
add.addActionListener(e -> {
|
||||
if (model instanceof AuthorTableModel m) m.addRow();
|
||||
if (model instanceof KeyValueTableModel m) m.addRow();
|
||||
});
|
||||
|
||||
remove.addActionListener(e -> {
|
||||
int idx = table.getSelectedRow();
|
||||
if (idx < 0) return;
|
||||
if (model instanceof AuthorTableModel m) m.removeRow(idx);
|
||||
if (model instanceof KeyValueTableModel m) m.removeRow(idx);
|
||||
});
|
||||
|
||||
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0));
|
||||
buttons.add(add);
|
||||
buttons.add(remove);
|
||||
|
||||
block.add(buttons, BorderLayout.SOUTH);
|
||||
return block;
|
||||
}
|
||||
|
||||
private static String trim(String s) {
|
||||
return s == null ? "" : s.trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an artifactId into a best-effort valid Java class name.
|
||||
*
|
||||
* @param artifactId artifactId
|
||||
* @return Java identifier
|
||||
*/
|
||||
private static String artifactIdToJavaClassName(String artifactId) {
|
||||
String in = trim(artifactId);
|
||||
if (in.isEmpty()) return "";
|
||||
|
||||
StringBuilder out = new StringBuilder();
|
||||
boolean capNext = true;
|
||||
|
||||
for (int i = 0; i < in.length(); i++) {
|
||||
char ch = in.charAt(i);
|
||||
if (Character.isLetterOrDigit(ch)) {
|
||||
if (out.isEmpty() && Character.isDigit(ch)) {
|
||||
out.append('_');
|
||||
}
|
||||
if (capNext) {
|
||||
out.append(Character.toUpperCase(ch));
|
||||
capNext = false;
|
||||
} else {
|
||||
out.append(ch);
|
||||
}
|
||||
} else {
|
||||
capNext = true;
|
||||
}
|
||||
}
|
||||
|
||||
String result = out.toString();
|
||||
if (result.isEmpty()) return "";
|
||||
|
||||
if (!Character.isJavaIdentifierStart(result.charAt(0))) {
|
||||
result = "_" + result;
|
||||
}
|
||||
|
||||
StringBuilder safe = new StringBuilder();
|
||||
for (int i = 0; i < result.length(); i++) {
|
||||
char ch = result.charAt(i);
|
||||
safe.append(Character.isJavaIdentifierPart(ch) ? ch : '_');
|
||||
}
|
||||
return safe.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* One-way binding: source -> target.
|
||||
* Auto-updates the target until the user edits the target field manually.
|
||||
*/
|
||||
private static final class OneWayAutoBinding {
|
||||
|
||||
private final JTextField source;
|
||||
private final JTextField target;
|
||||
private final Transformer transformer;
|
||||
|
||||
private boolean autoEnabled = true;
|
||||
private boolean updatingProgrammatically = false;
|
||||
private String lastAutoValue = null;
|
||||
|
||||
OneWayAutoBinding(JTextField source, JTextField target, Transformer transformer) {
|
||||
this.source = Objects.requireNonNull(source, "source");
|
||||
this.target = Objects.requireNonNull(target, "target");
|
||||
this.transformer = Objects.requireNonNull(transformer, "transformer");
|
||||
|
||||
this.target.getDocument().addDocumentListener(new DocumentListener() {
|
||||
@Override public void insertUpdate(DocumentEvent e) { onTargetChanged(); }
|
||||
@Override public void removeUpdate(DocumentEvent e) { onTargetChanged(); }
|
||||
@Override public void changedUpdate(DocumentEvent e) { onTargetChanged(); }
|
||||
|
||||
private void onTargetChanged() {
|
||||
if (updatingProgrammatically) return;
|
||||
if (lastAutoValue != null && !trim(target.getText()).equals(lastAutoValue)) {
|
||||
autoEnabled = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.source.getDocument().addDocumentListener(new DocumentListener() {
|
||||
@Override public void insertUpdate(DocumentEvent e) { apply(); }
|
||||
@Override public void removeUpdate(DocumentEvent e) { apply(); }
|
||||
@Override public void changedUpdate(DocumentEvent e) { apply(); }
|
||||
});
|
||||
|
||||
apply();
|
||||
}
|
||||
|
||||
private void apply() {
|
||||
if (!autoEnabled) return;
|
||||
|
||||
String src = trim(source.getText());
|
||||
String next = trim(transformer.transform(src));
|
||||
|
||||
updatingProgrammatically = true;
|
||||
try {
|
||||
target.setText(next);
|
||||
lastAutoValue = next;
|
||||
} finally {
|
||||
updatingProgrammatically = false;
|
||||
}
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
private interface Transformer {
|
||||
String transform(String value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple collapsible panel (like "Optional Settings" / "Build System Properties").
|
||||
*/
|
||||
private static final class CollapsibleSection extends JPanel {
|
||||
|
||||
private static final Icon EXPANDED_ICON =
|
||||
com.intellij.icons.AllIcons.General.ArrowDown;
|
||||
private static final Icon COLLAPSED_ICON =
|
||||
com.intellij.icons.AllIcons.General.ArrowRight;
|
||||
|
||||
private final JPanel content;
|
||||
private final JToggleButton toggle;
|
||||
|
||||
CollapsibleSection(String title, boolean expanded) {
|
||||
super(new BorderLayout());
|
||||
|
||||
toggle = new JToggleButton(title);
|
||||
toggle.setBorder(BorderFactory.createEmptyBorder(4, 6, 4, 6));
|
||||
toggle.setFocusPainted(false);
|
||||
toggle.setHorizontalAlignment(SwingConstants.LEFT);
|
||||
toggle.setHorizontalTextPosition(SwingConstants.RIGHT);
|
||||
toggle.setIconTextGap(8);
|
||||
|
||||
content = new JPanel();
|
||||
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
|
||||
|
||||
add(toggle, BorderLayout.NORTH);
|
||||
add(content, BorderLayout.CENTER);
|
||||
|
||||
setExpanded(expanded);
|
||||
|
||||
toggle.addActionListener(e -> setExpanded(toggle.isSelected()));
|
||||
}
|
||||
|
||||
JPanel getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
private void setExpanded(boolean expanded) {
|
||||
toggle.setSelected(expanded);
|
||||
content.setVisible(expanded);
|
||||
|
||||
// Visual state indicator
|
||||
toggle.setIcon(expanded ? EXPANDED_ICON : COLLAPSED_ICON);
|
||||
|
||||
// Ensure layout refresh
|
||||
revalidate();
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
43
src/main/java/dev/unlegitdqrk/wizard/HytaleModuleType.java
Normal file
43
src/main/java/dev/unlegitdqrk/wizard/HytaleModuleType.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package dev.unlegitdqrk.wizard;
|
||||
|
||||
import com.intellij.ide.util.projectWizard.ModuleBuilder;
|
||||
import com.intellij.openapi.module.ModuleType;
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* Module type entry for the New Project dialog.
|
||||
*/
|
||||
public final class HytaleModuleType extends ModuleType<ModuleBuilder> {
|
||||
|
||||
public static final String ID = "HYLATE_PLUGIN_MODULE";
|
||||
|
||||
/**
|
||||
* Creates the module type.
|
||||
*/
|
||||
public HytaleModuleType() {
|
||||
super(ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ModuleBuilder createModuleBuilder() {
|
||||
return new CustomProjectModuleBuilder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getName() {
|
||||
return "Hytale Plugin (Maven)";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return "Creates a Hytale server plugin project (Java + Maven) with manifest.json.";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Icon getNodeIcon(boolean isOpened) {
|
||||
return IconLoader.getIcon("/icon/icon.png", HytaleModuleType.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package dev.unlegitdqrk.wizard;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.components.Service;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.vfs.*;
|
||||
import com.intellij.openapi.vfs.newvfs.BulkFileListener;
|
||||
import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Path;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.xpath.XPathConstants;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
/**
|
||||
* Detects whether a project is a Hytale plugin project by checking the Maven pom.xml
|
||||
* for the dependency com.hypixel.hytale:Server. The result is cached and updated
|
||||
* on pom.xml changes.
|
||||
*/
|
||||
@Service(Service.Level.PROJECT)
|
||||
public final class HytaleProjectDetectionService {
|
||||
|
||||
private final Project project;
|
||||
private final AtomicBoolean hytale = new AtomicBoolean(false);
|
||||
|
||||
public HytaleProjectDetectionService(@NotNull Project project) {
|
||||
this.project = project;
|
||||
|
||||
// Initial detection after project is ready (off EDT).
|
||||
scheduleRescan();
|
||||
|
||||
// Track pom.xml modifications to support "after-the-fact" projects.
|
||||
project.getMessageBus().connect().subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() {
|
||||
@Override
|
||||
public void after(@NotNull java.util.List<? extends VFileEvent> events) {
|
||||
if (project.isDisposed()) return;
|
||||
|
||||
boolean relevant = false;
|
||||
for (VFileEvent e : events) {
|
||||
VirtualFile f = e.getFile();
|
||||
if (f == null) continue;
|
||||
if ("pom.xml".equalsIgnoreCase(f.getName())) {
|
||||
relevant = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (relevant) {
|
||||
scheduleRescan();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if the project currently looks like a Hytale Maven project
|
||||
*/
|
||||
public boolean isHytaleProject() {
|
||||
return hytale.get();
|
||||
}
|
||||
|
||||
private void scheduleRescan() {
|
||||
ApplicationManager.getApplication().executeOnPooledThread(this::rescanNow);
|
||||
}
|
||||
|
||||
private void rescanNow() {
|
||||
if (project.isDisposed()) return;
|
||||
|
||||
VirtualFile base = project.getBaseDir();
|
||||
if (base == null || !base.isValid()) {
|
||||
hytale.set(false);
|
||||
return;
|
||||
}
|
||||
|
||||
VirtualFile pom = base.findChild("pom.xml");
|
||||
if (pom == null || !pom.isValid()) {
|
||||
hytale.set(false);
|
||||
return;
|
||||
}
|
||||
|
||||
hytale.set(hasHytaleDependency(pom));
|
||||
}
|
||||
|
||||
private static boolean hasHytaleDependency(@NotNull VirtualFile pomVf) {
|
||||
try (InputStream in = pomVf.getInputStream()) {
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
dbf.setNamespaceAware(true);
|
||||
|
||||
Document doc = dbf.newDocumentBuilder().parse(in);
|
||||
|
||||
var xp = XPathFactory.newInstance().newXPath();
|
||||
|
||||
// Match <dependency><groupId>com.hypixel.hytale</groupId><artifactId>Server</artifactId></dependency>
|
||||
String expr =
|
||||
"boolean(//*[local-name()='dependency']" +
|
||||
"[./*[local-name()='groupId' and normalize-space(text())='com.hypixel.hytale']" +
|
||||
" and ./*[local-name()='artifactId' and normalize-space(text())='Server']])";
|
||||
|
||||
Boolean result = (Boolean) xp.evaluate(expr, doc, XPathConstants.BOOLEAN);
|
||||
return Boolean.TRUE.equals(result);
|
||||
} catch (Exception ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package dev.unlegitdqrk.wizard;
|
||||
|
||||
import com.intellij.ide.projectView.PresentationData;
|
||||
import com.intellij.ide.projectView.ProjectViewNode;
|
||||
import com.intellij.ide.projectView.ProjectViewNodeDecorator;
|
||||
import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
import com.intellij.openapi.util.IconLoader;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
/**
|
||||
* Sets the Hytale icon for the project content root directory node in the Project view.
|
||||
*
|
||||
* <p>This mirrors the approach used by Minecraft Development (mcdev): only decorate the directory node
|
||||
* representing a module content root, never files/folders below it.</p>
|
||||
*/
|
||||
public final class HytaleProjectViewDecorator implements ProjectViewNodeDecorator {
|
||||
|
||||
private static final Icon ICON = IconLoader.getIcon("/icon/icon.png", HytaleProjectViewDecorator.class);
|
||||
|
||||
@Override
|
||||
public void decorate(@NotNull ProjectViewNode<?> node, @NotNull PresentationData data) {
|
||||
if (!(node instanceof PsiDirectoryNode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
PsiDirectoryNode dirNode = (PsiDirectoryNode) node;
|
||||
if (!dirNode.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Project project = dirNode.getProject();
|
||||
if (project == null || project.isDisposed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
HytaleProjectDetectionService svc = project.getService(HytaleProjectDetectionService.class);
|
||||
if (svc == null || !svc.isHytaleProject()) {
|
||||
return;
|
||||
}
|
||||
|
||||
PsiDirectory dir = dirNode.getValue();
|
||||
if (dir == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Module module = ModuleUtilCore.findModuleForPsiElement(dir);
|
||||
if (module == null || module.isDisposed() || !module.isLoaded() || module.getProject().isDisposed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
VirtualFile vf = dirNode.getVirtualFile();
|
||||
if (vf == null || !vf.isValid()) {
|
||||
return;
|
||||
}
|
||||
|
||||
VirtualFile[] roots = ModuleRootManager.getInstance(module).getContentRoots();
|
||||
boolean isContentRoot = false;
|
||||
for (VirtualFile r : roots) {
|
||||
if (vf.equals(r)) {
|
||||
isContentRoot = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!isContentRoot) {
|
||||
return;
|
||||
}
|
||||
|
||||
data.setIcon(ICON);
|
||||
}
|
||||
}
|
||||
49
src/main/java/dev/unlegitdqrk/wizard/table/AuthorRow.java
Normal file
49
src/main/java/dev/unlegitdqrk/wizard/table/AuthorRow.java
Normal file
@@ -0,0 +1,49 @@
|
||||
package dev.unlegitdqrk.wizard.table;
|
||||
|
||||
/**
|
||||
* Represents a single author entry in manifest.json.
|
||||
*/
|
||||
public final class AuthorRow {
|
||||
|
||||
private String name;
|
||||
private String website;
|
||||
|
||||
/**
|
||||
* Creates an author row.
|
||||
*
|
||||
* @param name author name
|
||||
* @param website author website (optional)
|
||||
*/
|
||||
public AuthorRow(String name, String website) {
|
||||
this.name = name;
|
||||
this.website = website;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return author name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name author name
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return author website
|
||||
*/
|
||||
public String getWebsite() {
|
||||
return website;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param website author website
|
||||
*/
|
||||
public void setWebsite(String website) {
|
||||
this.website = website;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package dev.unlegitdqrk.wizard.table;
|
||||
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Table model for the Authors array in manifest.json.
|
||||
*/
|
||||
public final class AuthorTableModel extends AbstractTableModel {
|
||||
|
||||
private static final String[] COLUMNS = {"Name", "Website"};
|
||||
|
||||
private final List<AuthorRow> rows = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return rows.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return COLUMNS.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnName(int column) {
|
||||
return COLUMNS[column];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
AuthorRow row = rows.get(rowIndex);
|
||||
return columnIndex == 0 ? row.getName() : row.getWebsite();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValueAt(Object value, int rowIndex, int columnIndex) {
|
||||
AuthorRow row = rows.get(rowIndex);
|
||||
String v = value == null ? "" : value.toString();
|
||||
|
||||
if (columnIndex == 0) {
|
||||
row.setName(v);
|
||||
} else {
|
||||
row.setWebsite(v);
|
||||
}
|
||||
fireTableCellUpdated(rowIndex, columnIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new empty row.
|
||||
*/
|
||||
public void addRow() {
|
||||
rows.add(new AuthorRow("", ""));
|
||||
fireTableRowsInserted(rows.size() - 1, rows.size() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a row.
|
||||
*
|
||||
* @param index row index
|
||||
*/
|
||||
public void removeRow(int index) {
|
||||
if (index < 0 || index >= rows.size()) return;
|
||||
rows.remove(index);
|
||||
fireTableRowsDeleted(index, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return immutable list of rows
|
||||
*/
|
||||
public List<AuthorRow> getRows() {
|
||||
return Collections.unmodifiableList(rows);
|
||||
}
|
||||
}
|
||||
49
src/main/java/dev/unlegitdqrk/wizard/table/KeyValueRow.java
Normal file
49
src/main/java/dev/unlegitdqrk/wizard/table/KeyValueRow.java
Normal file
@@ -0,0 +1,49 @@
|
||||
package dev.unlegitdqrk.wizard.table;
|
||||
|
||||
/**
|
||||
* Generic key-value row for dependency maps in manifest.json.
|
||||
*/
|
||||
public final class KeyValueRow {
|
||||
|
||||
private String key;
|
||||
private String value;
|
||||
|
||||
/**
|
||||
* Creates a key-value row.
|
||||
*
|
||||
* @param key key (e.g. "Hytale:SomePlugin")
|
||||
* @param value value (e.g. ">=1.0.0" or "*")
|
||||
*/
|
||||
public KeyValueRow(String key, String value) {
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return key
|
||||
*/
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param key key
|
||||
*/
|
||||
public void setKey(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return value
|
||||
*/
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param value value
|
||||
*/
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package dev.unlegitdqrk.wizard.table;
|
||||
|
||||
import javax.swing.table.AbstractTableModel;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Table model for dependency maps in manifest.json.
|
||||
*/
|
||||
public final class KeyValueTableModel extends AbstractTableModel {
|
||||
|
||||
private static final String[] COLUMNS = {"Key", "Value"};
|
||||
|
||||
private final List<KeyValueRow> rows = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public int getRowCount() {
|
||||
return rows.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return COLUMNS.length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getColumnName(int column) {
|
||||
return COLUMNS[column];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCellEditable(int rowIndex, int columnIndex) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValueAt(int rowIndex, int columnIndex) {
|
||||
KeyValueRow row = rows.get(rowIndex);
|
||||
return columnIndex == 0 ? row.getKey() : row.getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValueAt(Object value, int rowIndex, int columnIndex) {
|
||||
KeyValueRow row = rows.get(rowIndex);
|
||||
String v = value == null ? "" : value.toString();
|
||||
|
||||
if (columnIndex == 0) {
|
||||
row.setKey(v);
|
||||
} else {
|
||||
row.setValue(v);
|
||||
}
|
||||
fireTableCellUpdated(rowIndex, columnIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new empty row.
|
||||
*/
|
||||
public void addRow() {
|
||||
rows.add(new KeyValueRow("", ""));
|
||||
fireTableRowsInserted(rows.size() - 1, rows.size() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a row.
|
||||
*
|
||||
* @param index row index
|
||||
*/
|
||||
public void removeRow(int index) {
|
||||
if (index < 0 || index >= rows.size()) return;
|
||||
rows.remove(index);
|
||||
fireTableRowsDeleted(index, index);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return immutable list of rows
|
||||
*/
|
||||
public List<KeyValueRow> getRows() {
|
||||
return Collections.unmodifiableList(rows);
|
||||
}
|
||||
}
|
||||
22
src/main/resources/META-INF/plugin.xml
Normal file
22
src/main/resources/META-INF/plugin.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<idea-plugin>
|
||||
<id>dev.unlegitdqrk.wizard</id>
|
||||
<name>Hytale Wizard</name>
|
||||
<vendor>dev.unlegitdqrk</vendor>
|
||||
|
||||
<depends>com.intellij.modules.java</depends>
|
||||
<depends>org.jetbrains.idea.maven</depends>
|
||||
|
||||
<extensions defaultExtensionNs="com.intellij">
|
||||
<projectService serviceImplementation="dev.unlegitdqrk.wizard.HytaleProjectDetectionService"/>
|
||||
<projectViewNodeDecorator implementation="dev.unlegitdqrk.wizard.HytaleProjectViewDecorator"/>
|
||||
|
||||
<!-- Module type shown in New Project sidebar/list -->
|
||||
<moduleType id="HYLATE_PLUGIN_MODULE"
|
||||
implementationClass="dev.unlegitdqrk.wizard.HytaleModuleType"/>
|
||||
|
||||
<!-- Builder that actually generates the project -->
|
||||
<moduleBuilder id="HYLATE_PLUGIN_BUILDER"
|
||||
builderClass="dev.unlegitdqrk.wizard.CustomProjectModuleBuilder"
|
||||
order="first"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
155
src/main/resources/META-INF/pluginIcon.svg
Normal file
155
src/main/resources/META-INF/pluginIcon.svg
Normal file
@@ -0,0 +1,155 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="129.000000pt" height="186.000000pt" viewBox="0 0 129.000000 186.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,186.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M538 1843 c-158 -3 -167 -5 -173 -24 -7 -20 -8 -20 -26 -3 -14 12
|
||||
-33 17 -62 15 -66 -3 -241 -41 -255 -55 -10 -10 -10 -27 -1 -87 12 -80 72
|
||||
-199 109 -219 18 -9 19 -14 8 -33 -10 -17 -13 -122 -15 -427 -1 -224 1 -411 5
|
||||
-417 9 -14 132 -93 145 -93 5 0 15 -7 21 -15 17 -23 267 -175 299 -182 l27 -5
|
||||
0 -128 c0 -137 1 -139 56 -158 30 -9 36 -6 135 70 57 43 120 93 139 111 19 18
|
||||
53 44 75 60 22 15 64 48 93 74 51 45 54 51 54 95 0 25 -6 56 -12 68 -9 16 -9
|
||||
25 -1 33 8 8 11 150 11 465 0 411 -2 456 -17 467 -18 13 -10 35 12 35 8 0 33
|
||||
27 55 60 32 48 45 78 57 142 18 95 20 92 -82 108 -38 6 -97 15 -130 21 -83 14
|
||||
-261 29 -315 26 -25 -1 -120 -3 -212 -4z m21 -272 l2 -158 -23 4 c-18 3 -23
|
||||
11 -22 30 0 13 7 29 15 34 10 7 11 11 2 17 -6 4 -13 32 -15 62 -2 44 -7 56
|
||||
-22 58 -12 3 -17 -1 -13 -10 2 -7 10 -12 16 -10 6 1 11 -2 11 -8 0 -5 -11 -10
|
||||
-24 -10 -13 0 -38 -3 -55 -6 -26 -6 -30 -4 -25 10 4 11 1 16 -12 16 -16 0 -17
|
||||
2 -4 11 11 7 -9 9 -70 7 -85 -4 -85 -4 -117 29 -36 36 -55 43 -47 16 5 -16 4
|
||||
-16 -6 0 -7 10 -10 21 -7 24 7 6 306 40 368 42 l46 1 2 -159z m399 142 c225
|
||||
-20 219 -14 145 -128 -37 -57 -54 -74 -75 -77 -25 -4 -28 -2 -28 27 0 18 8 37
|
||||
20 48 25 21 26 37 3 37 -10 0 -29 3 -43 6 -19 4 -21 3 -11 -4 11 -8 6 -12 -25
|
||||
-19 -56 -11 -57 -11 -66 17 -6 23 -7 23 -5 -5 1 -22 8 -31 27 -37 16 -4 -1 -6
|
||||
-45 -5 l-70 2 3 -30 c2 -24 -3 -32 -23 -42 l-25 -11 1 91 c0 61 3 85 9 72 7
|
||||
-16 9 -17 9 -3 1 9 -3 20 -9 23 -14 9 -12 55 3 55 6 0 99 -7 205 -17z m-668
|
||||
-232 c0 -63 -1 -66 -25 -67 -21 -2 -25 2 -25 27 0 21 4 27 15 23 17 -7 18 -3
|
||||
6 48 -9 41 -6 49 15 41 10 -4 14 -24 14 -72z m499 -125 c-1 -131 -1 -134 -22
|
||||
-133 -12 0 -41 0 -65 -1 l-44 -2 54 -51 c29 -28 44 -46 33 -41 -13 7 -27 7
|
||||
-38 1 -14 -8 -16 -6 -14 12 1 12 -5 24 -13 27 -13 4 -13 3 -1 -11 11 -14 10
|
||||
-18 -12 -28 -22 -10 -32 -8 -71 15 -25 15 -46 23 -46 18 0 -6 -8 -12 -18 -14
|
||||
-12 -4 -18 1 -19 13 -1 12 3 16 15 13 14 -5 13 -3 -2 10 -29 23 -12 31 23 10
|
||||
29 -17 31 -17 51 1 l22 19 -29 8 c-15 4 -40 5 -56 3 l-28 -5 2 90 c2 87 2 90
|
||||
25 90 23 0 24 -3 24 -76 l0 -77 61 7 c34 3 80 6 103 7 23 0 35 3 29 6 -9 3
|
||||
-13 33 -13 102 0 96 8 121 37 121 11 0 13 -29 12 -134z m249 122 c8 -8 12 -46
|
||||
12 -104 0 -87 -1 -93 -22 -100 l-23 -7 23 -8 c22 -8 22 -11 22 -204 0 -134 -3
|
||||
-194 -10 -190 -6 4 -17 1 -25 -5 -13 -11 -15 29 -15 309 0 330 2 345 38 309z
|
||||
m-95 -67 c-3 -12 3 -24 18 -35 13 -8 20 -18 17 -21 -9 -9 -48 18 -48 32 0 7
|
||||
-4 13 -10 13 -17 0 -11 18 8 23 9 3 18 5 19 6 0 0 -1 -7 -4 -18z m-83 -27
|
||||
c-16 -14 -36 -23 -42 -21 -8 4 -7 6 3 6 9 1 24 12 33 26 9 14 21 23 26 20 6
|
||||
-4 -3 -18 -20 -31z m-570 -144 l0 -160 -25 0 -25 0 0 146 c0 128 2 148 18 160
|
||||
9 7 20 14 25 14 4 0 7 -72 7 -160z m600 109 c0 -6 -4 -7 -10 -4 -5 3 -10 -2
|
||||
-10 -13 0 -10 -13 -28 -30 -40 -16 -13 -30 -18 -30 -13 0 5 9 16 21 24 11 8
|
||||
21 21 23 28 5 34 36 49 36 18z m30 11 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11 10
|
||||
-3 6 -1 10 4 10 6 0 11 -4 11 -10z m30 -47 c0 -43 -5 -41 -13 5 -4 18 -2 32 3
|
||||
32 6 0 10 -16 10 -37z m-120 12 c-7 -9 -15 -13 -17 -11 -7 7 7 26 19 26 6 0 6
|
||||
-6 -2 -15z m89 -7 c10 -28 4 -48 -15 -48 -16 0 -19 16 -4 25 13 8 13 25 -1 25
|
||||
-5 0 -7 -4 -4 -10 3 -5 1 -10 -4 -10 -12 0 -15 23 -4 33 12 13 24 7 32 -15z
|
||||
m-460 -31 c0 -9 -2 -8 -6 1 -2 6 -10 9 -15 6 -7 -4 -8 -2 -4 5 9 13 26 5 25
|
||||
-12z m35 -60 c5 -13 5 -58 0 -103 l-8 -79 -6 50 -6 50 -8 -62 c-5 -35 -13 -60
|
||||
-18 -57 -4 3 -8 11 -7 17 4 30 -2 58 -10 53 -5 -3 -7 -15 -4 -26 4 -14 0 -20
|
||||
-12 -20 -12 0 -15 5 -11 18 4 11 -1 8 -12 -7 -11 -14 -22 -19 -25 -14 -10 16
|
||||
31 63 54 63 12 0 19 7 18 18 0 10 -3 12 -6 5 -2 -7 -12 -13 -21 -13 -20 0 -62
|
||||
-39 -62 -57 0 -8 -4 -12 -9 -8 -18 11 10 63 42 80 22 11 25 15 10 12 -27 -6
|
||||
-29 3 -7 45 l17 32 18 -23 c14 -17 19 -19 19 -7 0 8 -13 22 -29 31 -34 17 -45
|
||||
31 -36 44 3 6 26 -4 50 -20 25 -17 43 -35 40 -40 -4 -5 -1 -9 4 -9 25 0 8 32
|
||||
-29 55 -52 33 -51 39 3 15 25 -11 46 -28 51 -43z m381 53 c-3 -5 -12 -10 -19
|
||||
-10 -14 0 -32 -67 -22 -78 3 -3 6 4 6 16 0 22 37 68 47 58 3 -2 -2 -15 -11
|
||||
-28 -32 -46 -18 -109 32 -137 9 -5 14 -12 10 -16 -3 -4 -22 4 -42 17 -25 16
|
||||
-36 31 -36 47 0 29 -13 20 -15 -10 -1 -12 5 -24 14 -27 30 -11 46 -36 47 -71
|
||||
1 -20 2 -41 3 -48 0 -6 24 -25 52 -43 28 -17 49 -34 46 -37 -10 -9 -105 48
|
||||
-115 71 -8 16 -11 17 -11 4 -1 -10 24 -35 56 -58 57 -41 72 -64 49 -77 -15
|
||||
-10 -46 -54 -46 -66 0 -5 12 5 26 22 14 17 30 31 35 31 17 0 9 -21 -18 -45
|
||||
-16 -13 -23 -25 -16 -25 6 0 15 5 18 10 10 16 25 12 25 -6 0 -9 -7 -22 -16
|
||||
-29 -21 -15 -59 1 -73 30 -8 16 -10 17 -10 3 -1 -22 -58 -51 -68 -35 -19 31
|
||||
-8 48 15 25 25 -25 12 17 -13 45 -33 35 -20 35 17 0 16 -15 28 -21 28 -14 0 7
|
||||
-17 28 -37 47 -43 40 -39 56 5 19 31 -26 68 -37 44 -13 -7 7 -12 23 -13 37
|
||||
l-1 26 -7 -25 c-12 -43 -19 -9 -20 100 -1 58 -5 106 -9 108 -4 1 -14 7 -22 12
|
||||
-13 9 -13 11 0 19 12 9 12 11 -3 17 -13 5 -15 10 -7 19 6 7 8 19 4 28 -3 8 -1
|
||||
18 5 22 6 3 11 13 11 22 0 21 29 53 47 53 8 0 11 -4 8 -10z m45 -45 c0 -16 -6
|
||||
-25 -15 -25 -18 0 -18 5 -5 31 14 26 20 24 20 -6z m30 0 c0 -27 -42 -74 -49
|
||||
-54 -2 6 3 16 12 20 8 5 18 20 21 34 8 32 16 32 16 0z m-575 -15 c11 0 9 -9
|
||||
-7 -37 -21 -37 -39 -55 -46 -49 -1 2 7 20 19 40 26 44 20 58 -10 20 -28 -35
|
||||
-27 -21 1 19 12 17 24 25 26 19 2 -7 10 -12 17 -12z m509 -34 c-6 -27 9 -45
|
||||
66 -77 41 -23 57 -49 18 -28 -86 45 -98 58 -98 100 0 24 4 38 10 34 6 -3 7
|
||||
-17 4 -29z m82 8 c-6 -23 -4 -26 11 -20 12 5 10 -1 -9 -20 -15 -16 -31 -25
|
||||
-34 -21 -4 4 1 14 12 22 10 8 14 15 7 15 -6 0 -15 -4 -18 -10 -3 -5 -13 -10
|
||||
-21 -10 -9 0 -3 12 18 34 40 42 42 43 34 10z m-244 4 c-9 -9 -15 -9 -24 0 -9
|
||||
9 -7 12 12 12 19 0 21 -3 12 -12z m38 -13 c-15 -18 1 -20 18 -3 9 9 12 9 12 1
|
||||
0 -7 -5 -15 -10 -18 -8 -5 -7 -11 1 -21 19 -23 0 -16 -26 10 -21 21 -22 25 -7
|
||||
39 19 20 30 13 12 -8z m-204 -50 c-11 -8 -25 -15 -30 -15 -6 1 0 7 14 15 32
|
||||
19 40 18 16 0z m429 -15 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4
|
||||
10 5 0 13 -4 16 -10z m-195 -147 c0 -122 -1 -126 -18 -110 -10 10 -22 14 -25
|
||||
10 -4 -3 -7 37 -7 89 0 121 -1 122 -117 113 -48 -3 -96 -8 -105 -11 -12 -4
|
||||
-15 0 -11 16 5 19 13 20 144 20 l139 0 0 -127z m40 107 c0 -5 -7 -7 -15 -4 -8
|
||||
4 -15 8 -15 10 0 2 7 4 15 4 8 0 15 -4 15 -10z m100 -56 c-7 -7 -20 -14 -29
|
||||
-13 -12 0 -11 4 7 16 12 8 23 25 23 37 2 20 2 19 6 -2 3 -13 -1 -30 -7 -38z
|
||||
m-15 37 c3 -5 1 -12 -4 -15 -5 -3 -11 1 -15 9 -6 16 9 21 19 6z m-364 -68 c0
|
||||
-38 3 -99 5 -137 5 -59 3 -68 -10 -63 -8 3 -18 2 -21 -3 -16 -26 -20 0 -19
|
||||
118 1 132 5 152 30 152 11 0 14 -16 15 -67z m419 52 c0 -16 -49 -65 -65 -65
|
||||
-5 0 5 13 23 28 18 15 32 33 32 40 0 6 2 12 5 12 3 0 5 -7 5 -15z m-680 -135
|
||||
c0 -77 -3 -140 -6 -140 -3 0 -14 5 -25 10 -17 10 -19 22 -19 134 0 67 3 126 7
|
||||
129 3 4 15 7 25 7 17 0 18 -11 18 -140z m112 96 c31 -15 58 -35 60 -44 6 -33
|
||||
-7 -267 -15 -251 -4 8 -6 65 -4 125 3 60 1 116 -3 124 -5 9 -36 29 -69 45 -34
|
||||
16 -61 33 -61 37 0 5 8 5 18 0 9 -5 42 -21 74 -36z m417 -10 c-9 -8 -10 -7 -5
|
||||
7 3 10 7 26 7 35 1 9 4 6 6 -7 3 -13 -1 -28 -8 -35z m-341 22 c5 7 8 -27 8
|
||||
-75 0 -64 -1 -71 -3 -26 -4 61 -5 63 -43 84 -22 12 -37 26 -34 30 2 4 18 0 34
|
||||
-9 24 -13 32 -14 38 -4z m-138 -18 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8 5
|
||||
-10 10 -5 10 6 0 17 -5 25 -10z m623 -11 c-9 -9 -6 -17 10 -31 22 -19 22 -19
|
||||
-11 -1 -30 16 -31 19 -15 30 21 16 31 17 16 2z m-573 -6 c0 -5 -18 -16 -40
|
||||
-25 -48 -20 -52 -15 -7 12 34 21 47 25 47 13z m30 -18 c0 -2 -14 -12 -31 -20
|
||||
-16 -9 -34 -26 -39 -38 -8 -21 -9 -21 -9 5 -1 20 7 31 27 42 27 15 52 20 52
|
||||
11z m-15 -49 c-16 -13 -25 -28 -21 -34 4 -7 2 -12 -3 -12 -6 0 -11 11 -11 25
|
||||
0 16 9 29 28 39 38 20 42 10 7 -18z m420 3 c11 -17 -1 -21 -15 -4 -8 9 -8 15
|
||||
-2 15 6 0 14 -5 17 -11z m-395 -24 c0 -8 -4 -15 -9 -15 -13 0 -22 16 -14 24
|
||||
11 11 23 6 23 -9z m-95 -33 c-3 -3 -11 0 -18 7 -9 10 -8 11 6 5 10 -3 15 -9
|
||||
12 -12z m90 -2 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13
|
||||
-4 16 -10z m-31 -15 c20 -8 36 -20 36 -25 0 -6 -18 -1 -40 10 -22 11 -40 23
|
||||
-40 25 0 7 4 6 44 -10z m654 -140 c2 -104 -1 -141 -10 -147 -10 -8 -10 -11 0
|
||||
-15 7 -3 12 -26 12 -63 l0 -58 -52 -39 c-29 -21 -57 -38 -63 -38 -16 0 -33
|
||||
-19 -27 -29 3 -5 -2 -7 -11 -3 -9 3 -21 -1 -29 -11 -11 -13 -11 -14 1 -7 10 6
|
||||
12 4 7 -4 -5 -7 -14 -10 -22 -7 -8 3 -13 0 -11 -7 1 -7 -4 -11 -11 -9 -8 1
|
||||
-11 -2 -8 -7 3 -5 -1 -14 -9 -21 -12 -10 -15 -10 -15 0 0 10 -3 10 -15 0 -8
|
||||
-7 -13 -16 -10 -20 9 -15 -16 -23 -28 -10 -9 10 -8 12 6 7 10 -4 16 -3 12 3
|
||||
-3 5 -7 139 -9 297 -2 158 -5 295 -7 303 -3 9 5 16 18 18 l23 3 2 -260 3 -261
|
||||
95 66 c52 36 99 69 103 74 5 4 8 91 7 193 0 186 2 201 35 193 6 -2 11 -59 13
|
||||
-141z m-561 78 c-3 -10 -5 -4 -5 12 0 17 2 24 5 18 2 -7 2 -21 0 -30z m-82 7
|
||||
c-3 -5 -12 -10 -18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m25 -20 c0 -5 -5
|
||||
-10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m118 -12 c13 -13
|
||||
16 -109 6 -207 -5 -39 -10 -57 -15 -49 -6 10 -9 8 -9 -6 0 -11 -3 -16 -7 -12
|
||||
-5 4 -8 12 -8 17 0 11 -94 79 -109 79 -5 0 -1 -6 10 -14 10 -8 17 -17 14 -20
|
||||
-3 -3 -47 18 -98 47 l-92 52 3 55 c2 49 5 55 25 58 19 3 22 -1 22 -32 0 -32 5
|
||||
-38 48 -62 26 -15 73 -42 105 -60 32 -19 60 -34 63 -34 2 0 4 45 4 100 0 102
|
||||
7 119 38 88z m-148 -2 c0 -2 -7 -9 -15 -16 -13 -11 -14 -10 -9 4 5 14 24 23
|
||||
24 12z m28 -36 c-2 -6 -8 -6 -18 0 -13 9 -13 11 0 20 15 10 25 0 18 -20z m59
|
||||
-17 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m423 17 c0 -11 -7
|
||||
-20 -15 -20 -15 0 -21 21 -8 33 12 13 23 7 23 -13z m-40 0 c0 -5 -5 -10 -11
|
||||
-10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m75 0 c3 -5 -1 -10 -10
|
||||
-10 -9 0 -13 5 -10 10 3 6 8 10 10 10 2 0 7 -4 10 -10z m-510 -30 c3 -5 2 -10
|
||||
-4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m392 4 c-3 -3
|
||||
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m113 -6 c0 -4 -7 -8 -15 -8 -8
|
||||
0 -15 -4 -15 -10 0 -5 -7 -10 -15 -10 -8 0 -15 5 -15 11 0 5 -5 7 -10 4 -6 -4
|
||||
-5 -12 5 -21 11 -12 19 -13 36 -4 11 7 23 10 25 7 8 -8 -8 -37 -17 -31 -5 3
|
||||
-9 -3 -10 -13 0 -10 -3 -13 -6 -5 -2 6 -10 12 -18 12 -21 0 -36 26 -30 52 5
|
||||
19 13 23 45 23 22 1 40 -3 40 -7z m47 -24 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6
|
||||
11 1 17 -2 13 -5z m-128 -72 c-2 -5 -14 7 -27 27 l-24 36 27 -26 c15 -15 26
|
||||
-31 24 -37z m103 26 c-7 -7 -12 -8 -12 -2 0 14 12 26 19 19 2 -3 -1 -11 -7
|
||||
-17z"/>
|
||||
<path d="M770 1621 c0 -16 28 -20 34 -5 4 9 -1 14 -14 14 -11 0 -20 -4 -20 -9z"/>
|
||||
<path d="M930 1620 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
|
||||
-10 -4 -10 -10z"/>
|
||||
<path d="M633 1214 c3 -4 -3 -14 -14 -23 -18 -15 -18 -18 -4 -38 16 -23 40
|
||||
-30 49 -14 3 4 -2 17 -10 27 -15 18 -15 18 -10 -5 5 -22 4 -23 -11 -8 -15 15
|
||||
-15 18 0 35 20 22 22 32 5 32 -6 0 -9 -3 -5 -6z"/>
|
||||
<path d="M253 1300 c0 -41 2 -58 4 -37 2 20 2 54 0 75 -2 20 -4 3 -4 -38z"/>
|
||||
<path d="M467 1175 c-4 -8 -2 -17 3 -20 6 -4 10 3 10 14 0 25 -6 27 -13 6z"/>
|
||||
<path d="M425 1160 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0
|
||||
-8 -4 -11 -10z"/>
|
||||
<path d="M862 1050 c0 -19 2 -27 5 -17 2 9 2 25 0 35 -3 9 -5 1 -5 -18z"/>
|
||||
<path d="M916 854 c-11 -28 -6 -38 9 -18 8 10 15 22 15 27 0 13 -18 7 -24 -9z"/>
|
||||
<path d="M254 739 c-3 -6 -1 -16 5 -22 8 -8 11 -5 11 11 0 24 -5 28 -16 11z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
BIN
src/main/resources/icon/icon.png
Normal file
BIN
src/main/resources/icon/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 693 B |
1
src/main/resources/messages/MyMessageBundle.properties
Normal file
1
src/main/resources/messages/MyMessageBundle.properties
Normal file
@@ -0,0 +1 @@
|
||||
toolwindow.stripe.MyToolWindow=Hytale Wizard
|
||||
Reference in New Issue
Block a user