diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5a8e640..ba74bd4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -21,25 +21,44 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - with: - fetch-depth: 0 - fetch-tags: true - - name: Setup JDK 21 + - name: Setup JDK uses: actions/setup-java@v4 with: - java-version: '21' + java-version: '17' distribution: 'temurin' - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 + with: + gradle-version: '8.4' + + - name: Test Server + run: gradle runGameTestServer + continue-on-error: true - name: Build with Gradle - run: | - gradle wrapper --gradle-version 7.6.4 - gradle build + run: gradle build + + - name: Create timestamp + id: create_timestamp + run: echo "timestamp=$(date '+%Y-%m-%d-%H-%M-%S')" >> $GITHUB_OUTPUT + shell: bash - uses: Kir-Antipov/mc-publish@v3.3 with: github-token: ${{ secrets.GITHUB_TOKEN }} - github-tag: 1.19.2-Forge \ No newline at end of file + github-tag: 1.19.2-Forge-${{ steps.create_timestamp.outputs.timestamp }} + github-draft: false + github-prerelease: false + + - uses: actions/upload-artifact@v4 + with: + overwrite: true + include-hidden-files: true + path: | + **/logs/ + **/crash-reports/ + build/libs + retention-days: 7 + if: always() \ No newline at end of file diff --git a/.gitignore b/.gitignore index 19d9742..7ef1900 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /run/ +/1.19.2-run/ /.vscode/ /.idea/ /bin/ diff --git a/README.md b/README.md index 9921b4e..91cd08b 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,6 @@ If you want to download code on your computer, please change gradle version in ` - [x] Support 1.21.1 - [ ] Transplant all stuff to 1.20.1 and 1.21.1 ## License -[MIT_License](https://mit-license.org/) \ No newline at end of file +[MIT_License](https://mit-license.org/) +## Thanks +Thanks to [KAllFix](https://center.mcmod.cn/170204/) improves the code and offer me help. \ No newline at end of file diff --git a/build.gradle b/build.gradle index a1437ee..d2105a0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,24 @@ buildscript { repositories { // These repositories are only for Gradle plugins, put any other repositories in the repository overlays further below + maven { url = 'https://maven.parchmentmc.org' } maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + maven { url = 'https://maven.minecraftforge.net' } + mavenLocal() mavenCentral() } dependencies { + classpath "net.minecraftforge.gradle:ForgeGradle:5.1.74" classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' + classpath "org.parchmentmc:librarian:1.+" } } plugins { id 'eclipse' id 'idea' - id 'net.minecraftforge.gradle' version '[6.0.16,6.2)' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' id 'org.parchmentmc.librarian.forgegradle' version '1.+' } @@ -73,7 +79,7 @@ minecraft { runs { // applies to all the run configs below configureEach { - workingDirectory project.file('run') + workingDirectory project.file('1.19.2-run') // Recommended logging data for a userdev environment // The markers can be added/remove as needed separated by commas. @@ -103,6 +109,7 @@ minecraft { server { property 'forge.enabledGameTestNamespaces', mod_id args '--nogui' + workingDirectory project.file('1.19.2-run/server') } // This run config launches GameTestServer and runs all registered gametests, then exits. @@ -166,7 +173,6 @@ dependencies { runtimeOnly fg.deobf("curse.maven:mekanism-268560:4644795") runtimeOnly fg.deobf("curse.maven:cyclops-core-232758:4681659") runtimeOnly fg.deobf("curse.maven:capabilityproxy-266479:3929855") - runtimeOnly fg.deobf("curse.maven:toms-storage-378609:4649846") compileOnly fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}") implementation fg.deobf("curse.maven:create-328085:4835190") implementation fg.deobf("curse.maven:storage-drawers-223852:5648923") diff --git a/gradle.properties b/gradle.properties index 7032685..637aa01 100644 --- a/gradle.properties +++ b/gradle.properties @@ -42,7 +42,7 @@ mod_name=SmarterContraptionStorage # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT_License # The mod version. See https://semver.org/ -mod_version=1.19.2-1.3.1 +mod_version=1.19.2-1.3.2 # The group ID for the mod. It is only important when publishing as an artifact to Excludes.BuildNBTFile Maven repository. # This should match the base package used for the mod sources. # See https://maven.apache.org/guides/mini/guide-naming-conventions.html diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 35b5984..423f0c6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip -# Should change to 7.* (for example 7.6.4), but for no reason I couldn't download this version on my computer even 8.* can use. +distributionUrl=https:\//mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/HelperMenuProvider.java b/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/HelperMenuProvider.java index 6dd2600..8efbaf1 100644 --- a/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/HelperMenuProvider.java +++ b/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/HelperMenuProvider.java @@ -71,6 +71,7 @@ public interface HelperMenuProvider extends Cont ContraptionMenuProvider.super.error(); } + @OnlyIn(Dist.CLIENT) > U createScreen(MovingBlockEntityMenu menu, Inventory inventory, Component component); default void writeToBuffer(@NotNull FriendlyByteBuf buffer) { diff --git a/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/MenuLevel.java b/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/MenuLevel.java index a347624..7d1ace4 100644 --- a/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/MenuLevel.java +++ b/src/main/java/net/smartercontraptionstorage/AddStorage/GUI/BlockEntityMenu/MenuLevel.java @@ -3,8 +3,11 @@ package net.smartercontraptionstorage.AddStorage.GUI.BlockEntityMenu; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.client.Minecraft; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.smartercontraptionstorage.Message.MenuLevelPacket; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; @@ -25,10 +28,10 @@ public class MenuLevel extends WrappedWorld { private static Level tickingLevel; - public static MenuLevel level = new MenuLevel(); + private static ClientMenuLevel clientLevel = null; - private MenuLevel() { - super(Minecraft.getInstance().level); + private MenuLevel(Level level) { + super(level); } public static Map, BlockEntity> getBlocks(){ @@ -59,26 +62,35 @@ public class MenuLevel extends WrappedWorld { return blocks.get(pair); } - public static MenuLevel tickingBlockEntity(Pair pair,boolean isClient) { + private static MenuLevel clientLevel(){ + if(clientLevel == null){ + clientLevel = new ClientMenuLevel(); + } + return clientLevel.clientLevel; + } + + public static MenuLevel level(Level level) { + if(level.isClientSide()) { + return clientLevel(); + } + else if(level instanceof ServerLevel){ + return new MenuLevel(level); + }else throw new RuntimeException("Open menu get null server level !"); + } + + public static MenuLevel tickingBlockEntity(Pair pair,Level level){ if(tickingBlockEntity != null){ tickingBlockEntity.setLevel(tickingLevel); } if(blocks.containsKey(pair)) { tickingBlockEntity = blocks.get(pair); tickingLevel = tickingBlockEntity.getLevel(); - tickingBlockEntity.setLevel(level); + MenuLevel menuLevel = level(level); + tickingBlockEntity.setLevel(menuLevel); + return menuLevel; } else { - tickingBlockEntity = null; - tickingLevel = null; + throw new IllegalArgumentException("Pair is not found ! Pair: " + pair); } - level.isClientSide = isClient; - return level; - } - - public static MenuLevel tickingBlockEntity(Pair pair,Level level){ - MenuLevel value = tickingBlockEntity(pair, level.isClientSide()); - tickingLevel = level; - return value; } private static void setTickingBlockEntity(BlockEntity blockEntity){ @@ -107,4 +119,9 @@ public class MenuLevel extends WrappedWorld { entityIn.level = tickingLevel; return tickingLevel.addFreshEntity(entityIn); } + + private static class ClientMenuLevel{ + @OnlyIn(Dist.CLIENT) + protected MenuLevel clientLevel = new MenuLevel(Minecraft.getInstance().level); + } } \ No newline at end of file diff --git a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SBackPacksHandlerHelper.java b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SBackPacksHandlerHelper.java index 4ff8e5c..977cf9e 100644 --- a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SBackPacksHandlerHelper.java +++ b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SBackPacksHandlerHelper.java @@ -15,6 +15,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemStackHandler; import net.p3pp3rf1y.sophisticatedbackpacks.backpack.BackpackBlock; import net.p3pp3rf1y.sophisticatedbackpacks.backpack.BackpackBlockEntity; @@ -106,7 +108,7 @@ public class SBackPacksHandlerHelper extends StorageHandlerHelper implements Hel return MenuLevel.levelRun((setter) -> { setter.accept(getBlockEntity()); Level level = player.level; - player.level = MenuLevel.level; + player.level = MenuLevel.level(level); BackpackContainer container = new BackpackContainer(i, player, new BackpackContext.Block(getBlockEntity().getBlockPos())); player.level = level; return container; @@ -118,6 +120,7 @@ public class SBackPacksHandlerHelper extends StorageHandlerHelper implements Hel return menu.getMenu() instanceof BackpackContainer; } + @OnlyIn(Dist.CLIENT) @Override public BackpackScreen createScreen(MovingBlockEntityMenu menu, Inventory inventory, Component component) { return new BackpackScreen((BackpackContainer) menu.getMenu(), inventory, component); diff --git a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SStorageBlockHelper.java b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SStorageBlockHelper.java index d1528ef..3df6e0c 100644 --- a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SStorageBlockHelper.java +++ b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/SStorageBlockHelper.java @@ -13,6 +13,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemStackHandler; import net.p3pp3rf1y.sophisticatedcore.inventory.InventoryHandler; import net.p3pp3rf1y.sophisticatedcore.util.BlockItemBase; @@ -111,7 +113,7 @@ public class SStorageBlockHelper extends StorageHandlerHelper implements HelperM if(getPair() != null) { MenuLevel.tickingBlockEntity(getPair(),player.level); Level level = player.level; - player.level = MenuLevel.level; + player.level = MenuLevel.level(level); menu = isLimitedBarrelBlock() ? new LimitedBarrelContainerMenu(i, player, getBlockEntity().getBlockPos()) : new StorageContainerMenu(i,player,getBlockEntity().getBlockPos()); player.level = level; } @@ -123,6 +125,7 @@ public class SStorageBlockHelper extends StorageHandlerHelper implements HelperM return isLimitedBarrelBlock() ? menu.getMenu() instanceof LimitedBarrelContainerMenu : menu.getMenu() instanceof StorageContainerMenu; } + @OnlyIn(Dist.CLIENT) @Override public StorageScreen createScreen(MovingBlockEntityMenu menu, Inventory inventory, Component component) { if(isLimitedBarrelBlock()) { diff --git a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/ToolboxHandlerHelper.java b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/ToolboxHandlerHelper.java index 3d47a01..042d3d7 100644 --- a/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/ToolboxHandlerHelper.java +++ b/src/main/java/net/smartercontraptionstorage/AddStorage/ItemHandler/ToolboxHandlerHelper.java @@ -16,6 +16,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.items.ItemStackHandler; import net.smartercontraptionstorage.AddStorage.GUI.BlockEntityMenu.HelperMenuProvider; @@ -124,6 +126,7 @@ public class ToolboxHandlerHelper extends StorageHandlerHelper implements NeedDe return pair; } + @OnlyIn(Dist.CLIENT) @Override public ToolboxScreen createScreen(MovingBlockEntityMenu menu, Inventory inventory, Component component) { return new ToolboxScreen((ToolboxMenu) menu.getMenu(),inventory,component); diff --git a/src/main/java/net/smartercontraptionstorage/Mixin/Contraption/ContraptionMixin.java b/src/main/java/net/smartercontraptionstorage/Mixin/Contraption/ContraptionMixin.java index 547c071..f9ecf79 100644 --- a/src/main/java/net/smartercontraptionstorage/Mixin/Contraption/ContraptionMixin.java +++ b/src/main/java/net/smartercontraptionstorage/Mixin/Contraption/ContraptionMixin.java @@ -138,9 +138,10 @@ public abstract class ContraptionMixin implements Gettable { public void help_deserialize(Level world, CompoundTag nbt, boolean spawnData, CallbackInfo ci){ FunctionChanger.getBlockEntity = (pos) -> { try { + BlockEntity entity; if(spawnData) { BlockPos localPos = toLocalPos(pos); - return presentBlockEntities.get(localPos); + entity = presentBlockEntities.get(localPos); } else { StructureTemplate.StructureBlockInfo info = blocks.get(pos); CompoundTag tag = info.nbt; @@ -148,9 +149,13 @@ public abstract class ContraptionMixin implements Gettable { tag.putInt("x", info.pos.getX()); tag.putInt("y", info.pos.getY()); tag.putInt("z", info.pos.getZ()); - return BlockEntity.loadStatic(info.pos,info.state,tag); + entity = BlockEntity.loadStatic(info.pos,info.state,tag); } else return null; } + if(entity != null){ + entity.setLevel(world); + } + return entity; } catch (Exception e) { return presentBlockEntities.values().stream().filter(blockEntity -> blockEntity.getBlockPos().equals(pos)).findFirst().orElse(null); }