diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 49512e9..dffbdbc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,38 +3,33 @@ # certain platforms or Java versions, and provides a first line of defence # against bad commits. -name: build -on: +name: Build +on: pull_request: push: paths-ignore: [ '.github/', 'docs/', 'mkdocs.yml' ] jobs: build: - strategy: - matrix: - # Use these Java versions - java: [ - 17 # Latest version - ] - # and run on both Linux and Windows - os: [ubuntu-latest] - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest steps: - - name: checkout repository - uses: actions/checkout@v2 - - name: setup jdk ${{ matrix.java }} - uses: actions/setup-java@v1 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup JDK 21 + uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} - - name: make gradle wrapper executable - if: ${{ runner.os != 'Windows' }} - run: chmod +x ./gradlew - - name: build + java-version: 21 + distribution: microsoft + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Build run: ./gradlew build - - name: capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from LTS java on one OS - uses: actions/upload-artifact@v2 + + - name: Upload artifacts + uses: actions/upload-artifact@v4 with: name: Artifacts path: build/libs/ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8efd829..6279aa6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,28 +9,32 @@ on: jobs: build: runs-on: ubuntu-latest - steps: - - uses: actions/cache@v2 + - name: Setup Gradle caches + uses: actions/cache@v4 with: path: | - ~/.gradle/loom-cache ~/.gradle/caches + ~/.gradle/loom-cache ~/.gradle/wrapper - key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - gradle- - - uses: actions/checkout@v2 - - name: Set up JDK - uses: actions/setup-java@v1 + key: ${{ runner.os }}-gradle-${{ hashFiles('**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-gradle + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup JDK 21 + uses: actions/setup-java@v4 with: - java-version: 17 + java-version: 21 + distribution: microsoft + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - name: Build and publish with Gradle run: ./gradlew build publish env: MODRINTH: ${{ secrets.MODRINTH }} CHANGELOG: ${{ github.event.release.body }} - RELEASE: true \ No newline at end of file + RELEASE: true diff --git a/.gitignore b/.gitignore index c476faf..2439444 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +libs/ + # gradle .gradle/ diff --git a/build.gradle b/build.gradle index a6dbc93..e1a3c60 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.5-SNAPSHOT' + id 'fabric-loom' version '1.10-SNAPSHOT' id 'maven-publish' id "com.modrinth.minotaur" version "2.+" } @@ -12,21 +12,22 @@ base { } repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - maven { url "https://api.modrinth.com/maven/" } - maven { url 'https://maven.nucleoid.xyz' } maven { name = 'Ladysnake Mods' - url = 'https://maven.ladysnake.org/releases' + url = 'https://maven.ladysnake.org/releases/' + } + maven { + name = 'NucleoidMC' + url = 'https://maven.nucleoid.xyz/' } maven { name = "Fuzs Mod Resources" url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" } + maven { + name = 'Modrinth' + url = 'https://api.modrinth.com/maven/' + } } dependencies { @@ -38,20 +39,16 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "maven.modrinth:anshar:0.0.15" - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-base:5.4.0" - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-block:5.4.0" - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-level:5.4.0" - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:5.4.0" - modImplementation "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:20.4.2" - - modImplementation include('eu.pb4:polymer-virtual-entity:0.7.6+1.20.4') - modImplementation include("xyz.nucleoid:server-translations-api:2.2.0+1.20.3-rc1") - - // Uncomment the following line to enable the deprecated Fabric API modules. - // These are included in the Fabric API production distribution and allow you to update your mod to the latest modules at a later more convenient time. + modImplementation "maven.modrinth:anshar:1.0.2" + modImplementation "org.ladysnake.cardinal-components-api:cardinal-components-base:6.1.2" + modImplementation "org.ladysnake.cardinal-components-api:cardinal-components-block:6.1.2" + modImplementation "org.ladysnake.cardinal-components-api:cardinal-components-level:6.1.2" + modImplementation "org.ladysnake.cardinal-components-api:cardinal-components-entity:6.1.2" + modImplementation "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:21.1.3" - // modImplementation "net.fabricmc.fabric-api:fabric-api-deprecated:${project.fabric_version}" + modImplementation include("eu.pb4:polymer-core:0.9.18+1.21.1") + modImplementation include("eu.pb4:polymer-virtual-entity:0.9.18+1.21.1") + modImplementation include("xyz.nucleoid:server-translations-api:2.3.1+1.21-pre2") } processResources { @@ -63,29 +60,28 @@ processResources { } tasks.withType(JavaCompile).configureEach { - it.options.release = 17 + it.options.encoding = "UTF-8" + it.options.release = 21 } java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } jar { from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} + rename { "${it}_${project.base.archivesName.get()}" } } } -// configure the maven publication +// Configure the maven publication publishing { publications { - mavenJava(MavenPublication) { + create("mavenJava", MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/gradle.properties b/gradle.properties index aa3ff5d..3679670 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,14 +4,14 @@ org.gradle.parallel=true # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.4 -yarn_mappings=1.20.4+build.3 -loader_version=0.15.6 +minecraft_version=1.21.1 +yarn_mappings=1.21.1+build.3 +loader_version=0.16.10 # Mod Properties -mod_version=0.0.15.1 +mod_version=1.0.2.1 maven_group=eu.pb4.ansharpatch archives_base_name=anshar-polymer-patch # Dependencies -fabric_version=0.96.1+1.20.4 \ No newline at end of file +fabric_version=0.115.3+1.21.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd49..9bbc975 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e09..37f853b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 1aa94a4..faf9300 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -203,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/src/main/java/eu/pb4/ansharpatch/AnsharPolymerPatch.java b/src/main/java/eu/pb4/ansharpatch/AnsharPolymerPatch.java index 05df260..bfe54d5 100644 --- a/src/main/java/eu/pb4/ansharpatch/AnsharPolymerPatch.java +++ b/src/main/java/eu/pb4/ansharpatch/AnsharPolymerPatch.java @@ -1,9 +1,8 @@ package eu.pb4.ansharpatch; +import com.lgmrszd.anshar.beacon.EndCrystalItemContainer; +import eu.pb4.polymer.core.api.other.PolymerComponent; import net.fabricmc.api.ModInitializer; - -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; -import net.minecraft.resource.ResourceType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,7 +11,9 @@ public class AnsharPolymerPatch implements ModInitializer { @Override public void onInitialize() { - /*PolymerResourcePackUtils.addModAssets("anshar"); + PolymerComponent.registerDataComponent(EndCrystalItemContainer.BEACON_POS_DATA_COMPONENT); + /* + PolymerResourcePackUtils.addModAssets("anshar"); PolymerResourcePackUtils.getInstance().creationEvent.register(x -> { x.addWriteConverter((path, bytes) -> path.startsWith("/assets/anshar/sounds/tunes") ? null : bytes); }); diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/DisableComponentSyncMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/DisableComponentSyncMixin.java index 9551e49..e93c276 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/DisableComponentSyncMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/DisableComponentSyncMixin.java @@ -3,13 +3,12 @@ import com.lgmrszd.anshar.beacon.BeaconComponent; import com.lgmrszd.anshar.beacon.EndCrystalComponent; import com.lgmrszd.anshar.transport.PlayerTransportComponent; -import dev.onyxstudios.cca.api.v3.component.sync.AutoSyncedComponent; import net.minecraft.server.network.ServerPlayerEntity; +import org.ladysnake.cca.api.v3.component.sync.AutoSyncedComponent; import org.spongepowered.asm.mixin.Mixin; @Mixin({BeaconComponent.class, EndCrystalComponent.class, PlayerTransportComponent.class}) public abstract class DisableComponentSyncMixin implements AutoSyncedComponent { - @Override public boolean shouldSyncWith(ServerPlayerEntity player) { return false; diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/EntityStatusS2CPacketAccessor.java b/src/main/java/eu/pb4/ansharpatch/mixin/EntityStatusS2CPacketAccessor.java index 1f0db70..1e74059 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/EntityStatusS2CPacketAccessor.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/EntityStatusS2CPacketAccessor.java @@ -8,16 +8,10 @@ @Mixin(EntityStatusS2CPacket.class) public interface EntityStatusS2CPacketAccessor { @Accessor - int getId(); - @Mutable - @Accessor - void setId(int id); + void setEntityId(int id); @Accessor - byte getStatus(); - @Mutable - @Accessor void setStatus(byte status); } diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/FileResourcePackProviderAccessor.java b/src/main/java/eu/pb4/ansharpatch/mixin/FileResourcePackProviderAccessor.java index 0ce2237..3601ac3 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/FileResourcePackProviderAccessor.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/FileResourcePackProviderAccessor.java @@ -2,13 +2,11 @@ import net.minecraft.resource.FileResourcePackProvider; import net.minecraft.resource.ResourcePackSource; -import net.minecraft.resource.ResourceType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(FileResourcePackProvider.class) public interface FileResourcePackProviderAccessor { - @Accessor ResourcePackSource getSource(); } diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/ModRegistriationMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/ModRegistriationMixin.java index ffe3ae3..b853889 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/ModRegistriationMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/ModRegistriationMixin.java @@ -1,7 +1,11 @@ package eu.pb4.ansharpatch.mixin; import com.lgmrszd.anshar.ModRegistration; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.util.Identifier; import org.spongepowered.asm.mixin.Mixin; @@ -10,13 +14,16 @@ @Mixin(ModRegistration.class) public class ModRegistriationMixin { - @Redirect(method = "registerAll", at = @At(value = "INVOKE", target = "Lnet/minecraft/registry/Registry;register(Lnet/minecraft/registry/Registry;Lnet/minecraft/util/Identifier;Ljava/lang/Object;)Ljava/lang/Object;")) - private static Object dontRegister(Registry registry, Identifier id, Object entry) { + @WrapOperation(method = "registerAll", at = @At(value = "INVOKE", target = "Lnet/minecraft/registry/Registry;register(Lnet/minecraft/registry/Registry;Lnet/minecraft/util/Identifier;Ljava/lang/Object;)Ljava/lang/Object;")) + private static T cancelRegistration(Registry registry, Identifier id, T entry, Operation original) { + if (Registries.DATA_COMPONENT_TYPE.equals(registry)) { + return original.call(registry, id, entry); + } return entry; } - @Redirect(method = "registerAll", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/api/networking/v1/ServerPlayNetworking;registerGlobalReceiver(Lnet/minecraft/util/Identifier;Lnet/fabricmc/fabric/api/networking/v1/ServerPlayNetworking$PlayChannelHandler;)Z")) - private static boolean networkingBad(Identifier channelName, ServerPlayNetworking.PlayChannelHandler channelHandler) { + @Redirect(method = "registerAll", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/api/networking/v1/ServerPlayNetworking;registerGlobalReceiver(Lnet/minecraft/network/packet/CustomPayload$Id;Lnet/fabricmc/fabric/api/networking/v1/ServerPlayNetworking$PlayPayloadHandler;)Z")) + private static boolean cancelNetworking(CustomPayload.Id type, ServerPlayNetworking.PlayPayloadHandler handler) { return false; } } diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/PlayerManagerMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/PlayerManagerMixin.java new file mode 100644 index 0000000..4dbc801 --- /dev/null +++ b/src/main/java/eu/pb4/ansharpatch/mixin/PlayerManagerMixin.java @@ -0,0 +1,15 @@ +package eu.pb4.ansharpatch.mixin; + +import net.minecraft.server.PlayerManager; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(PlayerManager.class) +public class PlayerManagerMixin { +// @WrapOperation(method = "sendWorldInfo", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V", ordinal = 3)) +// private void cancelRainPacket(ServerPlayNetworkHandler instance, Packet packet, Operation original) { +// if (PlayerTransportComponent.KEY.get(instance.player).isInNetwork()) { +// return; +// } +// original.call(instance, packet); +// } +} diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/PlayerTransportComponentMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/PlayerTransportComponentMixin.java index c441525..65240e0 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/PlayerTransportComponentMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/PlayerTransportComponentMixin.java @@ -12,19 +12,19 @@ import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.client.render.model.json.ModelTransformationMode; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.FireworksComponent; import net.minecraft.entity.EntityStatuses; import net.minecraft.entity.EntityType; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.decoration.Brightness; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FireworkRocketItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.s2c.play.*; import net.minecraft.particle.DustParticleEffect; -import net.minecraft.particle.ParticleEffect; import net.minecraft.particle.ParticleTypes; import net.minecraft.registry.Registries; import net.minecraft.server.network.ServerPlayNetworkHandler; @@ -33,11 +33,12 @@ import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; import net.minecraft.world.GameMode; -import net.minecraft.world.explosion.Explosion; import org.jetbrains.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Vector3f; @@ -49,39 +50,18 @@ import java.util.*; - -@Mixin(PlayerTransportComponent.class) +@Mixin(value = PlayerTransportComponent.class, remap = false) public abstract class PlayerTransportComponentMixin implements HolderAttachment { - @Shadow - @Final - private PlayerEntity player; - @Shadow - private @Nullable BeaconNode target; - - @Shadow - public abstract Set getJumpCandidates(); - - @Shadow - public abstract BeaconNode getNearestLookedAt(); - - @Shadow - public abstract boolean tryJump(BeaconNode node); - - @Shadow - protected abstract void moveToCurrentTarget(); - - @Shadow - public abstract double distanceTo(BeaconNode node); + @Shadow @Final private PlayerEntity player; + @Shadow private BeaconNode target; - @Shadow - public abstract Vector3f compassNormToNode(BeaconNode node); + @Shadow protected abstract void moveToCurrentTarget(); + @Shadow public abstract Set getJumpCandidates(); + @Shadow public abstract BeaconNode getNearestLookedAt(); + @Shadow public abstract Vector3f compassNormToNode(BeaconNode node); + @Shadow public abstract double distanceTo(BeaconNode node); + @Shadow public abstract boolean tryJump(BeaconNode node); - @Shadow public abstract boolean isInNetwork(); - - @Shadow public abstract void serverTick(); - - @Unique - private static final int TICKS_TO_JUMP = 230; @Unique private final ElementHolder holder = new ElementHolder(); @Unique @@ -111,13 +91,21 @@ private void onInit(PlayerEntity player, CallbackInfo ci) { i.setBrightness(new Brightness(0, 0)); holder.addElement(i); holder.setAttachment(this); - if (player instanceof ServerPlayerEntity serverPlayer) { - this.serverPlayer = serverPlayer; + if (player instanceof ServerPlayerEntity spe) { + this.serverPlayer = spe; } } + @Inject(method = "enterNetwork", at = @At("HEAD")) + private void onEnterHead(FrequencyNetwork network, BlockPos through, CallbackInfo ci) { + if (this.serverPlayer == null) { + return; + } + this.isSetup = false; + } + @Inject(method = "enterNetwork", at = @At("TAIL")) - private void onEnter(FrequencyNetwork network, BlockPos through, CallbackInfo ci) { + private void onEnterTail(FrequencyNetwork network, BlockPos through, CallbackInfo ci) { if (this.serverPlayer == null) { return; } @@ -127,17 +115,20 @@ private void onEnter(FrequencyNetwork network, BlockPos through, CallbackInfo ci @Unique private void setupState() { - this.isSetup = true; var list = new IntArrayList(source.getEntityIds()); list.rem(this.source.getEntityId()); list.add(this.player.getId()); this.holder.startWatching(this.serverPlayer); this.serverPlayer.networkHandler.sendPacket(VirtualEntityUtils.createRidePacket(this.source.getEntityId(), list)); this.serverPlayer.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.GAME_MODE_CHANGED, GameMode.SPECTATOR.getId())); +// if (getWorld().isRaining()) { +// this.serverPlayer.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.RAIN_STOPPED, GameStateChangeS2CPacket.DEMO_OPEN_SCREEN)); +// } + this.done = false; } - @Inject(method = "exitNetwork", at = @At("HEAD"), remap = false) - private void onExit(CallbackInfo ci) { + @Inject(method = "exitNetwork", at = @At("HEAD")) + private void onExitHead(CallbackInfo ci) { if (this.serverPlayer == null) { return; } @@ -149,9 +140,18 @@ private void onExit(CallbackInfo ci) { this.serverPlayer.networkHandler.sendPacket(new TitleS2CPacket(Text.empty())); this.serverPlayer.networkHandler.sendPacket(new SubtitleS2CPacket(Text.empty())); this.serverPlayer.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.GAME_MODE_CHANGED, this.serverPlayer.interactionManager.getGameMode().getId())); +// if (getWorld().isRaining()) { +// this.serverPlayer.networkHandler.sendPacket(new GameStateChangeS2CPacket(GameStateChangeS2CPacket.RAIN_STARTED, GameStateChangeS2CPacket.DEMO_OPEN_SCREEN)); +// } + this.done = true; + } + + @Inject(method = "exitNetwork", at = @At("TAIL")) + private void onExitTail(CallbackInfo ci) { + this.isSetup = false; } - @Inject(method = "serverTick", at = @At(value = "INVOKE", target = "Lcom/lgmrszd/anshar/transport/PlayerTransportComponent;moveToCurrentTarget()V"), remap = false) + @Inject(method = "serverTick", at = @At(value = "INVOKE", target = "Lcom/lgmrszd/anshar/transport/PlayerTransportComponent;moveToCurrentTarget()V")) public void onTick(CallbackInfo ci) { if (this.serverPlayer == null) { return; @@ -166,7 +166,7 @@ public void onTick(CallbackInfo ci) { } else { this.holder.tick(); if (this.player.forwardSpeed > 0.1) { - if (this.nearest == null && this.gateTicks == 0 && this.player.getWorld().getTime() % 10L == 0L) { + if (this.nearest == null && this.gateTicks == 0 && getWorld().getTime() % 10L == 0L) { this.nearest = this.getNearestLookedAt(); if (this.nearest != null) { //this.audioManager.playJump(); @@ -176,7 +176,7 @@ public void onTick(CallbackInfo ci) { if (this.nearest != null) { if (this.gateTicks % 40 == 0) { this.serverPlayer.networkHandler.sendPacket(new PlaySoundS2CPacket(Registries.SOUND_EVENT.getEntry(SoundEvents.BLOCK_BEACON_AMBIENT), SoundCategory.BLOCKS, - serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), 0.8f, 2f, 0l)); + serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), 0.8f, 2f, 0L)); } ++this.gateTicks; @@ -188,7 +188,6 @@ public void onTick(CallbackInfo ci) { //this.spawnOrientationParticles(); this.serverPlayer.networkHandler.sendPacket(new StopSoundS2CPacket(SoundEvents.BLOCK_BEACON_AMBIENT.getId(), SoundCategory.BLOCKS)); } - var helpColr = 7368816; BeaconNode target; @@ -206,14 +205,14 @@ public void onTick(CallbackInfo ci) { Text pos; if (target != null) { - name = Text.empty().append(target.getName()).withColor(target.getColorHex()); - pos = Text.literal(target.getPos().toShortString()).append(" (" + (int) this.distanceTo(target) + ")").withColor(16777215); + name = Text.empty().append(target.getName()).withColor(ColorHelper.Argb.fullAlpha(target.getColor())); + pos = Text.literal(target.getPos().toShortString()).append(" (" + (int) this.distanceTo(target) + ")").withColor(Formatting.WHITE.getColorValue()); } else { name = Text.empty(); pos = Text.empty(); } this.serverPlayer.networkHandler.sendPacket(new TitleFadeS2CPacket(0, 10, 0)); - this.serverPlayer.sendMessage(Text.translatable("anshar.help.transport.location", this.target.getName()).withColor(helpColr), true); + this.serverPlayer.sendMessage(Text.translatable("anshar.help.transport.location", this.target.getName()).withColor(Formatting.GRAY.getColorValue()), true); this.serverPlayer.networkHandler.sendPacket(new TitleS2CPacket(name)); this.serverPlayer.networkHandler.sendPacket(new SubtitleS2CPacket(pos)); @@ -228,11 +227,11 @@ public void onTick(CallbackInfo ci) { } else { //this.audioManager.tick(); } - } } } + @Unique private void drawGate(BeaconNode node, boolean nearest, int ticks) { Vector3f normalGirl = this.compassNormToNode(node); float jumpRatio = (float) ticks / 230.0F; @@ -243,18 +242,19 @@ private void drawGate(BeaconNode node, boolean nearest, int ticks) { float gateHeight = 10.0F * (float) Math.pow(intensity, 4.0); float starSpeed = 0.1F * ((float) Math.pow(intensity, 4.0) - 1.0F); - for (int side = -1; side <= 1; side += 2) { - for (int i = 0; i < 3 * (int) Math.pow(intensity, 4.0); ++i) { + for (int i = 0; i < 3 * (int) Math.pow(intensity, 6.0F); ++i) { float pY = random.nextFloat() * gateHeight - gateHeight / 2.0F; Vector3f pPos = (new Vector3f(gateWidth * (float) side, pY, 0.0F)).mul(M).add(normalExt).add(player.getEyePos().toVector3f()); Vector3f pVel = (new Vector3f(0.0F, 0.0F, starSpeed)).mul(M); - float[] colors = node.getColor(); + int red = ColorHelper.Argb.getRed(node.getColor()); + int green = ColorHelper.Argb.getGreen(node.getColor()); + int blue = ColorHelper.Argb.getBlue(node.getColor()); var color = new Vector3f(); if (nearest) { - color.set(colors[0] + jumpRatio * (random.nextFloat() - colors[0]), colors[1] + jumpRatio * (random.nextFloat() - colors[1]), colors[2] + jumpRatio * (random.nextFloat() - colors[2])); + color.set(red + jumpRatio * (random.nextFloat() - red), green + jumpRatio * (random.nextFloat() - green), blue + jumpRatio * (random.nextFloat() - blue)); } else { - color.set(colors[0], colors[1], colors[2]); + color.set(red, green, blue); } var e = random.nextFloat() < jumpRatio ? ParticleTypes.FIREWORK : new DustParticleEffect(color, 15); @@ -263,34 +263,29 @@ private void drawGate(BeaconNode node, boolean nearest, int ticks) { } } - public float getJumpPercentage() { - return (float) this.gateTicks / 230.0F; - } - - @Redirect(method = "moveToCurrentTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;teleport(DDD)V")) + @Redirect(method = "moveToCurrentTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;requestTeleport(DDD)V", remap = true)) private void replaceTeleport(PlayerEntity instance, double x, double y, double z) { instance.setPos(x, y, z); } /** * @author Patbox - * @reason Server sidin + * @reason Server-siding */ @Overwrite public void sendExplosionPacketS2C(boolean skipOurselves, BlockPos pos, int color) { - var list = new ArrayList>(); + var list = new ArrayList>(); var id = VirtualEntityUtils.requestEntityId(); - list.add(new EntitySpawnS2CPacket(id, UUID.randomUUID(), - pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0, EntityType.FIREWORK_ROCKET, 0, Vec3d.ZERO, 0)); + list.add(new EntitySpawnS2CPacket(id, UUID.randomUUID(), pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0, EntityType.FIREWORK_ROCKET, 0, Vec3d.ZERO, 0)); { var stack = new ItemStack(Items.FIREWORK_ROCKET); - stack.getOrCreateNbt().put(FireworkRocketItem.FIREWORKS_KEY, TransportEffects.makeTransportFirework(color)); + stack.set(DataComponentTypes.FIREWORKS, new FireworksComponent(0, List.of(TransportEffects.makeTransportFirework(color)))); list.add(new EntityTrackerUpdateS2CPacket(id, List.of(DataTracker.SerializedEntry.of(FireworkRocketEntityAccessor.getITEM(), stack)))); } { var x = PolymerCommonUtils.createUnsafe(EntityStatusS2CPacket.class); - ((EntityStatusS2CPacketAccessor) x).setId(id); + ((EntityStatusS2CPacketAccessor) x).setEntityId(id); ((EntityStatusS2CPacketAccessor) x).setStatus(EntityStatuses.EXPLODE_FIREWORK_CLIENT); list.add(x); } @@ -298,13 +293,13 @@ public void sendExplosionPacketS2C(boolean skipOurselves, BlockPos pos, int colo var b = new BundleS2CPacket(list); - for (var player : this.player.getWorld().getPlayers()) { + for (var player : getWorld().getPlayers()) { if (skipOurselves && player == this.player) { continue; } - if (player instanceof ServerPlayerEntity serverPlayer && this.player.getPos().isInRange(player.getPos(), 32.0)) { - serverPlayer.networkHandler.sendPacket(b); + if (player instanceof ServerPlayerEntity spe && this.player.getPos().isInRange(player.getPos(), 32.0)) { + spe.networkHandler.sendPacket(b); } } } diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/ResourcePackManagerMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/ResourcePackManagerMixin.java index ee1561d..a176030 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/ResourcePackManagerMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/ResourcePackManagerMixin.java @@ -1,7 +1,10 @@ package eu.pb4.ansharpatch.mixin; import eu.pb4.ansharpatch.pack.LangPackProvider; -import net.minecraft.resource.*; +import net.minecraft.resource.FileResourcePackProvider; +import net.minecraft.resource.ResourcePackManager; +import net.minecraft.resource.ResourcePackProvider; +import net.minecraft.resource.ResourcePackSource; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -11,16 +14,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.LinkedHashSet; -import java.util.Map; import java.util.Set; @Mixin(ResourcePackManager.class) public abstract class ResourcePackManagerMixin { - - @Shadow - @Final - @Mutable - public Set providers; + @Shadow @Final @Mutable private Set providers; @Inject(method = "", at = @At("RETURN")) public void injectCustom(ResourcePackProvider[] resourcePackProviders, CallbackInfo info) { diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/ServerPlayerEntityMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/ServerPlayerEntityMixin.java index f194594..bee961a 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/ServerPlayerEntityMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/ServerPlayerEntityMixin.java @@ -1,37 +1,16 @@ package eu.pb4.ansharpatch.mixin; import com.lgmrszd.anshar.transport.PlayerTransportComponent; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.mojang.authlib.GameProfile; -import net.minecraft.entity.player.PlayerEntity; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin extends PlayerEntity { - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile) { - super(world, pos, yaw, gameProfile); - } - - @Inject(method = "updateInput", at = @At("TAIL")) - private void orIsInNetwork(float sidewaysSpeed, float forwardSpeed, boolean jumping, boolean sneaking, CallbackInfo ci) { - if (PlayerTransportComponent.KEY.get(this).isInNetwork()) { - if (sidewaysSpeed >= -1.0F && sidewaysSpeed <= 1.0F) { - this.sidewaysSpeed = sidewaysSpeed; - } - - if (forwardSpeed >= -1.0F && forwardSpeed <= 1.0F) { - this.forwardSpeed = forwardSpeed; - } - - this.jumping = jumping; - this.setSneaking(sneaking); - }; +public abstract class ServerPlayerEntityMixin { + @WrapOperation(method = "updateInput", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;hasVehicle()Z")) + private boolean orIsInNetwork(ServerPlayerEntity instance, Operation original) { + return original.call(instance) || PlayerTransportComponent.KEY.get(instance).isInNetwork(); } } diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/ServerWorldMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/ServerWorldMixin.java new file mode 100644 index 0000000..db15b04 --- /dev/null +++ b/src/main/java/eu/pb4/ansharpatch/mixin/ServerWorldMixin.java @@ -0,0 +1,19 @@ +package eu.pb4.ansharpatch.mixin; + +import net.minecraft.server.world.ServerWorld; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(ServerWorld.class) +public class ServerWorldMixin { +// @Shadow @Final List players; +// +// @Redirect(method = "tickWeather", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/PlayerManager;sendToAll(Lnet/minecraft/network/packet/Packet;)V", ordinal = 1)) +// private void cancelRainPacket(PlayerManager instance, Packet packet) { +// for (ServerPlayerEntity serverPlayerEntity : this.players) { +// if (PlayerTransportComponent.KEY.get(serverPlayerEntity).isInNetwork()) { +// return; +// } +// serverPlayerEntity.networkHandler.sendPacket(packet); +// } +// } +} diff --git a/src/main/java/eu/pb4/ansharpatch/mixin/TransportEffectsMixin.java b/src/main/java/eu/pb4/ansharpatch/mixin/TransportEffectsMixin.java index 100fae6..fa2b032 100644 --- a/src/main/java/eu/pb4/ansharpatch/mixin/TransportEffectsMixin.java +++ b/src/main/java/eu/pb4/ansharpatch/mixin/TransportEffectsMixin.java @@ -1,16 +1,16 @@ package eu.pb4.ansharpatch.mixin; import com.lgmrszd.anshar.transport.TransportEffects; -import net.minecraft.particle.DefaultParticleType; import net.minecraft.particle.ParticleTypes; +import net.minecraft.particle.SimpleParticleType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(TransportEffects.class) public class TransportEffectsMixin { - @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/api/particle/v1/FabricParticleTypes;simple(Z)Lnet/minecraft/particle/DefaultParticleType;")) - private static DefaultParticleType replaceParticle(boolean alwaysSpawn) { + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/fabricmc/fabric/api/particle/v1/FabricParticleTypes;simple(Z)Lnet/minecraft/particle/SimpleParticleType;")) + private static SimpleParticleType replaceParticle(boolean alwaysSpawn) { return ParticleTypes.FIREWORK; } } diff --git a/src/main/java/eu/pb4/ansharpatch/pack/LangPackProvider.java b/src/main/java/eu/pb4/ansharpatch/pack/LangPackProvider.java index 3f02c6d..7b6137e 100644 --- a/src/main/java/eu/pb4/ansharpatch/pack/LangPackProvider.java +++ b/src/main/java/eu/pb4/ansharpatch/pack/LangPackProvider.java @@ -2,12 +2,14 @@ import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; +import net.minecraft.SharedConstants; import net.minecraft.resource.*; -import net.minecraft.resource.featuretoggle.FeatureSet; +import net.minecraft.resource.metadata.PackResourceMetadata; +import net.minecraft.resource.metadata.ResourceMetadataMap; import net.minecraft.resource.metadata.ResourceMetadataReader; import net.minecraft.text.Text; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.InputStream; @@ -16,7 +18,7 @@ import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.Consumer; @@ -25,19 +27,26 @@ public record LangPackProvider(ModContainer mod) implements ResourcePackProvider @Override public void register(Consumer profileAdder) { - profileAdder.accept(ResourcePackProfile.of("$anshar-lang", Text.literal("Anshar Polymer Patch"), - true, this, - new ResourcePackProfile.Metadata(Text.literal("Lang Files"), ResourcePackCompatibility.COMPATIBLE, FeatureSet.empty(), List.of()), - ResourcePackProfile.InsertionPosition.BOTTOM, false, ResourcePackSource.BUILTIN - )); + profileAdder.accept( + ResourcePackProfile.create( + getInfo(), + this, + ResourceType.SERVER_DATA, + new ResourcePackPosition(true, ResourcePackProfile.InsertionPosition.BOTTOM, false) + ) + ); } @Override - public ResourcePack open(String name) { + public ResourcePack open(ResourcePackInfo info) { return this; } - @Nullable + @Override + public ResourcePack openWithOverlays(ResourcePackInfo info, ResourcePackProfile.Metadata metadata) { + return open(info); + } + @Override public InputSupplier openRoot(String... segments) { var path = mod.findPath(String.join("/", segments)); @@ -45,7 +54,6 @@ public InputSupplier openRoot(String... segments) { return path.map(InputSupplier::create).orElse(null); } - @Nullable @Override public InputSupplier open(ResourceType type, Identifier id) { var path = mod.findPath("assets/" + id.getNamespace() + "/" + id.getPath()); @@ -55,19 +63,20 @@ public InputSupplier open(ResourceType type, Identifier id) { @Override public void findResources(ResourceType type, String namespace, String prefix, ResultConsumer consumer) { - var path = mod.findPath("assets/" + namespace + "/" + prefix); + var optional = mod.findPath("assets/" + namespace + "/" + prefix); - if (path.isEmpty()) { + if (optional.isEmpty()) { return; } try { - String separator = path.get().getFileSystem().getSeparator(); - Files.walkFileTree(path.get(), new SimpleFileVisitor<>() { + String separator = optional.get().getFileSystem().getSeparator(); + Files.walkFileTree(optional.get(), new SimpleFileVisitor<>() { @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - String filename = path.get().relativize(file).toString().replace(separator, "/"); - Identifier identifier = Identifier.of(namespace, prefix + "/" + filename); + @NotNull + public FileVisitResult visitFile(Path file, @NotNull BasicFileAttributes attrs) throws IOException { + String filename = optional.get().relativize(file).toString().replace(separator, "/"); + Identifier identifier = Identifier.tryParse(namespace, prefix + "/" + filename); if (identifier != null) { consumer.accept(identifier, InputSupplier.create(file)); @@ -77,7 +86,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO } }); } catch (IOException ignored) { - // + // NO-OP } } @@ -86,25 +95,23 @@ public Set getNamespaces(ResourceType type) { return Set.of("anshar"); } - @Nullable @Override - public T parseMetadata(ResourceMetadataReader metaReader) throws IOException { - return null; + public T parseMetadata(ResourceMetadataReader metaReader) { + return ResourceMetadataMap.of(PackResourceMetadata.SERIALIZER, new PackResourceMetadata(Text.literal("Anshar Polymer Patch"), SharedConstants.getGameVersion().getResourceVersion(ResourceType.SERVER_DATA), Optional.empty())).get(metaReader); } @Override - public String getName() { - return "$anshar-lang"; + public ResourcePackInfo getInfo() { + return new ResourcePackInfo( + "anshar-polymer-patch", + Text.literal("Anshar Polymer Patch"), + ResourcePackSource.BUILTIN, + Optional.empty() + ); } @Override public void close() { } - - - @Override - public ResourcePack openWithOverlays(String name, ResourcePackProfile.Metadata metadata) { - return open(name); - } } diff --git a/src/main/resources/anshar-polymer-patch.mixins.json b/src/main/resources/anshar-polymer-patch.mixins.json index 0ce981f..2143568 100644 --- a/src/main/resources/anshar-polymer-patch.mixins.json +++ b/src/main/resources/anshar-polymer-patch.mixins.json @@ -1,16 +1,18 @@ { "required": true, "package": "eu.pb4.ansharpatch.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "mixins": [ "DisableComponentSyncMixin", "EntityStatusS2CPacketAccessor", "FileResourcePackProviderAccessor", "FireworkRocketEntityAccessor", "ModRegistriationMixin", + "PlayerManagerMixin", "PlayerTransportComponentMixin", "ResourcePackManagerMixin", "ServerPlayerEntityMixin", + "ServerWorldMixin", "TransportEffectsMixin" ], "injectors": { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0566e03..a2a27be 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -7,11 +7,14 @@ "authors": [ "Patbox" ], + "contibutors": [ + "unilock" + ], "contact": { - "homepage": "https://pb4.eu", + "homepage": "https://pb4.eu/", "sources": "https://github.com/PolymerPorts/anshar-patch" }, - "license": "LGPLv3", + "license": "LGPL-3.0-only", "icon": "assets/anshar-polymer-patch/icon.png", "environment": "*", "entrypoints": { @@ -24,9 +27,8 @@ ], "depends": { "fabricloader": ">=0.15.0", - "anshar": ">=0.0.15", - "minecraft": "~1.20.4", - "java": ">=17", + "minecraft": "~1.21", + "anshar": ">=1.0.0", "fabric-api": "*" } } \ No newline at end of file