diff --git a/README.md b/README.md index 6a7c63a..c69b04c 100644 --- a/README.md +++ b/README.md @@ -28,4 +28,4 @@ Please contact us on our [discord](https://discord.sekwah.com/). # Examples I will link examples as I switch other mods of my own over to doing multi-platform. -I will also at some point setup the forge-testmod, fabric-testmod and core-testmod as another example to also allow for basic testing of the library during dev. \ No newline at end of file +I will also at some point setup the forge-testmod, fabric-testmod and core-testmod as another example to also allow for basic testing of the library during dev. diff --git a/build.gradle b/build.gradle index 482641b..4a205c4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,8 @@ -// In the old version for auto you couldnt have seperate later stages easily +// In the old version for auto you couldnt have separate later stages easily // Thanks to release-please we can leave this mostly empty +// Need to clean up the gradle files as I know however the focus is on it working vs being best practices. +// If you have suggestions on how to improve these feel free to make th em :) + plugins { id "com.modrinth.minotaur" version "2.+" } diff --git a/core/build.gradle b/core/build.gradle index c9e7cb0..9fc0abd 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -38,60 +38,7 @@ minecraft { // Default run configurations. // These can be tweaked, removed, or duplicated as needed. runs { - client { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - //property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" - - mods { - "${project.modid}" { - source sourceSets.main - } - } - } - - server { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', '' - //property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - mods { - "${project.modid}" { - source sourceSets.main - } - } - } - - data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - property 'forge.logging.markers', '' - //property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' - - // Recommended logging level for the console - property 'forge.logging.console.level', 'debug' - - args '--mod', project.modid, '--all', '--output', file('src/generated/resources/') - - mods { - "${project.modid}" { - source sourceSets.main - } - } - } + // Copy from other projects if needed } } diff --git a/core/src/main/java/com/sekwah/sekclib/core/util/ColorUtil.java b/core/src/main/java/com/sekwah/sekclib/util/ColorUtil.java similarity index 97% rename from core/src/main/java/com/sekwah/sekclib/core/util/ColorUtil.java rename to core/src/main/java/com/sekwah/sekclib/util/ColorUtil.java index 1597f99..7be7fac 100644 --- a/core/src/main/java/com/sekwah/sekclib/core/util/ColorUtil.java +++ b/core/src/main/java/com/sekwah/sekclib/util/ColorUtil.java @@ -1,4 +1,4 @@ -package com.sekwah.sekclib.core.util; +package com.sekwah.sekclib.util; import net.minecraft.network.chat.TextColor; import java.awt.*; diff --git a/core/src/main/java/com/sekwah/sekclib/core/util/ModelUtils.java b/core/src/main/java/com/sekwah/sekclib/util/ModelUtils.java similarity index 96% rename from core/src/main/java/com/sekwah/sekclib/core/util/ModelUtils.java rename to core/src/main/java/com/sekwah/sekclib/util/ModelUtils.java index db559b4..734dda4 100644 --- a/core/src/main/java/com/sekwah/sekclib/core/util/ModelUtils.java +++ b/core/src/main/java/com/sekwah/sekclib/util/ModelUtils.java @@ -1,4 +1,4 @@ -package com.sekwah.sekclib.core.util; +package com.sekwah.sekclib.util; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.CubeListBuilder; diff --git a/forge-testmod/build.gradle b/forge-testmod/build.gradle index 2c7e0fe..e75e31d 100644 --- a/forge-testmod/build.gradle +++ b/forge-testmod/build.gradle @@ -16,23 +16,20 @@ buildscript { mavenCentral() } dependencies { + classpath "org.spongepowered:mixingradle:0.7+" classpath(group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true) classpath "org.apache.httpcomponents:httpmime:4.5.14" } } -plugins { - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} apply plugin: 'net.minecraftforge.gradle' apply plugin: "java" apply plugin: 'eclipse' apply plugin: 'maven-publish' -def modid = "sekclib-testmod" +def modid = "sekclibtest" -//apply plugin: "org.spongepowered.mixin" +apply plugin: "org.spongepowered.mixin" def branch = System.getenv("GITHUB_REF") def snapshotName = null; @@ -103,6 +100,8 @@ minecraft { //property 'mixin.env.remapRefMap', 'true' //property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" + ideaModule "SekCLib.forge-testmod.main" + mods { "${modid}" { source sourceSets.main @@ -120,6 +119,8 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + ideaModule "SekCLib.forge-testmod.main" + mods { "${modid}" { source sourceSets.main @@ -137,6 +138,8 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + ideaModule "SekCLib.forge-testmod.main" + args '--mod', modid, '--all', '--output', file('src/generated/resources/') mods { @@ -157,39 +160,20 @@ dependencies { // The userdev artifact is a special name and will get all sorts of transformations applied to it. minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - //implementation 'org.spongepowered:mixin:0.8.5' - //annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + implementation 'org.spongepowered:mixin:0.8.5' + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' implementation project(":forge") - // Trick intellij to allow for better editing in here for the discord task - // compile "org.apache.httpcomponents:httpmime:4.5.13" - //implementation fg.deobf("curse.maven:torohealth-damage-indicators-245733:3556931") - - //implementation fg.deobf("curse.maven:hwyla:${project.hwyla_fileid}") - - //include('org.ow2.asm:asm-debug-all:5.2') - - // You may put jars on which you depend on in ./libs or you may define them like so.. - // compile "some.group:artifact:version:classifier" - // compile "some.group:artifact:version" - - // Real examples - // compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env - // compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env - - // For more info... - // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html - // http://www.gradle.org/docs/current/userguide/dependency_management.html } // Readd if mixins start being used -//mixin { -// add sourceSets.main, "mixins.${project.modid}.refmap.json" -// -// debug.verbose = true -// debug.export = true -//} +mixin { + add sourceSets.main, "mixins.${modid}.refmap.json" + + debug.verbose = true + debug.export = true +} // Example for how to get properties into the manifest for reading by the runtime.. jar { @@ -301,41 +285,3 @@ task discordupload { } } } - -tasks.curseforge.enabled = System.getenv("CURSE_API") != null - -curseforge { - logger.info("Curse api: " + System.getenv("CURSE_API")) - if (System.getenv("CURSE_API") != null) { - apiKey = System.getenv("CURSE_API") - } - project { - id = project.curse_project_id - // TODO add code to reference this but also cut the latest change logs in for the files - changelog = getReleaseChangelog() - changelogType = 'markdown' - releaseType = 'release' - addGameVersion '1.20' - addGameVersion '1.20.1' - - mainArtifact(jar){ - - } - addArtifact srcJar - addArtifact deobfJar - } -} - -// https://github.com/modrinth/minotaur -modrinth { - token = System.getenv("MODRINTH_TOKEN") - projectId = project.modrinth_slug - versionType = "release" - uploadFile = jar - additionalFiles = [srcJar, deobfJar] - // Split string into array - - - gameVersions = project.game_versions.tokenize(",") - changelog = getReleaseChangelog() -} diff --git a/forge-testmod/src/main/java/com/sekwah/sekclibtest/SekCLibTest.java b/forge-testmod/src/main/java/com/sekwah/sekclibtest/SekCLibTest.java index c6c23a7..0214613 100644 --- a/forge-testmod/src/main/java/com/sekwah/sekclibtest/SekCLibTest.java +++ b/forge-testmod/src/main/java/com/sekwah/sekclibtest/SekCLibTest.java @@ -1,6 +1,14 @@ package com.sekwah.sekclibtest; +import com.sekwah.sekclib.capabilitysync.capabilitysync.RegisterCapabilitySyncEvent; +import com.sekwah.sekclibtest.capabilities.CapabilityHandler; +import com.sekwah.sekclibtest.capabilities.IDiamondData; +import com.sekwah.sekclibtest.capabilities.DiamondData; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod(SekCLibTest.MOD_ID) @Mod.EventBusSubscriber(modid = SekCLibTest.MOD_ID) @@ -8,6 +16,17 @@ public class SekCLibTest { public static final String MOD_ID = "sekclibtest"; public SekCLibTest() { - System.out.println("HELLO"); + // You can do it this way or use a EventBusSubscriber that points to the MOD bus. + IEventBus eventBus = FMLJavaModLoadingContext.get().getModEventBus(); + eventBus.addListener(this::registerCapabilities); + eventBus.addListener(this::registerCapabilitySync); + } + + private void registerCapabilities(RegisterCapabilitiesEvent event) { + event.register(IDiamondData.class); + } + + public void registerCapabilitySync(RegisterCapabilitySyncEvent event) { + event.registerPlayerCap(new ResourceLocation(SekCLibTest.MOD_ID, "test_data"), CapabilityHandler.DIAMOND_DATA, DiamondData.class); } } diff --git a/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/CapabilityHandler.java b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/CapabilityHandler.java new file mode 100644 index 0000000..c77c042 --- /dev/null +++ b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/CapabilityHandler.java @@ -0,0 +1,30 @@ +package com.sekwah.sekclibtest.capabilities; + +import com.sekwah.sekclibtest.SekCLibTest; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.event.entity.living.LivingHurtEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = SekCLibTest.MOD_ID) +public class CapabilityHandler { + public static final Capability DIAMOND_DATA = CapabilityManager.get(new CapabilityToken<>() {}); + + @SubscribeEvent + public static void attachCapability(AttachCapabilitiesEvent event) { + event.addCapability(new ResourceLocation(SekCLibTest.MOD_ID, "diamond_infected_data"), new DiamondData()); + } + + @SubscribeEvent + public static void livingHurt(LivingHurtEvent event) { + var entity = event.getEntity(); + entity.getCapability(DIAMOND_DATA).ifPresent(testData -> { + testData.setDiamond(true); + }); + } +} diff --git a/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/DiamondData.java b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/DiamondData.java new file mode 100644 index 0000000..a9b18f4 --- /dev/null +++ b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/DiamondData.java @@ -0,0 +1,35 @@ +package com.sekwah.sekclibtest.capabilities; + +import com.sekwah.sekclib.capabilitysync.capabilitysync.annotation.Sync; +import net.minecraft.core.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class DiamondData implements IDiamondData, ICapabilityProvider { + + + private final LazyOptional holder = LazyOptional.of(() -> this); + + @Sync(syncGlobally = true) + private boolean diamondMode = false; + + @NotNull + @Override + public LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return CapabilityHandler.DIAMOND_DATA.orEmpty(cap, holder); + } + + @Override + public boolean isDiamond() { + return this.diamondMode; + } + + @Override + public void setDiamond(boolean isDiamond) { + this.diamondMode = isDiamond; + } + +} diff --git a/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/IDiamondData.java b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/IDiamondData.java new file mode 100644 index 0000000..f37fe90 --- /dev/null +++ b/forge-testmod/src/main/java/com/sekwah/sekclibtest/capabilities/IDiamondData.java @@ -0,0 +1,6 @@ +package com.sekwah.sekclibtest.capabilities; + +public interface IDiamondData { + boolean isDiamond(); + void setDiamond(boolean isDiamond); +} diff --git a/forge-testmod/src/main/java/com/sekwah/sekclibtest/mixins/client/LivingEntityRendererMixin.java b/forge-testmod/src/main/java/com/sekwah/sekclibtest/mixins/client/LivingEntityRendererMixin.java new file mode 100644 index 0000000..fa3601e --- /dev/null +++ b/forge-testmod/src/main/java/com/sekwah/sekclibtest/mixins/client/LivingEntityRendererMixin.java @@ -0,0 +1,39 @@ +package com.sekwah.sekclibtest.mixins.client; + +import com.sekwah.sekclibtest.SekCLibTest; +import com.sekwah.sekclibtest.capabilities.CapabilityHandler; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.Wolf; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LivingEntityRenderer.class) +public class LivingEntityRendererMixin> { + + @Shadow protected M model; + private ResourceLocation diamond = new ResourceLocation(SekCLibTest.MOD_ID, "textures/entity/diamond_block.png"); + + @Inject(method = "getRenderType", at = @At("HEAD"), cancellable = true) + protected void getEntityTexture(T target, boolean p_115323_, boolean p_115324_, boolean p_115325_, CallbackInfoReturnable cir) { + target.getCapability(CapabilityHandler.DIAMOND_DATA).ifPresent(diamondInfectedData -> { + if(diamondInfectedData.isDiamond()) { + ResourceLocation resourcelocation = diamond; + if (p_115324_) { + cir.setReturnValue(RenderType.itemEntityTranslucentCull(resourcelocation)); + } else if (p_115323_) { + cir.setReturnValue(this.model.renderType(resourcelocation)); + } else { + cir.setReturnValue(p_115325_ ? RenderType.outline(resourcelocation) : null); + } + cir.cancel(); + } + }); + } +} diff --git a/forge-testmod/src/main/resources/META-INF/MANIFEST.MF b/forge-testmod/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 0000000..901a42f --- /dev/null +++ b/forge-testmod/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +COMMENT: This file exists purely for dev time, + anything added here should be mirrored in the build.gradle. +MixinConfigs: mixins.sekclibtest.json diff --git a/forge-testmod/src/main/resources/assets/sekclibtest/textures/entity/diamond_block.png b/forge-testmod/src/main/resources/assets/sekclibtest/textures/entity/diamond_block.png new file mode 100644 index 0000000..80948e1 Binary files /dev/null and b/forge-testmod/src/main/resources/assets/sekclibtest/textures/entity/diamond_block.png differ diff --git a/forge-testmod/src/main/resources/mixins.sekclibtest.json b/forge-testmod/src/main/resources/mixins.sekclibtest.json new file mode 100644 index 0000000..2b98e55 --- /dev/null +++ b/forge-testmod/src/main/resources/mixins.sekclibtest.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8", + "compatibilityLevel": "JAVA_17", + "package": "com.sekwah.sekclibtest.mixins", + "refmap": "mixins.sekclibtest.refmap.json", + "mixins": [ + ], + "client": [ + "client.LivingEntityRendererMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/build.gradle b/forge/build.gradle index eff4689..2e0437e 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -95,6 +95,9 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + + ideaModule "SekCLib.forge.main" + //property 'mixin.env.remapRefMap', 'true' //property 'mixin.env.refMapRemappingFile', "${buildDir}/createSrgToMcp/output.srg" @@ -116,6 +119,8 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + ideaModule "SekCLib.forge.main" + mods { "${project.modid}" { source sourceSets.main @@ -133,6 +138,8 @@ minecraft { // Recommended logging level for the console property 'forge.logging.console.level', 'debug' + ideaModule "SekCLib.forge.main" + args '--mod', project.modid, '--all', '--output', file('src/generated/resources/') mods { @@ -195,9 +202,11 @@ dependencies { // Example for how to get properties into the manifest for reading by the runtime.. jar { - finalizedBy 'reobfJar' - archiveClassifier = 'universal' + // Not 100% if this is needed because it seems to output identical jars even if commented out + // But this HAS to be commented out to allow the forge-testmod to successfully run + // finalizedBy 'reobfJar' archiveBaseName = "${archivesBaseName}${project.mc_label}-forge" + archiveClassifier = 'universal' manifest { attributes([ "Specification-Title": project.modid, @@ -234,6 +243,17 @@ task deobfJar(type: Jar) { from sourceSets.main.output archiveClassifier = 'deobf' archiveBaseName = "${archivesBaseName}${project.mc_label}-forge" + manifest { + attributes([ + "Specification-Title": project.modid, + "Specification-Vendor": project.vendor, + "Specification-Version": "1", // We are version 1 of ourselves + "Implementation-Title": project.name, + "Implementation-Version": "${versionString}", + "Implementation-Vendor" :project.vendor, + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), + ]) + } from file("LICENSE") } diff --git a/forge/src/test/java/com/sekwah/sekclibtest/SekCLibTest.java b/forge/src/test/java/com/sekwah/sekclibtest/SekCLibTest.java deleted file mode 100644 index c6c23a7..0000000 --- a/forge/src/test/java/com/sekwah/sekclibtest/SekCLibTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.sekwah.sekclibtest; - -import net.minecraftforge.fml.common.Mod; - -@Mod(SekCLibTest.MOD_ID) -@Mod.EventBusSubscriber(modid = SekCLibTest.MOD_ID) -public class SekCLibTest { - public static final String MOD_ID = "sekclibtest"; - - public SekCLibTest() { - System.out.println("HELLO"); - } -} diff --git a/forge/src/test/resources/META-INF/mods.toml b/forge/src/test/resources/META-INF/mods.toml deleted file mode 100644 index 6c6102c..0000000 --- a/forge/src/test/resources/META-INF/mods.toml +++ /dev/null @@ -1,30 +0,0 @@ -modLoader="javafml" -loaderVersion="[41,)" -issueTrackerURL="https://github.com/sekwah41/SekCLib/issues" -license="MIT" -[[mods]] - modId="sekclib" - version="${file.jarVersion}" - displayName="SekCore Lib" - updateJSONURL="https://www.sekwah.com/modversions/sekclib.json" - displayURL="https://modrinth.com/mod/sekclib/" - authors="Sekwah" - description='''A library mod designed to make aspects of modding easier, in particular network syncing with clients. - -Other features and utilities are also included. -''' - -[[dependencies.sekclib]] - modId="forge" - mandatory=true - versionRange="[46.0.1,48)" - ordering="NONE" - side="BOTH" - -# https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html -[[dependencies.sekclib]] - modId="minecraft" - mandatory=true - versionRange="[1.20,)" - ordering="NONE" - side="BOTH" diff --git a/gradle.properties b/gradle.properties index 11838f1..35ba418 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,4 +23,4 @@ github=https://github.com/sekwah41/SekCLib curse_project_id=371078 modrinth_slug=sekclib -game_versions="1.20,1.20.1" \ No newline at end of file +game_versions="1.20,1.20.1"