diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 111169b..dbf9319 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Java CI on: push: - branches: [ main, dev ] + branches: [ 1.16/main, 1.16/dev ] workflow_dispatch: inputs: norelease: @@ -16,36 +16,32 @@ jobs: if: | !contains(github.event.head_commit.message, '[ciskip]') steps: - - uses: actions/cache@v2 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 30 # Gets the last 30 commits so the changelog might work - name: Set up JDK 11 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: - distribution: 'adopt' - java-version: '11' - - name: Build with Gradle + distribution: 'temurin' + java-version: '16' + - name: Fix borked permissions + run: chmod +x ./gradlew + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + - name: Build and Publish with Gradle + uses: gradle/gradle-build-action@v2 env: FTB_MAVEN_TOKEN: ${{ secrets.FTB_MAVEN_TOKEN}} SAPS_TOKEN: ${{ secrets.SAPS_TOKEN }} - run: | - chmod +x ./gradlew - ./gradlew build publish --stacktrace --no-daemon + with: + arguments: build publish --stacktrace --no-daemon - name: Release to CurseForge + uses: gradle/gradle-build-action@v2 if: | - github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, '[norelease]') && github.event.inputs.norelease != 'true' + contains(github.ref, 'main') && !contains(github.event.head_commit.message, '[norelease]') && github.event.inputs.norelease != 'true' env: GIT_COMMIT: ${{ github.event.after }} GIT_PREVIOUS_COMMIT: ${{ github.event.before }} CURSEFORGE_KEY: ${{ secrets.CURSEFORGE_KEY }} - run: | - chmod +x ./gradlew - ./gradlew build curseforge --stacktrace --no-daemon \ No newline at end of file + with: + arguments: build curseforge --stacktrace --no-daemon \ No newline at end of file diff --git a/build.gradle b/build.gradle index 053e2a5..5fea999 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,10 @@ plugins { - id "dev.architectury.loom" version "0.7.2-SNAPSHOT" + id "dev.architectury.loom" version "0.10.0-SNAPSHOT" id 'maven-publish' id "com.matthewprenger.cursegradle" version "1.4.0" } -apply from: 'https://files.latmod.com/public/markdown-git-changelog.gradle' +apply from: 'https://files.saps.dev/ci/git-md-changelog.gradle' sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 @@ -17,25 +17,27 @@ group = project.maven_group loom { silentMojangMappingsLicense() - mixinConfigs = [ - ] - - useFabricMixin = true - - dataGen { - mod project.mod_id - } + forge { + dataGen { + mod project.mod_id + } - launches { - data { - arg "--existing", file("src/main/resources").absolutePath - arg "--assetIndex", "1.16" - arg "--assetsDir", (ENV.GRADLE_USER_HOME ?: "${System.getProperty("user.home")}/.gradle") + "/caches/fabric-loom/assets" + launches { + data { + arg "--existing", file("src/main/resources").absolutePath + arg "--assetIndex", "1.16" + arg "--assetsDir", (ENV.GRADLE_USER_HOME ?: "${System.getProperty("user.home")}/.gradle") + "/caches/fabric-loom/assets" + } } } } repositories { + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org' + } + maven { url "https://maven.shedaniel.me/" content { @@ -61,7 +63,10 @@ repositories { dependencies { minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings minecraft.officialMojangMappings() + mappings loom.layered() { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-1.16.5:2022.03.06") + } forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" modImplementation "curse.maven:projecte-226410:${projecte_file}" modImplementation "curse.maven:jei-238222:${jei_file}" @@ -123,7 +128,7 @@ publishing { maven { url "https://maven.ftb.dev/release" credentials { - username = "latvian" + username = "ftb" password = "${ENV.FTB_MAVEN_TOKEN}" } } @@ -131,9 +136,9 @@ publishing { if (ENV.SAPS_TOKEN) { maven { - url "https://maven.saps.dev/minecraft" + url "https://maven.saps.dev/releases" credentials { - username = "latvian" + username = "ftb" password = "${ENV.SAPS_TOKEN}" } } @@ -148,7 +153,7 @@ if (ENV.CURSEFORGE_KEY) { id = project.curseforge_id releaseType = project.curseforge_type addGameVersion "1.16.5" - mainArtifact(remapJar.archivePath) + mainArtifact(remapJar.archiveFile) relations { requiredDependency 'projecte' } diff --git a/gradle.properties b/gradle.properties index c9bdc8b..115ad93 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,12 +2,12 @@ org.gradle.jvmargs=-Xmx1G loom.platform=forge minecraft_version=1.16.5 forge_version=36.2.2 -mod_version=1605.2.0 -maven_group=dev.latvian.mods -archives_base_name=projectex +mod_version=1605.2.1 +maven_group=dev.ftb.mods +archives_base_name=ftb-projectex mod_id=projectex mod_author=LatvianModder curseforge_id=311378 curseforge_type=alpha -projecte_file=3223221 +projecte_file=3736621 jei_file=3192904 \ No newline at end of file diff --git a/src/main/java/dev/latvian/mods/projectex/EMCSyncHandler.java b/src/main/java/dev/latvian/mods/projectex/EMCSyncHandler.java new file mode 100644 index 0000000..1e57df9 --- /dev/null +++ b/src/main/java/dev/latvian/mods/projectex/EMCSyncHandler.java @@ -0,0 +1,46 @@ +package dev.latvian.mods.projectex; + +import moze_intel.projecte.api.ProjectEAPI; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.fml.server.ServerLifecycleHooks; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * Track players who need their EMC value sync'd, and do it in a controlled fashion once a second instead of every time + * an EMC link block does anything. Avoids excessive sync'ing and performance issues with many such blocks in the world. + */ +public enum EMCSyncHandler { + INSTANCE; + + private final Set toSync = new HashSet<>(); // UUID of players who need EMC sync'd + private int counter = 0; + + public void needsSync(ServerPlayer player) { + toSync.add(player.getUUID()); + } + + public void needsSync(UUID playerId) { + toSync.add(playerId); + } + + public void onServerTick(TickEvent.ServerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + counter++; + if (counter == 20) { + MinecraftServer server = ServerLifecycleHooks.getCurrentServer(); + toSync.stream() + .map(id -> server.getPlayerList().getPlayer(id)) + .filter(player -> player != null && player.isAlive()) + .forEach(player -> player.getCapability(ProjectEAPI.KNOWLEDGE_CAPABILITY) + .ifPresent(provider -> provider.syncEmc(player))); + toSync.clear(); + counter = 0; + } + } + } +} diff --git a/src/main/java/dev/latvian/mods/projectex/ProjectEX.java b/src/main/java/dev/latvian/mods/projectex/ProjectEX.java index ec460d7..3d18285 100644 --- a/src/main/java/dev/latvian/mods/projectex/ProjectEX.java +++ b/src/main/java/dev/latvian/mods/projectex/ProjectEX.java @@ -8,6 +8,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -40,5 +42,8 @@ public ItemStack makeIcon() { //ProjectEXNet.init(); //PROXY.init(); + + IEventBus forgeBus = MinecraftForge.EVENT_BUS; + forgeBus.addListener(EMCSyncHandler.INSTANCE::onServerTick); } } diff --git a/src/main/java/dev/latvian/mods/projectex/block/StoneTableBlock.java b/src/main/java/dev/latvian/mods/projectex/block/StoneTableBlock.java index d3f41c2..1547560 100644 --- a/src/main/java/dev/latvian/mods/projectex/block/StoneTableBlock.java +++ b/src/main/java/dev/latvian/mods/projectex/block/StoneTableBlock.java @@ -73,9 +73,7 @@ public BlockState getStateForPlacement(BlockPlaceContext ctx) { @Deprecated public InteractionResult use(@Nonnull BlockState state, Level world, @Nonnull BlockPos pos, @Nonnull Player player, @Nonnull InteractionHand hand, @Nonnull BlockHitResult rtr) { if (!world.isClientSide) { - NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(), (b) -> { - b.writeEnum(InteractionHand.OFF_HAND); - }); + NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(), b -> b.writeBoolean(false)); } return InteractionResult.SUCCESS; @@ -95,7 +93,7 @@ private ContainerProvider() { @Override public AbstractContainerMenu createMenu(int windowId, @Nonnull Inventory playerInventory, @Nonnull Player player) { - return new TransmutationContainer(windowId, playerInventory, InteractionHand.OFF_HAND); + return new TransmutationContainer(windowId, playerInventory); } @Override diff --git a/src/main/java/dev/latvian/mods/projectex/block/entity/LinkBaseBlockEntity.java b/src/main/java/dev/latvian/mods/projectex/block/entity/LinkBaseBlockEntity.java index 108b1e8..ec2e757 100644 --- a/src/main/java/dev/latvian/mods/projectex/block/entity/LinkBaseBlockEntity.java +++ b/src/main/java/dev/latvian/mods/projectex/block/entity/LinkBaseBlockEntity.java @@ -1,5 +1,6 @@ package dev.latvian.mods.projectex.block.entity; +import dev.latvian.mods.projectex.EMCSyncHandler; import moze_intel.projecte.api.ProjectEAPI; import moze_intel.projecte.api.capabilities.IKnowledgeProvider; import moze_intel.projecte.api.capabilities.tile.IEmcStorage; @@ -77,7 +78,7 @@ public void tick() { provider.setEmc(provider.getEmc().add(storedEMC)); storedEMC = BigInteger.ZERO; setChanged(); - provider.syncEmc(player); + EMCSyncHandler.INSTANCE.needsSync(player); } } } diff --git a/src/main/java/dev/latvian/mods/projectex/block/entity/PowerFlowerBlockEntity.java b/src/main/java/dev/latvian/mods/projectex/block/entity/PowerFlowerBlockEntity.java index 2f6ae58..3a3b3cf 100644 --- a/src/main/java/dev/latvian/mods/projectex/block/entity/PowerFlowerBlockEntity.java +++ b/src/main/java/dev/latvian/mods/projectex/block/entity/PowerFlowerBlockEntity.java @@ -1,5 +1,6 @@ package dev.latvian.mods.projectex.block.entity; +import dev.latvian.mods.projectex.EMCSyncHandler; import dev.latvian.mods.projectex.block.PowerFlowerBlock; import moze_intel.projecte.api.ProjectEAPI; import moze_intel.projecte.api.capabilities.IKnowledgeProvider; @@ -80,7 +81,7 @@ public void tick() { setChanged(); } - provider.syncEmc(player); + EMCSyncHandler.INSTANCE.needsSync(player); } else { storedEMC = storedEMC.add(BigInteger.valueOf(gen)); setChanged(); diff --git a/src/main/java/dev/latvian/mods/projectex/item/ArcaneTabletItem.java b/src/main/java/dev/latvian/mods/projectex/item/ArcaneTabletItem.java index 9199f9e..629a7c7 100644 --- a/src/main/java/dev/latvian/mods/projectex/item/ArcaneTabletItem.java +++ b/src/main/java/dev/latvian/mods/projectex/item/ArcaneTabletItem.java @@ -34,7 +34,11 @@ public ArcaneTabletItem() { @Nonnull public InteractionResultHolder use(@Nonnull Level world, @Nonnull Player player, @Nonnull InteractionHand hand) { if (!world.isClientSide) { - NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(hand), (buf) -> buf.writeEnum(hand)); + NetworkHooks.openGui((ServerPlayer) player, new ContainerProvider(), b -> { + b.writeBoolean(true); + b.writeEnum(hand); + b.writeByte(player.inventory.selected); + }); } return InteractionResultHolder.success(player.getItemInHand(hand)); @@ -48,15 +52,13 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List use(Level level, Player player, Intera if (!level.isClientSide() && player.isCrouching()) { IKnowledgeProvider provider = player.getCapability(ProjectEAPI.KNOWLEDGE_CAPABILITY).orElse(null); provider.setEmc(BigInteger.ZERO); - provider.syncEmc((ServerPlayer) player); + EMCSyncHandler.INSTANCE.needsSync((ServerPlayer) player); return InteractionResultHolder.success(player.getItemInHand(hand)); } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index be0f79f..a4300a7 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -30,6 +30,6 @@ side = "BOTH" [[dependencies.projectex]] modId = "projecte" mandatory = true -versionRange = "*" +versionRange = "[PE1.0.2,)" ordering = "AFTER" side = "BOTH" \ No newline at end of file