diff --git a/.gitignore b/.gitignore index 778a722..461017f 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ build # other eclipse run +runs diff --git a/Common/build.gradle b/Common/build.gradle index 38504b9..dcf0558 100644 --- a/Common/build.gradle +++ b/Common/build.gradle @@ -1,23 +1,19 @@ plugins { + id 'idea' id 'java' - id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' id 'maven-publish' + id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' } -archivesBaseName = "${mod_id}-common-${minecraft_version}" + +base { + archivesName = "${mod_id}-common-${minecraft_version}" +} minecraft { version(minecraft_version) - runs { - if (project.hasProperty('common_runs_enabled') ? project.findProperty('common_runs_enabled').toBoolean() : true) { - - server(project.hasProperty('common_server_run_name') ? project.findProperty('common_server_run_name') : 'vanilla_server') { - workingDirectory(this.file("run")) - } - client(project.hasProperty('common_client_run_name') ? project.findProperty('common_client_run_name') : 'vanilla_client') { - workingDirectory(this.file("run")) - } - } + if(file("src/main/resources/${mod_id}.accesswidener").exists()){ + accessWideners(file("src/main/resources/${mod_id}.accesswidener")) } } @@ -26,10 +22,10 @@ repositories { } dependencies { - compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' - implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' - implementation("com.github.llamalad7.mixinextras:mixinextras-common:${mixinextras_version}") - annotationProcessor("com.github.llamalad7.mixinextras:mixinextras-common:${mixinextras_version}") + compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' + implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' + implementation("io.github.llamalad7:mixinextras-common:${mixinextras_version}") + annotationProcessor("io.github.llamalad7:mixinextras-common:${mixinextras_version}") } processResources { @@ -46,7 +42,7 @@ publishing { publications { mavenJava(MavenPublication) { groupId project.group - artifactId project.archivesBaseName + artifactId base.archivesName .get() version project.version from components.java } diff --git a/Common/src/main/java/tschipp/carryon/CarryOnCommon.java b/Common/src/main/java/tschipp/carryon/CarryOnCommon.java index 5f911f4..710795e 100644 --- a/Common/src/main/java/tschipp/carryon/CarryOnCommon.java +++ b/Common/src/main/java/tschipp/carryon/CarryOnCommon.java @@ -22,36 +22,39 @@ import tschipp.carryon.platform.Services; public class CarryOnCommon { - public static void registerServerPackets() + public static void registerServerPackets(Object... args) { Services.PLATFORM.registerServerboundPacket( Constants.PACKET_ID_KEY_PRESSED, 0, ServerboundCarryKeyPressedPacket.class, - ServerboundCarryKeyPressedPacket::toBytes, + ServerboundCarryKeyPressedPacket::write, ServerboundCarryKeyPressedPacket::new, - ServerboundCarryKeyPressedPacket::handle + ServerboundCarryKeyPressedPacket::handle, + args ); } - public static void registerClientPackets() + public static void registerClientPackets(Object... args) { Services.PLATFORM.registerClientboundPacket( Constants.PACKET_ID_START_RIDING, 1, ClientboundStartRidingPacket.class, - ClientboundStartRidingPacket::toBytes, + ClientboundStartRidingPacket::write, ClientboundStartRidingPacket::new, - ClientboundStartRidingPacket::handle + ClientboundStartRidingPacket::handle, + args ); Services.PLATFORM.registerClientboundPacket( Constants.PACKET_ID_SYNC_SCRIPTS, 2, ClientboundSyncScriptsPacket.class, - ClientboundSyncScriptsPacket::toBytes, + ClientboundSyncScriptsPacket::write, ClientboundSyncScriptsPacket::new, - ClientboundSyncScriptsPacket::handle + ClientboundSyncScriptsPacket::handle, + args ); } diff --git a/Common/src/main/java/tschipp/carryon/common/config/CarryConfig.java b/Common/src/main/java/tschipp/carryon/common/config/CarryConfig.java index 8cd5ce0..5e281b7 100644 --- a/Common/src/main/java/tschipp/carryon/common/config/CarryConfig.java +++ b/Common/src/main/java/tschipp/carryon/common/config/CarryConfig.java @@ -221,7 +221,7 @@ public class CarryConfig description = "Blocks that cannot be picked up" ) public String[] forbiddenTiles = { - "#forge:immovable", "#forge:relocation_not_supported", "minecraft:end_portal", "minecraft:piston_head", + "#forge:immovable", "#forge:relocation_not_supported", "#neoforge:immovable", "#neoforge:relocation_not_supported", "minecraft:end_portal", "minecraft:piston_head", "minecraft:end_gateway", "minecraft:tall_grass", "minecraft:large_fern", "minecraft:peony", "minecraft:rose_bush", "minecraft:lilac", "minecraft:sunflower", "minecraft:*_bed", "minecraft:*_door", "minecraft:big_dripleaf_stem", "minecraft:waterlily", "minecraft:cake", diff --git a/Common/src/main/java/tschipp/carryon/common/scripting/Matchables.java b/Common/src/main/java/tschipp/carryon/common/scripting/Matchables.java index b2a7f94..63a4f29 100644 --- a/Common/src/main/java/tschipp/carryon/common/scripting/Matchables.java +++ b/Common/src/main/java/tschipp/carryon/common/scripting/Matchables.java @@ -1,7 +1,9 @@ package tschipp.carryon.common.scripting; import com.mojang.serialization.Codec; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; @@ -106,7 +108,7 @@ public final class Matchables public boolean matches(ServerPlayer player) { ServerAdvancementManager manager = player.server.getAdvancements(); - Advancement adv = manager.getAdvancement(new ResourceLocation(advancement.isEmpty() ? "" : advancement)); + AdvancementHolder adv = manager.get(new ResourceLocation(advancement.isEmpty() ? "" : advancement)); boolean achievement = adv == null ? true : player.getAdvancements().getOrStartProgress(adv).isDone(); return achievement; @@ -160,19 +162,10 @@ public final class Matchables numb = cond.substring(iL); scorename = cond.replace(numb, ""); - Map o = score.getPlayerScores(player.getGameProfile().getName()); - if (o != null) - { - Score sc = o.get(score.getObjective(scorename)); - if (sc != null) - { - int points = sc.getScore(); + Object2IntMap scores = score.listPlayerScores(player); + int scoreVal = scores.getInt(score.getObjective(scorename)); - return new NumberBoundCondition(numb).matches(points); - } - } - - return false; + return new NumberBoundCondition(numb).matches(scoreVal); } } diff --git a/Common/src/main/java/tschipp/carryon/networking/PacketBase.java b/Common/src/main/java/tschipp/carryon/networking/PacketBase.java index 115f8cf..e5c0e19 100644 --- a/Common/src/main/java/tschipp/carryon/networking/PacketBase.java +++ b/Common/src/main/java/tschipp/carryon/networking/PacketBase.java @@ -1,11 +1,14 @@ package tschipp.carryon.networking; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -public abstract class PacketBase +public interface PacketBase { - public abstract void toBytes(FriendlyByteBuf buf); + void write(FriendlyByteBuf buf); - public abstract void handle(Player player); + void handle(Player player); + + ResourceLocation id(); } diff --git a/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundStartRidingPacket.java b/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundStartRidingPacket.java index 604ff2c..02389ca 100644 --- a/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundStartRidingPacket.java +++ b/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundStartRidingPacket.java @@ -1,42 +1,39 @@ package tschipp.carryon.networking.clientbound; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import tschipp.carryon.Constants; import tschipp.carryon.networking.PacketBase; -public class ClientboundStartRidingPacket extends PacketBase +public record ClientboundStartRidingPacket(int iden, boolean ride) implements PacketBase { - int entityId; - boolean ride; - public ClientboundStartRidingPacket(FriendlyByteBuf buf) { - this.entityId = buf.readInt(); - this.ride = buf.readBoolean(); - } - - public ClientboundStartRidingPacket(int id, boolean ride) - { - this.entityId = id; - this.ride = ride; + this(buf.readInt(), buf.readBoolean()); } @Override - public void toBytes(FriendlyByteBuf buf) + public void write(FriendlyByteBuf buf) { - buf.writeInt(entityId); + buf.writeInt(iden); buf.writeBoolean(ride); } @Override public void handle(Player player) { - Entity otherPlayer = player.level().getEntity(this.entityId); + Entity otherPlayer = player.level().getEntity(this.iden); if(otherPlayer != null) if(ride) otherPlayer.startRiding(player); else otherPlayer.stopRiding(); } + + @Override + public ResourceLocation id() { + return Constants.PACKET_ID_START_RIDING; + } } diff --git a/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundSyncScriptsPacket.java b/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundSyncScriptsPacket.java index 6a44e02..b9fa837 100644 --- a/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundSyncScriptsPacket.java +++ b/Common/src/main/java/tschipp/carryon/networking/clientbound/ClientboundSyncScriptsPacket.java @@ -6,29 +6,24 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; +import tschipp.carryon.Constants; import tschipp.carryon.common.scripting.CarryOnScript; import tschipp.carryon.common.scripting.ScriptManager; import tschipp.carryon.networking.PacketBase; import java.util.List; -public class ClientboundSyncScriptsPacket extends PacketBase +public record ClientboundSyncScriptsPacket(Tag serialized) implements PacketBase { - private Tag serialized; - public ClientboundSyncScriptsPacket(FriendlyByteBuf buf) { - this.serialized = buf.readNbt().get("data"); - } - - public ClientboundSyncScriptsPacket(Tag serialized) - { - this.serialized = serialized; + this(buf.readNbt().get("data")); } @Override - public void toBytes(FriendlyByteBuf buf) + public void write(FriendlyByteBuf buf) { CompoundTag tag = new CompoundTag(); tag.put("data", serialized); @@ -43,4 +38,9 @@ public class ClientboundSyncScriptsPacket extends PacketBase ScriptManager.SCRIPTS.clear(); ScriptManager.SCRIPTS.addAll(scripts); } + + @Override + public ResourceLocation id() { + return Constants.PACKET_ID_SYNC_SCRIPTS; + } } diff --git a/Common/src/main/java/tschipp/carryon/networking/serverbound/ServerboundCarryKeyPressedPacket.java b/Common/src/main/java/tschipp/carryon/networking/serverbound/ServerboundCarryKeyPressedPacket.java index 9ba406e..0904282 100644 --- a/Common/src/main/java/tschipp/carryon/networking/serverbound/ServerboundCarryKeyPressedPacket.java +++ b/Common/src/main/java/tschipp/carryon/networking/serverbound/ServerboundCarryKeyPressedPacket.java @@ -1,28 +1,23 @@ package tschipp.carryon.networking.serverbound; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import tschipp.carryon.Constants; import tschipp.carryon.common.carry.CarryOnData; import tschipp.carryon.common.carry.CarryOnDataManager; import tschipp.carryon.networking.PacketBase; -public class ServerboundCarryKeyPressedPacket extends PacketBase +public record ServerboundCarryKeyPressedPacket(boolean pressed) implements PacketBase { - boolean pressed; - public ServerboundCarryKeyPressedPacket(FriendlyByteBuf buf) { - this.pressed = buf.readBoolean(); - } - - public ServerboundCarryKeyPressedPacket(boolean pressed) - { - this.pressed = pressed; + this(buf.readBoolean()); } @Override - public void toBytes(FriendlyByteBuf buf) + public void write(FriendlyByteBuf buf) { buf.writeBoolean(pressed); } @@ -34,4 +29,9 @@ public class ServerboundCarryKeyPressedPacket extends PacketBase carry.setKeyPressed(this.pressed); CarryOnDataManager.setCarryData(player, carry); } + + @Override + public ResourceLocation id() { + return Constants.PACKET_ID_KEY_PRESSED; + } } diff --git a/Common/src/main/java/tschipp/carryon/platform/services/IPlatformHelper.java b/Common/src/main/java/tschipp/carryon/platform/services/IPlatformHelper.java index e8b4fa4..544920d 100644 --- a/Common/src/main/java/tschipp/carryon/platform/services/IPlatformHelper.java +++ b/Common/src/main/java/tschipp/carryon/platform/services/IPlatformHelper.java @@ -36,9 +36,9 @@ public interface IPlatformHelper { void registerConfig(BuiltConfig cfg); - void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler); + void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args); - void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler); + void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args); void sendPacketToServer(ResourceLocation id, PacketBase packet); diff --git a/Fabric/build.gradle b/Fabric/build.gradle index fc39f3d..1517b6f 100644 --- a/Fabric/build.gradle +++ b/Fabric/build.gradle @@ -1,21 +1,26 @@ plugins { - id 'fabric-loom' version '1.0-SNAPSHOT' + id 'java' id 'maven-publish' id 'idea' + id 'fabric-loom' version '1.5-SNAPSHOT' +} +base { + archivesName = "${mod_id}-fabric-${minecraft_version}" } -archivesBaseName = "${mod_id}-fabric-${minecraft_version}" - +/* apply from: 'https://raw.githubusercontent.com/MinecraftModDevelopment/Gradle-Collection/22e7d543a18cd30675277fbfa3669e3d9e206010/generic/secrets.gradle' if (project.hasProperty('secretFile')) { loadSecrets(new File((String) findProperty('secretFile'))) } +*/ + if (System.getenv('BUILD_NUMBER') != null) { version += "." + System.getenv('BUILD_NUMBER') } + repositories { - maven { url 'https://jitpack.io' } maven { url "https://maven.siphalor.de/" name "Siphalor's Maven" @@ -33,13 +38,17 @@ dependencies { modImplementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.1' implementation project(":Common") - include implementation("com.github.llamalad7.mixinextras:mixinextras-fabric:${mixinextras_version}") - annotationProcessor("com.github.llamalad7.mixinextras:mixinextras-fabric:${mixinextras_version}") - modRuntimeOnly "de.siphalor:amecsapi-1.20:1.5.0+mc1.20-pre1" + modRuntimeOnly "de.siphalor:amecsapi-1.20:1.5.6+mc1.20.2" } loom { + if (project(":Common").file("src/main/resources/${mod_id}.accesswidener").exists()) { + accessWidenerPath.set(project(":Common").file("src/main/resources/${mod_id}.accesswidener")) + } + mixin { + defaultRefmapName.set("${mod_id}.refmap.json") + } runs { client { client() @@ -56,37 +65,27 @@ loom { } } - -var refmap_target = archivesBaseName + "-" +tasks.withType(JavaCompile).configureEach { + source(project(":Common").sourceSets.main.allSource) +} +tasks.withType(Javadoc).configureEach { + source(project(":Common").sourceSets.main.allJava) +} +tasks.named("sourcesJar", Jar) { + from(project(":Common").sourceSets.main.allSource) +} processResources { from project(":Common").sourceSets.main.resources - inputs.property "version", project.version - inputs.property "refmap_target", refmap_target - - filesMatching("fabric.mod.json") { - expand "version": project.version - } - - filesMatching("carryon.mixins.json") { - expand "refmap_target": refmap_target - } -} - -tasks.withType(JavaCompile) { - source(project(":Common").sourceSets.main.allSource) } publishing { publications { mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version + artifactId base.archivesName.get() from components.java } } - repositories { maven { url "file://" + System.getenv("local_maven") diff --git a/Fabric/src/main/java/tschipp/carryon/CarryOnFabricClientMod.java b/Fabric/src/main/java/tschipp/carryon/CarryOnFabricClientMod.java index b3295c1..da6a7f4 100644 --- a/Fabric/src/main/java/tschipp/carryon/CarryOnFabricClientMod.java +++ b/Fabric/src/main/java/tschipp/carryon/CarryOnFabricClientMod.java @@ -27,7 +27,7 @@ public class CarryOnFabricClientMod implements ClientModInitializer public static void sendPacketToServer(ResourceLocation id, PacketBase packet) { FriendlyByteBuf buf = PacketByteBufs.create(); - packet.toBytes(buf); + packet.write(buf); ClientPlayNetworking.send(id, buf); } diff --git a/Fabric/src/main/java/tschipp/carryon/platform/FabricPlatformHelper.java b/Fabric/src/main/java/tschipp/carryon/platform/FabricPlatformHelper.java index 4081884..a8a8a6a 100644 --- a/Fabric/src/main/java/tschipp/carryon/platform/FabricPlatformHelper.java +++ b/Fabric/src/main/java/tschipp/carryon/platform/FabricPlatformHelper.java @@ -41,7 +41,7 @@ public class FabricPlatformHelper implements IPlatformHelper { } @Override - public void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler) + public void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { ServerPlayNetworking.registerGlobalReceiver(id, (server, player, packetHandler, buf, responseSender) -> { T packet = reader.apply(buf); @@ -52,7 +52,7 @@ public class FabricPlatformHelper implements IPlatformHelper { } @Override - public void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler) + public void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { CarryOnFabricClientMod.registerClientboundPacket(id, reader, handler); } @@ -67,7 +67,7 @@ public class FabricPlatformHelper implements IPlatformHelper { public void sendPacketToPlayer(ResourceLocation id, PacketBase packet, ServerPlayer player) { FriendlyByteBuf buf = PacketByteBufs.create(); - packet.toBytes(buf); + packet.write(buf); ServerPlayNetworking.send(player, id, buf); } } diff --git a/Fabric/src/main/resources/fabric.mod.json b/Fabric/src/main/resources/fabric.mod.json index c20b3e0..c9e2bed 100644 --- a/Fabric/src/main/resources/fabric.mod.json +++ b/Fabric/src/main/resources/fabric.mod.json @@ -1,11 +1,11 @@ { "schemaVersion": 1, - "id": "carryon", + "id": "${mod_id}", "version": "${version}", - "name": "Carry On", - "description": "Carry On is a simple mod that improves game interaction by allowing players to pick up, carry, and place single block Tile Entities using only their empty hands.", + "name": "${mod_name}", + "description": "${description}", "authors": [ - "Tschipp", "Purplicious_Cow", "cy4n" + "Tschipp", "Purplicious_Cow" ], "contact": { "homepage": "https://tschipp.ch/", @@ -13,7 +13,7 @@ "issues": "https://github.com/Tschipp/CarryOn/issues" }, - "license": "GNU LGPLv3", + "license": "${license}", "icon": "logo.png", "environment": "*", @@ -31,9 +31,9 @@ ], "depends": { - "fabricloader": ">=0.14", + "fabricloader": ">=${fabric_loader_version}", "fabric-api": "*", - "minecraft": ">=1.20", + "minecraft": "${minecraft_version}", "java": ">=17" } } diff --git a/Forge/build.gradle b/Forge/build.gradle index cac2b66..a0974b0 100644 --- a/Forge/build.gradle +++ b/Forge/build.gradle @@ -1,38 +1,29 @@ -buildscript { - repositories { - maven { url = 'https://maven.minecraftforge.net' } - maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } - maven { url = 'https://maven.parchmentmc.org' } - mavenCentral() - gradlePluginPortal() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - classpath 'org.parchmentmc:librarian:1.+' - classpath 'gradle.plugin.com.github.johnrengelman:shadow:7.1.2' - } +plugins { + id 'idea' + id 'java' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' + id 'org.spongepowered.mixin' version '0.7-SNAPSHOT' + id 'org.parchmentmc.librarian.forgegradle' version '1.+' } -apply plugin: 'java' -apply plugin: 'net.minecraftforge.gradle' -apply plugin: 'eclipse' -apply plugin: 'org.spongepowered.mixin' -apply plugin: 'maven-publish' -apply plugin: 'org.parchmentmc.librarian.forgegradle' -apply plugin: 'com.github.johnrengelman.shadow' +/* apply from: 'https://raw.githubusercontent.com/MinecraftModDevelopment/Gradle-Collection/22e7d543a18cd30675277fbfa3669e3d9e206010/generic/secrets.gradle' if (project.hasProperty('secretFile')) { loadSecrets(new File((String) findProperty('secretFile'))) } + + */ if (System.getenv('BUILD_NUMBER') != null) { version += "." + System.getenv('BUILD_NUMBER') } -jarJar.enable() -archivesBaseName = "${mod_id}-forge-${minecraft_version}" + +base { + archivesName = "${mod_id}-forge-${minecraft_version}" +} mixin { add sourceSets.main, "${mod_id}.refmap.json" @@ -43,12 +34,10 @@ mixin { minecraft { mappings channel: 'parchment', version: "${parchment_mappings}" - - if (project.hasProperty('forge_ats_enabled') && project.findProperty('forge_ats_enabled').toBoolean()) { - // This location is hardcoded in Forge and can not be changed. - // https://github.com/MinecraftForge/MinecraftForge/blob/be1698bb1554f9c8fa2f58e32b9ab70bc4385e60/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/ModFile.java#L123 + copyIdeResources = true + + if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') - project.logger.debug('Forge Access Transformers are enabled for this project.') } runs { @@ -58,7 +47,7 @@ minecraft { taskName 'Client' property 'mixin.env.remapRefMap', 'true' property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + //args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" mods { modClientRun { source sourceSets.main @@ -73,7 +62,7 @@ minecraft { taskName 'Server' property 'mixin.env.remapRefMap', 'true' property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + //args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" mods { modServerRun { source sourceSets.main @@ -89,7 +78,7 @@ minecraft { taskName 'Data' property 'mixin.env.remapRefMap', 'true' property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" - args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" + //args "-mixin.config=${mod_id}.mixins.json", "-mixin.config=${mod_id}.forge.mixins.json" mods { modDataRun { source sourceSets.main @@ -103,9 +92,6 @@ minecraft { sourceSets.main.resources.srcDir 'src/generated/resources' repositories { - maven { - url 'https://maven.blamejared.com' - } flatDir { dirs 'libs' } @@ -116,13 +102,13 @@ repositories { dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" compileOnly project(":Common") - implementation(annotationProcessor("com.github.llamalad7.mixinextras:mixinextras-common:${mixinextras_version}")) - implementation(jarJar("com.github.llamalad7.mixinextras:mixinextras-forge:${mixinextras_version}")) { + compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixinextras_version}")) + implementation(jarJar("io.github.llamalad7:mixinextras-forge:${mixinextras_version}")) { jarJar.ranged(it, "[${mixinextras_version},)") } //implementation fg.deobf("net.darkhax.gamestages:GameStages-Forge-1.19.2:11.0.2") //implementation fg.deobf("net.darkhax.bookshelf:Bookshelf-Forge-1.19.3:17.0.2") - annotationProcessor 'org.spongepowered:mixin:0.8.4-SNAPSHOT:processor' + annotationProcessor 'org.spongepowered:mixin:0.8.5-SNAPSHOT:processor' fileTree("libs").matching { include "*.jar" @@ -135,32 +121,28 @@ dependencies { } } -reobf { - jarJar {} -} - -tasks.withType(JavaCompile) { +tasks.withType(JavaCompile).configureEach { source(project(":Common").sourceSets.main.allSource) } +tasks.withType(Javadoc).configureEach { + source(project(":Common").sourceSets.main.allJava) +} +tasks.named("sourcesJar", Jar) { + from(project(":Common").sourceSets.main.allSource) +} processResources { from project(":Common").sourceSets.main.resources - - filesMatching('*.mixins.json') { - expand "refmap_target": "${mod_id}." - } } - jar.finalizedBy('reobfJar') publishing { publications { mavenJava(MavenPublication) { - groupId project.group - artifactId project.archivesBaseName - version project.version - artifact jar + artifactId base.archivesName.get() + from components.java + fg.component(it) } } repositories { @@ -169,3 +151,13 @@ publishing { } } } + +// Merge the resources and classes into the same directory. +// This is done because java expects modules to be in a single directory. +// And if we have it in multiple we have to do performance intensive hacks like having the UnionFileSystem +// This will eventually be migrated to ForgeGradle so modders don't need to manually do it. But that is later. +sourceSets.each { + def dir = layout.buildDirectory.dir("sourcesSets/$it.name") + it.output.resourcesDir = dir + it.java.destinationDirectory = dir +} \ No newline at end of file diff --git a/Forge/src/main/java/tschipp/carryon/CarryOnForge.java b/Forge/src/main/java/tschipp/carryon/CarryOnForge.java index dd4db19..46c7189 100644 --- a/Forge/src/main/java/tschipp/carryon/CarryOnForge.java +++ b/Forge/src/main/java/tschipp/carryon/CarryOnForge.java @@ -1,13 +1,12 @@ package tschipp.carryon; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; +import net.minecraftforge.network.ChannelBuilder; +import net.minecraftforge.network.SimpleChannel; import tschipp.carryon.config.forge.ConfigLoaderImpl; @Mod(Constants.MOD_ID) @@ -31,7 +30,7 @@ public class CarryOnForge { private void setup(final FMLCommonSetupEvent event) { - network = NetworkRegistry.newSimpleChannel(new ResourceLocation(Constants.MOD_ID, "carryonpackets"), () -> "1.0", "1.0"::equals, "1.0"::equals); + network = ChannelBuilder.named(new ResourceLocation(Constants.MOD_ID, "carryonpackets")).simpleChannel(); CarryOnCommon.registerServerPackets(); CarryOnCommon.registerClientPackets(); diff --git a/Forge/src/main/java/tschipp/carryon/platform/ForgePlatformHelper.java b/Forge/src/main/java/tschipp/carryon/platform/ForgePlatformHelper.java index 2c9b495..883d814 100644 --- a/Forge/src/main/java/tschipp/carryon/platform/ForgePlatformHelper.java +++ b/Forge/src/main/java/tschipp/carryon/platform/ForgePlatformHelper.java @@ -4,10 +4,10 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.event.network.CustomPayloadEvent; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.PacketDistributor; import tschipp.carryon.CarryOnCommonClient; import tschipp.carryon.CarryOnForge; @@ -16,10 +16,8 @@ import tschipp.carryon.config.forge.ConfigLoaderImpl; import tschipp.carryon.networking.PacketBase; import tschipp.carryon.platform.services.IPlatformHelper; -import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; -import java.util.function.Supplier; public class ForgePlatformHelper implements IPlatformHelper { @@ -47,47 +45,55 @@ public class ForgePlatformHelper implements IPlatformHelper { } @Override - public void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler) + public void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { - BiConsumer> serverHandler = (packet, ctx) -> { - if(ctx.get().getDirection().getReceptionSide().isServer()) + BiConsumer serverHandler = (packet, ctx) -> { + if(ctx.getDirection().getReceptionSide().isServer()) { - ctx.get().setPacketHandled(true); - ctx.get().enqueueWork(() -> { - handler.accept(packet, ctx.get().getSender()); + ctx.setPacketHandled(true); + ctx.enqueueWork(() -> { + handler.accept(packet, ctx.getSender()); }); } }; - CarryOnForge.network.registerMessage(numericalId, clazz, writer, reader, serverHandler, Optional.of(NetworkDirection.PLAY_TO_SERVER)); + CarryOnForge.network.messageBuilder(clazz, numericalId, NetworkDirection.PLAY_TO_SERVER) + .encoder(writer) + .decoder(reader) + .consumerMainThread(serverHandler) + .add(); } @Override - public void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler) + public void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { - BiConsumer> clientHandler = (packet, ctx) -> { - if(ctx.get().getDirection().getReceptionSide().isClient()) + BiConsumer clientHandler = (packet, ctx) -> { + if(ctx.getDirection().getReceptionSide().isClient()) { - ctx.get().setPacketHandled(true); - ctx.get().enqueueWork(() -> { + ctx.setPacketHandled(true); + ctx.enqueueWork(() -> { handler.accept(packet, CarryOnCommonClient.getPlayer()); }); } }; - CarryOnForge.network.registerMessage(numericalId, clazz, writer, reader, clientHandler, Optional.of(NetworkDirection.PLAY_TO_CLIENT)); + CarryOnForge.network.messageBuilder(clazz, numericalId, NetworkDirection.PLAY_TO_CLIENT) + .encoder(writer) + .decoder(reader) + .consumerMainThread(clientHandler) + .add(); } @Override public void sendPacketToServer(ResourceLocation id, PacketBase packet) { - CarryOnForge.network.sendToServer(packet); + CarryOnForge.network.send(packet, PacketDistributor.SERVER.noArg()); } @Override public void sendPacketToPlayer(ResourceLocation id, PacketBase packet, ServerPlayer player) { - CarryOnForge.network.send(PacketDistributor.PLAYER.with(() -> player), packet); + CarryOnForge.network.send(packet, PacketDistributor.PLAYER.with(player)); } } diff --git a/Forge/src/main/resources/META-INF/mods.toml b/Forge/src/main/resources/META-INF/mods.toml index a1b6e24..f800d57 100644 --- a/Forge/src/main/resources/META-INF/mods.toml +++ b/Forge/src/main/resources/META-INF/mods.toml @@ -1,33 +1,33 @@ modLoader="javafml" #mandatory -loaderVersion="[46,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. -license="GNU LGPLv3" +loaderVersion="${forge_loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. +license="${license}" issueTrackerURL="https://github.com/Tschipp/CarryOn/issues" [[mods]] #mandatory - modId="carryon" #mandatory - version="${file.jarVersion}" #mandatory - displayName="Carry On" #mandatory + modId="${mod_id}" #mandatory + version="${version}" #mandatory + displayName="${mod_name}" #mandatory displayURL="https://tschipp.ch" #optional logoFile="logo.png" #optional - authors="Tschipp, Purplicious_Cow, cy4n" #optional - description='''Carry On is a simple mod that improves game interaction by allowing players to pick up, carry, and place single block Tile Entities using only their empty hands.''' + authors="${mod_author}" #optional + description='''${description}''' -[[dependencies.carryon]] #optional +[[dependencies.${mod_id}]] #optional # the modid of the dependency modId="forge" #mandatory # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency - versionRange="[46,47.1.3],[47.1.43,)" #mandatory + versionRange="${forge_version_range}" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER side="BOTH" # Here's another dependency -[[dependencies.carryon]] +[[dependencies.${mod_id}]] modId="minecraft" mandatory=true - versionRange="[1.20,1.21)" + versionRange="${minecraft_version_range}" ordering="NONE" side="BOTH" diff --git a/NeoForge/build.gradle b/NeoForge/build.gradle new file mode 100644 index 0000000..9a1c02a --- /dev/null +++ b/NeoForge/build.gradle @@ -0,0 +1,106 @@ +plugins { + id 'idea' + id 'maven-publish' + id 'net.neoforged.gradle.userdev' version '7.0.81' + id 'java-library' +} + +if (System.getenv('BUILD_NUMBER') != null) { + version += "." + System.getenv('BUILD_NUMBER') +} + +base { + archivesName = "${mod_id}-neoforge-${minecraft_version}" +} + +//jarJar.enable() + +//archivesBaseName = "${mod_id}-neoforge-${minecraft_version}" + +/* +mixin { + add sourceSets.main, "${mod_id}.refmap.json" + + config "${mod_id}.mixins.json" + config "${mod_id}.forge.mixins.json" +} +*/ + +if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) { + minecraft.accessTransformers.file file('src/main/resources/META-INF/accesstransformer.cfg') +} + +runs { + // applies to all the run configs below + configureEach { + modSource project.sourceSets.main + } + + client { + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + } + + server { + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + programArgument '--nogui' + } + + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id + } + + data { + // example of overriding the workingDirectory set in configureEach above, uncomment if you want to use it + // workingDirectory project.file('run-data') + + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. + programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath() + } +} + +sourceSets.main.resources.srcDir 'src/generated/resources' + + +dependencies { + implementation "net.neoforged:neoforge:${neoforge_version}" + compileOnly project(":Common") + //implementation fg.deobf("net.darkhax.gamestages:GameStages-Forge-1.19.2:11.0.2") + //implementation fg.deobf("net.darkhax.bookshelf:Bookshelf-Forge-1.19.3:17.0.2") +} + +// NeoGradle compiles the game, but we don't want to add our common code to the game's code +Spec notNeoTask = { Task it -> !it.name.startsWith("neo") } as Spec + +tasks.withType(JavaCompile).matching(notNeoTask).configureEach { + source(project(":Common").sourceSets.main.allSource) +} + +tasks.withType(Javadoc).matching(notNeoTask).configureEach { + source(project(":Common").sourceSets.main.allJava) +} + +tasks.named("sourcesJar", Jar) { + from(project(":Common").sourceSets.main.allSource) +} + +tasks.withType(ProcessResources).matching(notNeoTask).configureEach { + from project(":Common").sourceSets.main.resources +} + +publishing { + publications { + mavenJava(MavenPublication) { + artifactId base.archivesName.get() + from components.java + } + } + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/CarryOnNeoForge.java b/NeoForge/src/main/java/tschipp/carryon/CarryOnNeoForge.java new file mode 100644 index 0000000..ad1548b --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/CarryOnNeoForge.java @@ -0,0 +1,41 @@ +package tschipp.carryon; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; +import tschipp.carryon.config.neoforge.ConfigLoaderImpl; + +@Mod(Constants.MOD_ID) +public class CarryOnNeoForge { + + public CarryOnNeoForge(IEventBus bus) { + + // This method is invoked by the Forge mod loader when it is ready + // to load your mod. You can access Forge and Common code in this + // project. + // Use Forge to bootstrap the Common mod. + CarryOnCommon.registerConfig(); + bus.addListener(this::setup); + bus.addListener(this::registerPackets); + + ConfigLoaderImpl.initialize(); + } + + private void setup(final FMLCommonSetupEvent event) + { + } + + public void registerPackets(final RegisterPayloadHandlerEvent event) { + + final IPayloadRegistrar registrar = event.registrar(Constants.MOD_ID) + .versioned("1.0.0"); + + CarryOnCommon.registerServerPackets(registrar); + CarryOnCommon.registerClientPackets(registrar); + } + +} \ No newline at end of file diff --git a/NeoForge/src/main/java/tschipp/carryon/compat/GamestageCompat.java b/NeoForge/src/main/java/tschipp/carryon/compat/GamestageCompat.java new file mode 100644 index 0000000..74f8291 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/compat/GamestageCompat.java @@ -0,0 +1,34 @@ +package tschipp.carryon.compat; + +import net.minecraft.world.entity.player.Player; +import tschipp.carryon.Constants; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + + +public class GamestageCompat +{ + private static Method hasStage; + + static { + try { + Class gamestageHelper = Class.forName("net.darkhax.gamestages.GameStageHelper"); + hasStage = gamestageHelper.getMethod("hasStage", Player.class, String.class); + + } catch (Exception e) { + Constants.LOG.info("Gamestages not found. Disabling."); + } + } + + public static boolean hasStage(Player player, String stage) + { + if(hasStage == null) + return true; + try { + return (boolean) hasStage.invoke(null, player, stage); + } catch (IllegalAccessException | InvocationTargetException e) { + } + return true; + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/config/neoforge/ConfigLoaderImpl.java b/NeoForge/src/main/java/tschipp/carryon/config/neoforge/ConfigLoaderImpl.java new file mode 100644 index 0000000..797f8db --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/config/neoforge/ConfigLoaderImpl.java @@ -0,0 +1,108 @@ +package tschipp.carryon.config.neoforge; + +import com.electronwill.nightconfig.core.AbstractConfig; +import com.electronwill.nightconfig.core.UnmodifiableConfig; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.IConfigSpec; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.event.config.ModConfigEvent; +import net.neoforged.neoforge.common.ModConfigSpec; +import net.neoforged.neoforge.common.NeoForge; +import tschipp.carryon.Constants; +import tschipp.carryon.config.*; + +import java.util.*; + +@Mod.EventBusSubscriber(modid = Constants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class ConfigLoaderImpl { + + public static final Map CONFIGS = new HashMap<>(); + + public static void initialize() { + + ConfigLoaderImpl.CONFIGS.forEach((spec, config) -> { + if(config.fileName.contains("client")) + ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, spec, config.fileName+".toml"); + else + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, spec, config.fileName+".toml"); + }); + } + + @SubscribeEvent + public static void onConfigLoad(ModConfigEvent.Loading loading) { + loadConfig(loading.getConfig().getSpec()); + ConfigLoader.onConfigLoaded(); + } + @SubscribeEvent + public static void onConfigReload(ModConfigEvent.Reloading loading) { + loadConfig(loading.getConfig().getSpec()); + ConfigLoader.onConfigLoaded(); + } + + private static void loadConfig(IConfigSpec spec) { + BuiltConfig builtConfig = CONFIGS.get(spec.self()); + if (builtConfig == null) return; + loadConfig(builtConfig, spec.self().getValues()); + } + + private static void loadConfig(BuiltCategory category, UnmodifiableConfig config) { + config.valueMap().forEach((id, value) -> { + if (value instanceof ModConfigSpec.ConfigValue configValue) { + category.getProperty(id).ifPresent(data -> { + if (configValue instanceof ModConfigSpec.BooleanValue booleanValue) + data.setBoolean(booleanValue.get()); + if (configValue instanceof ModConfigSpec.IntValue intValue) + data.setInt(intValue.get()); + if (configValue instanceof ModConfigSpec.DoubleValue doubleValue) + data.setDouble(doubleValue.get()); + if(configValue.get() instanceof List listVal) + data.setStringArray(listVal.toArray(new String[listVal.size()])); + }); + } else if (value instanceof AbstractConfig subConfig) { + category.getCategory(id).ifPresent(cat -> loadConfig(cat, subConfig)); + } + }); + } + + public static void registerConfig(BuiltConfig config) { + try { + ModConfigSpec.Builder builder = new ModConfigSpec.Builder(); + for (PropertyData property : config.properties) buildProperty(builder, property); + for (BuiltCategory category : config.categories) buildCategory(builder, category); + CONFIGS.put(builder.build(), config); + }catch (Exception e) { + e.printStackTrace(); + } + } + + private static void buildCategory(ModConfigSpec.Builder builder, BuiltCategory category) throws IllegalAccessException { + builder.push(category.category); + if (category.categoryDesc != null) builder.comment(category.categoryDesc); + for (PropertyData property : category.properties) buildProperty(builder, property); + for (BuiltCategory builtCategory : category.categories) buildCategory(builder, builtCategory); + builder.pop(); + } + + private static void buildProperty(ModConfigSpec.Builder builder, PropertyData data) throws IllegalAccessException { + AnnotationData annotationData = data.data(); + builder.comment(annotationData.description()); + + switch (annotationData.type()) { + case BOOLEAN -> builder.define(data.getId(), data.getBoolean()); + case INT -> builder.defineInRange(data.getId(), data.getInt(), annotationData.min(), annotationData.max()); + case DOUBLE -> builder.defineInRange(data.getId(), data.getDouble(), annotationData.minD(), annotationData.maxD()); + case STRING_ARRAY -> builder.defineListAllowEmpty(List.of(data.getId()), () -> { + try { + return Arrays.asList(data.getStringArray()); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return new ArrayList<>(); + }, obj -> obj instanceof String); + default -> throw new IllegalAccessException("Unknown property type."); + } + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/events/ClientEvents.java b/NeoForge/src/main/java/tschipp/carryon/events/ClientEvents.java new file mode 100644 index 0000000..56bd780 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/events/ClientEvents.java @@ -0,0 +1,83 @@ +package tschipp.carryon.events; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.entity.player.Player; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RenderHandEvent; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.event.ScreenEvent; +import net.neoforged.neoforge.event.TickEvent; +import tschipp.carryon.CarryOnCommonClient; +import tschipp.carryon.Constants; +import tschipp.carryon.client.render.CarriedObjectRender; +import tschipp.carryon.client.render.CarryRenderHelper; +import tschipp.carryon.common.carry.CarryOnData; +import tschipp.carryon.common.carry.CarryOnDataManager; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = Constants.MOD_ID, value = Dist.CLIENT) +public class ClientEvents { + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void renderHand(RenderHandEvent event) + { + Player player = Minecraft.getInstance().player; + MultiBufferSource buffer = event.getMultiBufferSource(); + PoseStack matrix = event.getPoseStack(); + int light = event.getPackedLight(); + float partialTicks = event.getPartialTick(); + + if(CarriedObjectRender.drawFirstPerson(player, buffer, matrix, light, partialTicks) && CarryRenderHelper.getPerspective() == 0) + event.setCanceled(true); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onRenderLevel(RenderLevelStageEvent event) + { + if(event.getStage() == RenderLevelStageEvent.Stage.AFTER_PARTICLES) + CarriedObjectRender.drawThirdPerson(event.getPartialTick(), event.getPoseStack()); + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onGuiInit(ScreenEvent.Init.Pre event) + { + if (event.getScreen() != null) + { + boolean inventory = event.getScreen() instanceof AbstractContainerScreen; + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + + if (player != null && inventory) + { + CarryOnData carry = CarryOnDataManager.getCarryData(player); + if (carry.isCarrying()) + { + mc.player.closeContainer(); + mc.screen = null; + mc.mouseHandler.grabMouse(); + event.setCanceled(true); + } + } + } + } + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) + { + if(event.phase == TickEvent.Phase.END) + { + CarryOnCommonClient.checkForKeybinds(); + CarryOnCommonClient.onCarryClientTick(); + } + + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/events/CommonEvents.java b/NeoForge/src/main/java/tschipp/carryon/events/CommonEvents.java new file mode 100644 index 0000000..a20da65 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/events/CommonEvents.java @@ -0,0 +1,193 @@ +package tschipp.carryon.events; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.util.BlockSnapshot; +import net.neoforged.neoforge.event.*; +import net.neoforged.neoforge.event.entity.living.LivingAttackEvent; +import net.neoforged.neoforge.event.entity.living.MobSpawnEvent; +import net.neoforged.neoforge.event.entity.player.AttackEntityEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.neoforge.event.level.BlockEvent; +import tschipp.carryon.CarryOnCommon; +import tschipp.carryon.Constants; +import tschipp.carryon.common.carry.CarryOnData; +import tschipp.carryon.common.carry.CarryOnData.CarryType; +import tschipp.carryon.common.carry.CarryOnDataManager; +import tschipp.carryon.common.carry.PickupHandler; +import tschipp.carryon.common.carry.PlacementHandler; +import tschipp.carryon.common.scripting.ScriptReloadListener; +import tschipp.carryon.config.ConfigLoader; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = Constants.MOD_ID) +public class CommonEvents +{ + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onBlockClick(PlayerInteractEvent.RightClickBlock event) + { + if (event.isCanceled()) + return; + + Player player = event.getEntity(); + Level level = event.getLevel(); + BlockPos pos = event.getPos(); + + if (level.isClientSide) + return; + + boolean success = false; + + CarryOnData carry = CarryOnDataManager.getCarryData(player); + if (!carry.isCarrying()) { + if (PickupHandler.tryPickUpBlock((ServerPlayer) player, pos, level, (pState, pPos) -> { + BlockEvent.BreakEvent breakEvent = new BlockEvent.BreakEvent(level, pPos, pState, player); + NeoForge.EVENT_BUS.post(breakEvent); + return !breakEvent.isCanceled(); + })) { + success = true; + } + } else { + if (carry.isCarrying(CarryType.BLOCK)) { + PlacementHandler.tryPlaceBlock((ServerPlayer) player, pos, event.getFace(), (pos2, state) -> { + BlockSnapshot snapshot = BlockSnapshot.create(level.dimension(), level, pos2); + BlockEvent.EntityPlaceEvent event1 = new BlockEvent.EntityPlaceEvent(snapshot, level.getBlockState(pos), player); + NeoForge.EVENT_BUS.post(event1); + return !event1.isCanceled(); + }); + } else { + PlacementHandler.tryPlaceEntity((ServerPlayer) player, pos, event.getFace(), (pPos, toPlace) -> { + if (toPlace instanceof Mob mob) { + MobSpawnEvent.FinalizeSpawn checkSpawn = new MobSpawnEvent.FinalizeSpawn(mob, (ServerLevelAccessor) level, pPos.x, pPos.y, pPos.z, level.getCurrentDifficultyAt(new BlockPos((int) pPos.x, (int) pPos.y, (int) pPos.z)), MobSpawnType.EVENT, null, null, null); + NeoForge.EVENT_BUS.post(checkSpawn); + return event.getResult() != Event.Result.DENY; + } + return true; + }); + } + success = true; + } + + if (success) { + event.setUseBlock(Event.Result.DENY); + event.setUseItem(Event.Result.DENY); + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onEntityRightClick(PlayerInteractEvent.EntityInteract event) + { + if (event.isCanceled()) + return; + + Player player = event.getEntity(); + Level level = event.getLevel(); + Entity target = event.getTarget(); + + if (level.isClientSide) + return; + + CarryOnData carry = CarryOnDataManager.getCarryData(player); + if (!carry.isCarrying()) { + if (PickupHandler.tryPickupEntity((ServerPlayer) player, target, (toPickup) -> { + EntityPickupEvent pickupEvent = new EntityPickupEvent((ServerPlayer) player, toPickup); + NeoForge.EVENT_BUS.post(pickupEvent); + return !pickupEvent.isCanceled(); + })) { + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + return; + } + } else if (carry.isCarrying(CarryType.ENTITY) || carry.isCarrying(CarryType.PLAYER)) { + PlacementHandler.tryStackEntity((ServerPlayer) player, target); + } + } + + @SubscribeEvent + public static void onRegisterCommands(RegisterCommandsEvent event) + { + CarryOnCommon.registerCommands(event.getDispatcher()); + } + + @SubscribeEvent + public static void onDatapackRegister(AddReloadListenerEvent event) + { + event.addListener(new ScriptReloadListener()); + } + + @SubscribeEvent + public static void onDatapackSync(OnDatapackSyncEvent event) + { + ServerPlayer player = event.getPlayer(); + if (player == null) { + for (ServerPlayer p : event.getPlayerList().getPlayers()) + ScriptReloadListener.syncScriptsWithClient(p); + } else + ScriptReloadListener.syncScriptsWithClient(player); + } + + @SubscribeEvent + public static void onTagsUpdate(TagsUpdatedEvent event) + { + ConfigLoader.onConfigLoaded(); + } + + @SubscribeEvent + public static void onServerTick(TickEvent.ServerTickEvent event) + { + if (event.phase == TickEvent.Phase.END) + for (ServerPlayer player : event.getServer().getPlayerList().getPlayers()) + CarryOnCommon.onCarryTick(player); + } + + @SubscribeEvent + public static void onClone(PlayerEvent.Clone event) + { + if (!event.getOriginal().level().isClientSide) + PlacementHandler.placeCarriedOnDeath((ServerPlayer) event.getOriginal(), (ServerPlayer) event.getEntity(), event.isWasDeath()); + } + + @SubscribeEvent + public static void harvestSpeed(PlayerEvent.BreakSpeed event) + { + if (!CarryOnCommon.onTryBreakBlock(event.getEntity())) + event.setNewSpeed(0); + } + + @SubscribeEvent + public static void attackEntity(AttackEntityEvent event) + { + if(!CarryOnCommon.onAttackedByPlayer(event.getEntity())) + event.setCanceled(true); + } + + @SubscribeEvent + public static void onBreakBlock(BlockEvent.BreakEvent event) + { + if (!CarryOnCommon.onTryBreakBlock(event.getPlayer())) { + event.setCanceled(true); + } + } + + @SubscribeEvent + public static void playerAttack(LivingAttackEvent event) + { + if(event.getEntity() instanceof Player player) + CarryOnCommon.onPlayerAttacked(player); + } + +} diff --git a/NeoForge/src/main/java/tschipp/carryon/events/EntityPickupEvent.java b/NeoForge/src/main/java/tschipp/carryon/events/EntityPickupEvent.java new file mode 100644 index 0000000..b2645c4 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/events/EntityPickupEvent.java @@ -0,0 +1,17 @@ +package tschipp.carryon.events; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.ICancellableEvent; + +public class EntityPickupEvent extends Event implements ICancellableEvent { + + public final ServerPlayer player; + public final Entity target; + + public EntityPickupEvent(ServerPlayer player, Entity target) { + this.player = player; + this.target = target; + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/events/ModBusEvents.java b/NeoForge/src/main/java/tschipp/carryon/events/ModBusEvents.java new file mode 100644 index 0000000..870d533 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/events/ModBusEvents.java @@ -0,0 +1,58 @@ +package tschipp.carryon.events; + +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.InterModComms; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.InterModProcessEvent; +import tschipp.carryon.Constants; +import tschipp.carryon.client.modeloverride.ModelOverrideHandler; +import tschipp.carryon.common.config.ListHandler; + +import java.util.stream.Stream; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = Constants.MOD_ID) +public class ModBusEvents { + + @SubscribeEvent(priority = EventPriority.LOW) + public static void serverLoad(InterModProcessEvent event) + { + Stream messages = InterModComms.getMessages(Constants.MOD_ID); + + messages.forEach(msg -> { + + String method = msg.method(); + Object obj = msg.messageSupplier().get(); + + if (!(obj instanceof String str)) + return; + + + switch (method) { + case "blacklistBlock": + ListHandler.addForbiddenTiles(str); + break; + case "blacklistEntity": + ListHandler.addForbiddenEntities(str); + break; + case "whitelistBlock": + ListHandler.addAllowedTiles(str); + break; + case "whitelistEntity": + ListHandler.addAllowedEntities(str); + break; + case "blacklistStacking": + ListHandler.addForbiddenStacking(str); + break; + case "whitelistStacking": + ListHandler.addAllowedStacking(str); + break; + case "addModelOverride": + ModelOverrideHandler.addFromString(str); + break; + } + + }); + + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/events/ModClientEvents.java b/NeoForge/src/main/java/tschipp/carryon/events/ModClientEvents.java new file mode 100644 index 0000000..7bb02c9 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/events/ModClientEvents.java @@ -0,0 +1,20 @@ +package tschipp.carryon.events; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import tschipp.carryon.Constants; +import tschipp.carryon.client.keybinds.CarryOnKeybinds; + +@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD, modid = Constants.MOD_ID, value = Dist.CLIENT) +public class ModClientEvents +{ + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void registerKeybinds(RegisterKeyMappingsEvent event) + { + CarryOnKeybinds.registerKeybinds(event::register); + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/mixin/CarryOnMixinConfigPlugin.java b/NeoForge/src/main/java/tschipp/carryon/mixin/CarryOnMixinConfigPlugin.java new file mode 100644 index 0000000..47675e2 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/mixin/CarryOnMixinConfigPlugin.java @@ -0,0 +1,46 @@ +package tschipp.carryon.mixin; + + +import com.llamalad7.mixinextras.MixinExtrasBootstrap; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class CarryOnMixinConfigPlugin implements IMixinConfigPlugin { + @Override + public void onLoad(String mixinPackage) { + MixinExtrasBootstrap.init(); + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void postApply(String targetClassName, org.objectweb.asm.tree.ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void preApply(String targetClassName, org.objectweb.asm.tree.ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgeGamestagesHelper.java b/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgeGamestagesHelper.java new file mode 100644 index 0000000..a22489f --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgeGamestagesHelper.java @@ -0,0 +1,17 @@ +package tschipp.carryon.platform; + +import net.minecraft.world.entity.player.Player; +import tschipp.carryon.compat.GamestageCompat; +import tschipp.carryon.platform.services.IGamestagePlatformHelper; + +public class NeoForgeGamestagesHelper implements IGamestagePlatformHelper +{ + @Override + public boolean hasStage(Player player, String stage) + { + if(!Services.PLATFORM.isModLoaded("gamestages")) + return true; + + return GamestageCompat.hasStage(player, stage); + } +} diff --git a/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgePlatformHelper.java b/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgePlatformHelper.java new file mode 100644 index 0000000..1fc3ea9 --- /dev/null +++ b/NeoForge/src/main/java/tschipp/carryon/platform/NeoForgePlatformHelper.java @@ -0,0 +1,104 @@ +package tschipp.carryon.platform; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.neoforged.fml.ModList; +import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.handling.IPlayPayloadHandler; +import net.neoforged.neoforge.network.registration.IPayloadRegistrar; +import tschipp.carryon.CarryOnCommonClient; +import tschipp.carryon.config.BuiltConfig; +import tschipp.carryon.config.neoforge.ConfigLoaderImpl; +import tschipp.carryon.networking.PacketBase; +import tschipp.carryon.platform.services.IPlatformHelper; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +public class NeoForgePlatformHelper implements IPlatformHelper { + + @Override + public String getPlatformName() { + + return "NeoForge"; + } + + @Override + public boolean isModLoaded(String modId) { + + return ModList.get().isLoaded(modId); + } + + @Override + public boolean isDevelopmentEnvironment() { + + return !FMLLoader.isProduction(); + } + + @Override + public void registerConfig(BuiltConfig cfg) { + ConfigLoaderImpl.registerConfig(cfg); + } + + private record PacketBridge(T packet) implements CustomPacketPayload { + + @Override + public void write(FriendlyByteBuf pBuffer) { + packet.write(pBuffer); + } + + @Override + public ResourceLocation id() { + return packet.id(); + } + + public T original() { + return packet; + } + } + + @Override + public void registerServerboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { + IPayloadRegistrar registrar = (IPayloadRegistrar) args[0]; + + IPlayPayloadHandler> serverHandler = (packet, ctx) -> { + ctx.workHandler().submitAsync(() -> { + handler.accept(packet.original(), ctx.player().get()); + }); + }; + + FriendlyByteBuf.Reader> modifiedReader = (buf) -> new PacketBridge(reader.apply(buf)); + + registrar.play(id, modifiedReader, han -> han.server(serverHandler)); + } + + @Override + public void registerClientboundPacket(ResourceLocation id, int numericalId, Class clazz, BiConsumer writer, Function reader, BiConsumer handler, Object... args) { + IPayloadRegistrar registrar = (IPayloadRegistrar) args[0]; + + IPlayPayloadHandler> clientHandler = (packet, ctx) -> { + ctx.workHandler().submitAsync(() -> { + handler.accept(packet.original(), CarryOnCommonClient.getPlayer()); + }); + }; + + FriendlyByteBuf.Reader> modifiedReader = (buf) -> new PacketBridge(reader.apply(buf)); + + registrar.play(id, modifiedReader, han -> han.client(clientHandler)); + } + + + @Override + public void sendPacketToServer(ResourceLocation id, PacketBase packet) { + PacketDistributor.SERVER.noArg().send(new PacketBridge(packet)); + } + + @Override + public void sendPacketToPlayer(ResourceLocation id, PacketBase packet, ServerPlayer player) { + PacketDistributor.PLAYER.with(player).send(new PacketBridge(packet)); + } +} diff --git a/NeoForge/src/main/resources/META-INF/mods.toml b/NeoForge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..89fa909 --- /dev/null +++ b/NeoForge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,30 @@ +modLoader = "javafml" #mandatory +loaderVersion = "${neoforge_loader_version_range}" #mandatory +license = "${license}" # Review your options at https://choosealicense.com/. +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional +[[mods]] #mandatory +modId = "${mod_id}" #mandatory +version = "${version}" #mandatory +displayName = "${mod_name}" #mandatory +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional (see https://docs.neoforged.net/docs/misc/updatechecker/) +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional (displayed in the mod UI) +logoFile="logo.png" #optional +credits="${credits}" #optional +authors = "${mod_author}" #optional +description = '''${description}''' #mandatory (Supports multiline text) +[[mixins]] +config = "${mod_id}.mixins.json" +[[mixins]] +config = "${mod_id}.neoforge.mixins.json" +[[dependencies.${mod_id}]] #optional +modId = "neoforge" #mandatory +type="required" #mandatory (Can be one of "required", "optional", "incompatible" or "discouraged") +versionRange = "${neoforge_loader_version_range}" #mandatory +ordering = "NONE" # The order that this dependency should load in relation to your mod, required to be either 'BEFORE' or 'AFTER' if the dependency is not mandatory +side = "BOTH" # Side this dependency is applied on - 'BOTH', 'CLIENT' or 'SERVER' +[[dependencies.${mod_id}]] +modId = "minecraft" +type="required" #mandatory (Can be one of "required", "optional", "incompatible" or "discouraged") +versionRange = "${minecraft_version_range}" +ordering = "NONE" +side = "BOTH" \ No newline at end of file diff --git a/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IGamestagePlatformHelper b/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IGamestagePlatformHelper new file mode 100644 index 0000000..9904869 --- /dev/null +++ b/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IGamestagePlatformHelper @@ -0,0 +1 @@ +tschipp.carryon.platform.NeoForgeGamestagesHelper \ No newline at end of file diff --git a/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IPlatformHelper b/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IPlatformHelper new file mode 100644 index 0000000..ae6ba2f --- /dev/null +++ b/NeoForge/src/main/resources/META-INF/services/tschipp.carryon.platform.services.IPlatformHelper @@ -0,0 +1 @@ +tschipp.carryon.platform.NeoForgePlatformHelper \ No newline at end of file diff --git a/NeoForge/src/main/resources/carryon.neoforge.mixins.json b/NeoForge/src/main/resources/carryon.neoforge.mixins.json new file mode 100644 index 0000000..f7f959e --- /dev/null +++ b/NeoForge/src/main/resources/carryon.neoforge.mixins.json @@ -0,0 +1,16 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "tschipp.carryon.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } + //"refmap": "${refmap_target}refmap.json" +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index be08972..efb0013 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,8 @@ +plugins { + // Required for NeoGradle + id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.7" +} + subprojects { apply plugin: 'java' @@ -53,6 +58,34 @@ subprojects { it.options.release = 17 } + processResources { + def expandProps = [ + "version": version, + "group": project.group, //Else we target the task's group. + "minecraft_version": minecraft_version, + "forge_version": forge_version, + "forge_loader_version_range": forge_loader_version_range, + "forge_version_range": forge_version_range, + "minecraft_version_range": minecraft_version_range, + "fabric_version": fabric_version, + "fabric_loader_version": fabric_loader_version, + "mod_name": mod_name, + "mod_author": mod_author, + "mod_id": mod_id, + "license": license, + "description": project.description, + "neoforge_version": neoforge_version, + "neoforge_loader_version_range": neoforge_loader_version_range, + "credits": credits, + "refmap_target": "${mod_id}." + ] + + filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', '*.mixins.json']) { + expand expandProps + } + inputs.properties(expandProps) + } + // Disables Gradle's custom module metadata from being published to maven. The // metadata includes mapped dependencies which are not reasonably consumable by // other mod developers. diff --git a/gradle.properties b/gradle.properties index f2ecc64..ae592d1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,30 +1,37 @@ # Project -version=2.1.2 +version=2.1.3 group=tschipp.carryon # Common -minecraft_version=1.20.1 -common_runs_enabled=false -common_client_run_name=Common Client -common_server_run_name=Common Server - -# Forge -forge_version=47.0.49 -parchment_mappings=2023.07.02-1.20.1 -//forge_ats_enabled=true - -# Fabric -fabric_version=0.85.0+1.20.1 -fabric_loader_version=0.14.21 -parchment_mappings_fabric=1.20.1:2023.07.02 - -# Mod options +minecraft_version=1.20.4 mod_name=Carry On mod_author=Tschipp, PurpliciousCow mod_id=carryon +license=GNU LGPLv3 +credits= +description=Carry On is a simple mod that improves game interaction by allowing players to pick up, carry, and place single block Tile Entities using only their empty hands. +minecraft_version_range=[1.20.4, 1.21) +# Forge +forge_version=49.0.30 +forge_loader_version_range=[49,) +forge_version_range=[49,) +parchment_mappings=1.20.3-2023.12.31-1.20.4 +//forge_ats_enabled=true + +# Fabric +fabric_version=0.96.3+1.20.4 +fabric_loader_version=0.15.7 +parchment_mappings_fabric=1.20.3:2023.12.31 + +# Neoforge +neoforge_version=20.4.163-beta +neoforge_loader_version_range=[2,) +neogradle.subsystems.parchment.minecraftVersion=1.20.3 +neogradle.subsystems.parchment.mappingsVersion=2023.12.31 + # Gradle org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -mixinextras_version=0.2.0-beta.6 \ No newline at end of file +mixinextras_version=0.3.5 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..1af9e09 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index b4f908a..31042a6 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env bash +#!/bin/sh # -# Copyright 2015 the original author or authors. +# 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. @@ -17,67 +17,99 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/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 -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +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 -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +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 - ;; +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 @@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 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" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,86 +130,120 @@ 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. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -ARGV=("$@") -eval set -- $DEFAULT_JVM_OPTS +# 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. -IFS=$' -' read -rd '' -a JAVA_OPTS_ARR <<< "$(echo $JAVA_OPTS | xargs -n1)" -IFS=$' -' read -rd '' -a GRADLE_OPTS_ARR <<< "$(echo $GRADLE_OPTS | xargs -n1)" +# 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" ) -exec "$JAVACMD" "$@" "${JAVA_OPTS_ARR[@]}" "${GRADLE_OPTS_ARR[@]}" "-Dorg.gradle.appname=$APP_BASE_NAME" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "${ARGV[@]}" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/gradlew.bat b/gradlew.bat index 107acd3..b2e0cc5 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/settings.gradle b/settings.gradle index 6cbeebc..538c990 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1,13 @@ pluginManagement { repositories { gradlePluginPortal() + mavenLocal() + maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' } + maven { name = 'Sponge Snapshots' url = 'https://repo.spongepowered.org/repository/maven-public/' @@ -16,8 +19,27 @@ pluginManagement { name = 'ParchmentMC' url = 'https://maven.parchmentmc.org' } + + maven { + name = 'Forge' + url = 'https://maven.minecraftforge.net/' + } + + maven { + name = 'NeoForge' + url = 'https://maven.neoforged.net/releases/' + } + + maven { + url 'https://maven.blamejared.com' + } + } } +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} + rootProject.name = 'CarryOn' -include("Common", "Fabric", "Forge") \ No newline at end of file +include("Common", "Fabric", "Forge", "NeoForge") \ No newline at end of file