FROM eclipse-temurin:17-jdk-jammy # Установка необходимых пакетов RUN apt-get update && apt-get install -y \ git \ python3 \ python3-pip \ wget \ unzip \ && rm -rf /var/lib/apt/lists/* # Создание рабочей директории WORKDIR /workspace # Создание структуры мода RUN mkdir -p src/main/java/com/freecam/mod src/main/resources # Создание settings.gradle RUN echo 'pluginManagement {\n\ repositories {\n\ maven {\n\ name = "Fabric"\n\ url = "https://maven.fabricmc.net/"\n\ }\n\ mavenCentral()\n\ gradlePluginPortal()\n\ }\n\ }\n\ \n\ rootProject.name = "freecam-minecraft-mod"' > settings.gradle # Создание gradle.properties RUN echo 'org.gradle.jvmargs=-Xmx3G\n\ org.gradle.daemon=false\n\ \n\ minecraft_version=1.20.1\n\ yarn_mappings=1.20.1+build.10\n\ loader_version=0.15.0\n\ \n\ fabric_version=0.92.0+1.20.1\n\ \n\ mod_version=1.0.0\n\ maven_group=com.freecam\n\ archives_base_name=freecam' > gradle.properties # Создание build.gradle RUN echo 'plugins {\n\ id "fabric-loom" version "1.7-SNAPSHOT"\n\ id "maven-publish"\n\ }\n\ \n\ version = project.mod_version\n\ group = project.maven_group\n\ \n\ base {\n\ archivesName = project.archives_base_name\n\ }\n\ \n\ repositories {\n\ mavenCentral()\n\ }\n\ \n\ dependencies {\n\ minecraft "com.mojang:minecraft:${project.minecraft_version}"\n\ mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"\n\ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"\n\ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"\n\ }\n\ \n\ processResources {\n\ inputs.property "version", project.version\n\ \n\ filesMatching("fabric.mod.json") {\n\ expand "version": project.version\n\ }\n\ }\n\ \n\ tasks.withType(JavaCompile).configureEach {\n\ it.options.release = 17\n\ }\n\ \n\ java {\n\ withSourcesJar()\n\ \n\ sourceCompatibility = JavaVersion.VERSION_17\n\ targetCompatibility = JavaVersion.VERSION_17\n\ }\n\ \n\ jar {\n\ from("LICENSE") {\n\ rename { "${it}_${project.base.archivesName.get()}"}\n\ }\n\ }' > build.gradle # Создание основного класса мода RUN echo 'package com.freecam.mod;\n\ \n\ import net.fabricmc.api.ClientModInitializer;\n\ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;\n\ import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;\n\ import net.minecraft.client.MinecraftClient;\n\ import net.minecraft.client.option.KeyBinding;\n\ import net.minecraft.client.util.InputUtil;\n\ import org.lwjgl.glfw.GLFW;\n\ \n\ public class FreeCamMod implements ClientModInitializer {\n\ private static KeyBinding freecamKey;\n\ private static boolean freecamActive = false;\n\ private static double savedX, savedY, savedZ;\n\ private static float savedYaw, savedPitch;\n\ \n\ @Override\n\ public void onInitializeClient() {\n\ freecamKey = KeyBindingHelper.registerKeyBinding(new KeyBinding(\n\ "key.freecam.toggle",\n\ InputUtil.Type.KEYSYM,\n\ GLFW.GLFW_KEY_H,\n\ "category.freecam"\n\ ));\n\ \n\ ClientTickEvents.END_CLIENT_TICK.register(client -> {\n\ if (freecamKey.wasPressed() && client.player != null) {\n\ if (InputUtil.isKeyPressed(MinecraftClient.getInstance().getWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL)) {\n\ toggleFreecam(client);\n\ }\n\ }\n\ });\n\ }\n\ \n\ private void toggleFreecam(MinecraftClient client) {\n\ if (client.player == null) return;\n\ \n\ freecamActive = !freecamActive;\n\ \n\ if (freecamActive) {\n\ savedX = client.player.getX();\n\ savedY = client.player.getY();\n\ savedZ = client.player.getZ();\n\ savedYaw = client.player.getYaw();\n\ savedPitch = client.player.getPitch();\n\ client.player.noClip = true;\n\ } else {\n\ client.player.setPosition(savedX, savedY, savedZ);\n\ client.player.setYaw(savedYaw);\n\ client.player.setPitch(savedPitch);\n\ client.player.noClip = false;\n\ }\n\ }\n\ }' > src/main/java/com/freecam/mod/FreeCamMod.java # Создание fabric.mod.json RUN echo '{\n\ "schemaVersion": 1,\n\ "id": "freecam",\n\ "version": "${version}",\n\ "name": "FreeCam Mod",\n\ "description": "FreeCam with Ctrl+H",\n\ "authors": ["Author"],\n\ "contact": {},\n\ "license": "MIT",\n\ "environment": "client",\n\ "entrypoints": {\n\ "client": [\n\ "com.freecam.mod.FreeCamMod"\n\ ]\n\ },\n\ "depends": {\n\ "fabricloader": ">=0.15.0",\n\ "minecraft": "~1.20.1",\n\ "java": ">=17",\n\ "fabric-api": "*"\n\ }\n\ }' > src/main/resources/fabric.mod.json # Установка Gradle 8.8 RUN wget https://services.gradle.org/distributions/gradle-8.8-bin.zip && \ unzip gradle-8.8-bin.zip && \ rm gradle-8.8-bin.zip && \ mv gradle-8.8 /opt/gradle ENV PATH="/opt/gradle/bin:${PATH}" # Сборка мода RUN gradle build --no-daemon # Копирование JAR в доступное место RUN mkdir -p /download && \ find build/libs -name "*.jar" ! -name "*-sources.jar" -exec cp {} /download/freecam-mod.jar \; # Создание простого Python HTTP сервера RUN echo 'from http.server import HTTPServer, SimpleHTTPRequestHandler\n\ import os\n\ os.chdir("/download")\n\ server = HTTPServer(("0.0.0.0", 7860), SimpleHTTPRequestHandler)\n\ print("Server running on port 7860")\n\ server.serve_forever()' > /server.py EXPOSE 7860 CMD ["python3", "/server.py"]