diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a3e19f..31dd0d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,7 @@ jobs: env: CI_BUILD: true PR_BUILD: false + VERSION_TYPE: release steps: - name: checkout uses: actions/checkout@v4 @@ -28,7 +29,7 @@ jobs: uses: christian-draeger/read-properties@1.1.1 with: path: gradle.properties - properties: 'mod_id mod_name java_version upload' + properties: 'mod_id mod_name java_version modrinth_id curseforge_id upload' - name: Setup Java ${{ steps.properties.outputs.java_version }} uses: actions/setup-java@v3.6.0 @@ -59,7 +60,7 @@ jobs: path: build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}.jar - name: Publish to maven - if: ${{ steps.properties.outputs.upload }} + if: ${{ steps.properties.outputs.upload == 'true' }} run: ./gradlew publish env: MAVEN_URL: ${{ secrets.MAVEN_URL }} @@ -71,4 +72,31 @@ jobs: uses: Anvil-Dev/dedicated-server-launch-test@1.21.1-neoforge with: mod: build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}.jar - extra-mods: patchouli:1.21-87-neoforge anvilcraft:1.21.1-1.5.0+pre-release.21 create:1.21.1-6.0.6 + extra-mods: patchouli:1.21-87-neoforge anvilcraft:1.21.1-1.5.2+hotfix.1650 create:1.21.1-6.0.6 + + - name: publish neoforge mc mod + uses: Kir-Antipov/mc-publish@v3.3 + if: ${{ steps.properties.outputs.upload == 'true' }} + continue-on-error: true + with: + name: "${{ steps.properties.outputs.mod_name }} For NeoForge v${{ steps.version.outputs.version }}" + version: ${{ steps.version.outputs.version }} + game-versions: 1.21.1 + version-type: ${{ env.VERSION_TYPE }} + java: 21 + fail-mode: skip + + modrinth-id: ${{ steps.properties.outputs.modrinth_id }} + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + modrinth-featured: true + + curseforge-id: ${{ steps.properties.outputs.curseforge_id }} + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + + dependencies: | + create@mc1.21.1-6.0.6(required){modrinth:LNytGWDc}{curseforge:328085} + anvilcraft@1.21.1-1.5.2+hotfix.1650(required){modrinth:vuISAWPc}{curseforge:986251} + + files: | + build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}.jar + build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}-sources.jar diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b227176..fbd82c4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -86,6 +86,10 @@ jobs: curseforge-id: ${{ steps.properties.outputs.curseforge_id }} curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + dependencies: | + create@mc1.21.1-6.0.6(required){modrinth:LNytGWDc}{curseforge:328085} + anvilcraft@1.21.1-1.5.2+hotfix.1650(required){modrinth:vuISAWPc}{curseforge:986251} + files: | build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}.jar build/libs/${{ steps.properties.outputs.mod_id }}-neoforge-${{ steps.version.outputs.version }}-sources.jar diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..c54c228 --- /dev/null +++ b/README.en.md @@ -0,0 +1,179 @@ +# AnvilCraft Create Addition + +English | [中文](./README.md) + +## Introduction + +AnvilCraft Create Addition is an extension mod designed for the NeoForge modding ecosystem. It provides deep integration between **AnvilCraft** and **Create**, two excellent mods, offering players new possibilities for mechanical crafting, power transmission, and magical enchantments. + +## Mod Features + +### Core Functionality + +- **Cogwheel Amulet**: A unique item combining Create's precision mechanisms with AnvilCraft's amulet system +- **Create Mod Integration**: Deep integration with Create Mod, providing richer power and mechanical solutions +- **Amulet System Extension**: Extends AnvilCraft's amulet functionality through an amulet type system +- **Batch Crafter Unpacking**: Advanced unpacking solutions for Create's batch processing machines +- **Boiler Heater**: Additional boiler heating mechanisms +- **A new way of generating electricity**: Learn about the Faraday Disk Generator. + +### Key Features + +✨ **Deep Mod Integration** - Seamless fusion of AnvilCraft and Create mod features + +⚙️ **Power System Extension** - New power transmission and stress management mechanisms + +🛠️ **Crafting Enhancement** - More synthesis methods and crafting possibilities + +🎨 **Beautiful Design** - Carefully designed item and block aesthetics + +## Technical Information + +### Versions + +- **Mod Version**: 1.0.0 +- **Minecraft Version**: 1.21.1 +- **NeoForge Version**: 21.1.152+ +- **Java Version**: 21+ + +### Core Dependencies + +- **AnvilCraft**: 1.5.2+hotfix.1650 +- **Create**: 6.0.6-107 +- **AnvilLib**: 1.4.0+build.172 +- **Flywheel**: 1.0.4-30 +- **Ponder**: 1.0.56 + +## Installation Guide + +### Requirements + +1. **Minecraft**: 1.21.1 +2. **NeoForge**: 21.1.152 or higher +3. **Required Mods**: + - AnvilCraft + - Create + - AnvilLib (usually provided by AnvilCraft) + +### Installation Steps + +1. Download the latest `.jar` file +2. Place the JAR file in your `mods` folder +3. Ensure all required prerequisite mods are installed +4. Launch the game + +## Configuration + +The mod configuration file is located at `config/anvilcraft_create_addition-common.toml` + +### Configuration Options + +```toml +# The ratio of the relative linear speed of the copper block and the magnet +# to the amount of charge generated +chargeGeneratedEfficiency = 0.72 + +# The mysterious coefficient, perhaps related to the stress required by the generator +stressDissipationCoefficient = 1.76 +``` + +## Project Structure + +``` +AnvilCraft-Create-Addition/ +├── src/main/ +│ ├── java/dev/anvilcraft/addon/create/ +│ │ ├── init/ # Initialization modules (items, blocks, amulets, etc.) +│ │ ├── integration/ # Integration with other mods +│ │ ├── client/ # Client-side code +│ │ ├── data/ # Data generation +│ │ └── util/ # Utility classes +│ └── resources/ # Resource files +├── gradle/ # Gradle configuration +├── build.gradle # Build configuration +└── dependencies.gradle # Dependency definitions +``` + +## Development + +### Environment Setup + +This project uses **Gradle** as the build system and **NeoForge** as the mod loader. + +### Building the Project + +```bash +# Generate IDE configurations +./gradlew genSources + +# Build the mod +./gradlew build + +# Run development server +./gradlew runServer + +# Run development client +./gradlew runClient +``` + +### Code Style + +- Uses **Lombok** library to reduce boilerplate code +- Follows Java naming conventions +- Leverages Java 21 features + +## License + +### Code + +The code in this project is licensed under [LGPL-3.0](./LICENSE) by default. + +### Assets + +Non-code assets (such as textures, models, etc.) are licensed under [ASSET_LICENSE](./ASSETS_LICENSE) (ARR). + +## Contributing + +We welcome contributions from the community! If you want to contribute code or report issues: + +1. Fork this repository +2. Create your feature branch (`git checkout -b feature/AmazingFeature`) +3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +## FAQ + +### Q: Can this mod be used standalone? +A: No, this is an extension mod and must be used together with AnvilCraft and Create. + +### Q: Which versions does this mod support? +A: Currently only supports Minecraft 1.21.1 and NeoForge 21.1.152+. + +### Q: How do I report a bug? +A: Please create an Issue in the GitHub repository with detailed steps to reproduce the problem. + +## Related Projects + +- [AnvilCraft](https://github.com/Anvil-Dev/AnvilCraft) - Core crafting and amulet system +- [Create](https://github.com/Creators-of-Create/Create) - Mechanical and power systems +- [AnvilLib](https://github.com/Anvil-Dev/AnvilLib) - Shared library + +## Acknowledgments + +Thanks to the following projects for inspiration and technical support: + +- Create Mod team +- AnvilCraft development team +- Dubhe Studio +- Anvil development team + +## Contact + +- **GitHub**: [AnvilCraft-Create-Addition](https://github.com/Anvil-Dev/AnvilCraft-Create-Addition) +- **Maintainers**: Anvil-Dev Team + +--- + +**Enjoy your game!** 🎮 + diff --git a/README.md b/README.md index b8c511f..5b7914a 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,177 @@ -## 使用许可 +# AnvilCraft Create Addition -* 除非另有说明,否则代码默认许可为 [LICENSE 文件(LGPL-3.0)](./LICENSE) -* 除非另有说明,否则非代码资产默认许可为 [ASSET_LICENSE 文件(ARR)](./ASSETS_LICENSE) +[English](./README.en.md) | 中文 -## License +## 简介 -* Code unless otherwise stated default to our [LICENSE file(LGPL-3.0)](./LICENSE) here -* Non-Code assets (Located here) go by our [ASSET_LICENSE file(ARR)](./ASSETS_LICENSE) here +AnvilCraft Create Addition 是一个为 NeoForge 模组生态系统设计的扩展模组。它将 **AnvilCraft** 和 **Create** 两个优秀的模组深度融合,为玩家提供新的机械加工、动力传输和魔法工艺的可能性。 + +## 模组特性 + +### 核心功能 + +- **齿轮护符(Cogwheel Amulet)**:融合了 Create 精密机械与 AnvilCraft 护符系统的独特道具 +- **Create 模组集成**:与 Create Mod 的深度整合,提供更丰富的动力和机械解决方案 +- **护符系统扩展**:通过护符类型系统扩展 AnvilCraft 的护符功能 +- **批量加工解包**:支持 Create 批处理机器的高级解包方案 +- **锅炉加热器**:提供额外的锅炉加热方案 +- **全新发电方式**:法拉第圆盘发电机了解一下 + +### 主要特点 + +✨ **深度模组融合** - 无缝整合 AnvilCraft 和 Create 两个模组的优秀特性 + +⚙️ **动力系统扩展** - 新增的动力传输和应力管理机制 + +🛠️ **工艺增强** - 更多的合成方式和工艺可能性 + +🎨 **美观设计** - 精心设计的物品和方块外观 + +## 技术信息 + +### 版本 + +- **模组版本**: 1.0.0 +- **Minecraft 版本**: 1.21.1 +- **NeoForge 版本**: 21.1.152+ +- **Java 版本**: 21+ + +### 核心依赖 + +- **AnvilCraft**: 1.5.2+hotfix.1650 +- **Create**: 6.0.6-107 +- **AnvilLib**: 1.4.0+build.172 +- **Flywheel**: 1.0.4-30 +- **Ponder**: 1.0.56 + +## 安装指南 + +### 前置要求 + +1. **Minecraft**: 1.21.1 +2. **NeoForge**: 21.1.152 或更高版本 +3. **必需模组**: + - AnvilCraft + - Create + - AnvilLib(通常由 AnvilCraft 提供) + +### 安装步骤 + +1. 下载最新的 `.jar` 文件 +2. 将 JAR 文件放入你的 `mods` 文件夹 +3. 确保所有必需的前置模组已安装 +4. 启动游戏 + +## 配置 + +模组配置文件位于 `config/anvilcraft_create_addition-common.toml` + +### 可配置选项 + +```toml +# 相对线速度与充能量的效率比值 +chargeGeneratedEfficiency = 0.72 + +# 神秘系数,可能与发电机所需应力相关 +stressDissipationCoefficient = 1.76 +``` + +## 项目结构 + +``` +AnvilCraft-Create-Addition/ +├── src/main/ +│ ├── java/dev/anvilcraft/addon/create/ +│ │ ├── init/ # 初始化模块(物品、方块、护符等) +│ │ ├── integration/ # 与其他模组的集成 +│ │ ├── client/ # 客户端代码 +│ │ ├── data/ # 数据生成 +│ │ └── util/ # 工具类 +│ └── resources/ # 资源文件 +├── gradle/ # Gradle 配置 +├── build.gradle # 构建配置 +└── dependencies.gradle # 依赖定义 +``` + +## 开发 + +### 环境配置 + +本项目使用 **Gradle** 构建系统,采用 **NeoForge** 作为模组加载器。 + +### 构建项目 + +```bash +# 生成 IDE 配置 +./gradlew genSources + +# 构建模组 +./gradlew build + +# 运行开发服务器 +./gradlew runServer + +# 运行开发客户端 +./gradlew runClient +``` + +### 代码风格 + +- 使用 **Lombok** 库来减少样板代码 +- 遵循 Java 命名规范 +- 使用 Java 21 的特性 + +## 许可证 + +### 代码 + +本项目的代码默认采用 [LGPL-3.0](./LICENSE) 许可证。 + +### 资源 + +非代码资源(如纹理、模型等)采用 [ASSET_LICENSE](./ASSETS_LICENSE) 许可证(ARR)。 + +## 贡献 + +我们欢迎社区的贡献!如果你想贡献代码或报告问题: + +1. Fork 本仓库 +2. 创建你的功能分支 (`git checkout -b feature/AmazingFeature`) +3. 提交你的更改 (`git commit -m 'Add some AmazingFeature'`) +4. 推送到分支 (`git push origin feature/AmazingFeature`) +5. 开启一个 Pull Request + +## 常见问题 + +### Q: 这个模组可以单独使用吗? +A: 不可以,这是一个扩展模组,必须与 AnvilCraft 和 Create 一起使用。 + +### Q: 模组兼容哪些版本? +A: 目前仅支持 Minecraft 1.21.1 和 NeoForge 21.1.152+。 + +### Q: 我发现了一个 bug,怎样报告? +A: 请在 GitHub 仓库中创建一个 Issue,并详细描述问题的复现步骤。 + +## 相关项目 + +- [AnvilCraft](https://github.com/Anvil-Dev/AnvilCraft) - 核心工艺和护符系统 +- [Create](https://github.com/Creators-of-Create/Create) - 机械和动力系统 +- [AnvilLib](https://github.com/Anvil-Dev/AnvilLib) - 共享库 + +## 致谢 + +感谢以下项目的灵感和技术支持: + +- Create Mod 团队 +- AnvilCraft 开发团队 +- Dubhe 工作室 +- Anvil 开发团队 + +## 联系方式 + +- **GitHub**: [AnvilCraft-Create-Addition](https://github.com/Anvil-Dev/AnvilCraft-Create-Addition) +- **维护者**: Anvil-Dev 团队 + +--- + +**祝你游戏愉快!** 🎮 diff --git a/gradle.properties b/gradle.properties index 5a83384..59f4b0d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,8 +15,8 @@ parchment_minecraft_version=1.21.1 parchment_mappings_version=2024.11.17 ## Upload info upload=false -modrinth_id=xxxxx -curseforge_id=xxxxx +modrinth_id=R9QDTexW +curseforge_id=1489968 ## Mod info mod_id=anvilcraft_create_addition mod_name=AnvilCraftCreateAddition diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ec52311..8a243c9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,8 +2,8 @@ minecraft = "1.21.1" neoForge = "21.1.215" registrate = "MC1.21-1.3.0+62" -anvillib = "1.4.0+build.168" -anvilcraft = "1.5.0+pre-release.21" +anvillib = "1.4.0+build.172" +anvilcraft = "1.5.2+hotfix.1650" modDevGradle = "2.0.78" lombok = "8.7.1" create = "6.0.6-107" diff --git a/src/main/java/dev/anvilcraft/addon/create/AnvilCraftCreateAddition.java b/src/main/java/dev/anvilcraft/addon/create/AnvilCraftCreateAddition.java index 3507e12..0c189f5 100644 --- a/src/main/java/dev/anvilcraft/addon/create/AnvilCraftCreateAddition.java +++ b/src/main/java/dev/anvilcraft/addon/create/AnvilCraftCreateAddition.java @@ -1,17 +1,22 @@ package dev.anvilcraft.addon.create; import com.mojang.logging.LogUtils; +import com.simibubi.create.api.boiler.BoilerHeater; +import com.simibubi.create.api.packager.unpacking.UnpackingHandler; import com.tterrag.registrate.Registrate; import dev.anvilcraft.addon.create.data.AdditionDatagen; +import dev.anvilcraft.addon.create.init.AdditionAmuletTypes; import dev.anvilcraft.addon.create.init.AdditionBlocks; import dev.anvilcraft.addon.create.init.AdditionItemGroups; import dev.anvilcraft.addon.create.init.AdditionItems; +import dev.anvilcraft.addon.create.integration.BatchCrafterUnpackingHandler; +import dev.anvilcraft.addon.create.integration.CreateBoilerHeaterProvider; import dev.anvilcraft.lib.config.ConfigManager; +import dev.dubhe.anvilcraft.api.amulet.AmuletManager; import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; -import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @Mod(AnvilCraftCreateAddition.MOD_ID) @@ -24,14 +29,19 @@ public class AnvilCraftCreateAddition { ); public static final Registrate REGISTRATE = Registrate.create(MOD_ID); - public AnvilCraftCreateAddition(@NotNull IEventBus modEventBus, @NotNull ModContainer modContainer) { + public AnvilCraftCreateAddition(IEventBus modEventBus, ModContainer modContainer) { AdditionItemGroups.register(modEventBus); AdditionBlocks.register(); AdditionItems.register(); AdditionDatagen.init(); + AdditionAmuletTypes.register(modEventBus); + BoilerHeater.REGISTRY.registerProvider(new CreateBoilerHeaterProvider()); + //noinspection UnstableApiUsage + UnpackingHandler.REGISTRY.registerProvider(BatchCrafterUnpackingHandler.INSTANCE); + AmuletManager.INSTANCE.registerAmulets(AdditionItems.COGWHEEL_AMULET::get); } - public static @NotNull ResourceLocation of(String path) { + public static ResourceLocation of(String path) { return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); } } diff --git a/src/main/java/dev/anvilcraft/addon/create/client/AnvilCraftCreateAdditionClient.java b/src/main/java/dev/anvilcraft/addon/create/client/AnvilCraftCreateAdditionClient.java index f4fad80..f837f38 100644 --- a/src/main/java/dev/anvilcraft/addon/create/client/AnvilCraftCreateAdditionClient.java +++ b/src/main/java/dev/anvilcraft/addon/create/client/AnvilCraftCreateAdditionClient.java @@ -5,10 +5,9 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; -import org.jetbrains.annotations.NotNull; @Mod(value = AnvilCraftCreateAddition.MOD_ID, dist = Dist.CLIENT) public class AnvilCraftCreateAdditionClient { - public AnvilCraftCreateAdditionClient(@NotNull IEventBus modBus, @NotNull ModContainer container) { + public AnvilCraftCreateAdditionClient(IEventBus modBus, ModContainer container) { } } diff --git a/src/main/java/dev/anvilcraft/addon/create/client/package-info.java b/src/main/java/dev/anvilcraft/addon/create/client/package-info.java new file mode 100644 index 0000000..ffb4671 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/client/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.client; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/data/lang/package-info.java b/src/main/java/dev/anvilcraft/addon/create/data/lang/package-info.java new file mode 100644 index 0000000..63c19f9 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/data/lang/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.data.lang; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/data/package-info.java b/src/main/java/dev/anvilcraft/addon/create/data/package-info.java new file mode 100644 index 0000000..6dbab42 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/data/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.data; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/init/AdditionAmuletTypes.java b/src/main/java/dev/anvilcraft/addon/create/init/AdditionAmuletTypes.java new file mode 100644 index 0000000..1e13876 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/init/AdditionAmuletTypes.java @@ -0,0 +1,41 @@ +package dev.anvilcraft.addon.create.init; + +import com.simibubi.create.AllDamageTypes; +import com.simibubi.create.content.kinetics.deployer.DeployerFakePlayer; +import dev.anvilcraft.addon.create.AnvilCraftCreateAddition; +import dev.dubhe.anvilcraft.api.amulet.type.AmuletType; +import dev.dubhe.anvilcraft.init.ModRegistries; +import dev.dubhe.anvilcraft.util.Util; +import net.minecraft.world.damagesource.DamageTypes; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.Optional; + +public class AdditionAmuletTypes { + private static final DeferredRegister REGISTER = DeferredRegister.create(ModRegistries.AMULET_TYPE_KEY, AnvilCraftCreateAddition.MOD_ID); + + public static final DeferredHolder COGWHEEL = REGISTER.register( + "cogwheel", AmuletType.builder() + .obtainByDamage( + AllDamageTypes.CRUSH, + AllDamageTypes.CUCKOO_SURPRISE, + AllDamageTypes.DRILL, + AllDamageTypes.POTATO_CANNON, + AllDamageTypes.ROLLER, + AllDamageTypes.RUN_OVER, + AllDamageTypes.SAW + ) + .obtainOr((player, source) -> source.typeHolder().is(DamageTypes.PLAYER_ATTACK) && Optional.ofNullable(source.getEntity()) + .map(entity -> Util.instanceOfAny(entity, DeployerFakePlayer.class)) + .orElse(false)) + .immuneDamageFromObtain() + .amulet(AdditionItems.COGWHEEL_AMULET) + ::build + ); + + public static void register(IEventBus bus) { + REGISTER.register(bus); + } +} diff --git a/src/main/java/dev/anvilcraft/addon/create/init/AdditionItems.java b/src/main/java/dev/anvilcraft/addon/create/init/AdditionItems.java index e14e02d..0f661a8 100644 --- a/src/main/java/dev/anvilcraft/addon/create/init/AdditionItems.java +++ b/src/main/java/dev/anvilcraft/addon/create/init/AdditionItems.java @@ -1,12 +1,45 @@ package dev.anvilcraft.addon.create.init; -import dev.dubhe.anvilcraft.AnvilCraft; +import com.simibubi.create.AllItems; +import com.tterrag.registrate.util.entry.ItemEntry; +import dev.dubhe.anvilcraft.api.amulet.type.AmuletType; +import dev.dubhe.anvilcraft.init.item.ModItemGroups; +import dev.dubhe.anvilcraft.init.item.ModItems; +import dev.dubhe.anvilcraft.item.amulet.AmuletItem; +import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe; +import net.minecraft.core.Holder; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.conditions.ModLoadedCondition; + +import static dev.anvilcraft.addon.create.AnvilCraftCreateAddition.REGISTRATE; + public class AdditionItems { static { - AnvilCraft.REGISTRATE.defaultCreativeTab(AdditionItemGroups.ADDON_ITEMS.getKey()); + REGISTRATE.defaultCreativeTab(AdditionItemGroups.ADDON_ITEMS.getKey()); } + public static final ItemEntry COGWHEEL_AMULET = REGISTRATE + .item( + "cogwheel_amulet", + properties -> new AmuletItem(properties) { + @Override + public Holder getType() { + return AdditionAmuletTypes.COGWHEEL; + } + } + ) + .properties(properties -> properties.stacksTo(1)) + .removeTab(ModItemGroups.ANVILCRAFT_INGREDIENTS.getKey()) + .recipe((ctx, provider) -> JewelCraftingRecipe.builder() + .withCondition(new ModLoadedCondition("create")) + .requires(ModItems.SILVER_INGOT, 1) + .requires(AllItems.PRECISION_MECHANISM, 16) + .result(new ItemStack(ctx.get())) + .save(provider) + ) + .register(); + public static void register() { } } diff --git a/src/main/java/dev/anvilcraft/addon/create/init/package-info.java b/src/main/java/dev/anvilcraft/addon/create/init/package-info.java new file mode 100644 index 0000000..612b59b --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/init/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.init; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/integration/BatchCrafterUnpackingHandler.java b/src/main/java/dev/anvilcraft/addon/create/integration/BatchCrafterUnpackingHandler.java index f412d0f..7dc9454 100644 --- a/src/main/java/dev/anvilcraft/addon/create/integration/BatchCrafterUnpackingHandler.java +++ b/src/main/java/dev/anvilcraft/addon/create/integration/BatchCrafterUnpackingHandler.java @@ -19,7 +19,7 @@ import java.util.List; @SuppressWarnings("UnstableApiUsage") -public class BatchCrafterUnpackingHandler implements UnpackingHandler { +public class BatchCrafterUnpackingHandler implements UnpackingHandler, SimpleRegistry.Provider { public static final UnpackingHandler DEFAULT = (level, pos, state, side, items, orderContext, simulate) -> { BlockEntity targetBE = level.getBlockEntity(pos); if (!(targetBE instanceof BatchCrafterBlockEntity batchCrafter)) { @@ -120,14 +120,11 @@ public boolean unpack( return false; } - public static class Provider implements SimpleRegistry.Provider { - - @Override - public @Nullable UnpackingHandler get(Block object) { - if (object == ModBlocks.BATCH_CRAFTER.get()) { - return INSTANCE; - } - return null; + @Override + public @Nullable UnpackingHandler get(Block object) { + if (object == ModBlocks.BATCH_CRAFTER.get()) { + return INSTANCE; } + return null; } } diff --git a/src/main/java/dev/anvilcraft/addon/create/integration/CreateBoilerHeaterProvider.java b/src/main/java/dev/anvilcraft/addon/create/integration/CreateBoilerHeaterProvider.java new file mode 100644 index 0000000..581a077 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/integration/CreateBoilerHeaterProvider.java @@ -0,0 +1,47 @@ +package dev.anvilcraft.addon.create.integration; + +import com.simibubi.create.api.boiler.BoilerHeater; +import com.simibubi.create.api.registry.SimpleRegistry; +import dev.dubhe.anvilcraft.block.HeaterBlock; +import dev.dubhe.anvilcraft.block.heatable.GlowingBlock; +import dev.dubhe.anvilcraft.block.heatable.IncandescentBlock; +import dev.dubhe.anvilcraft.block.heatable.RedhotBlock; +import dev.dubhe.anvilcraft.init.block.ModBlocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +public class CreateBoilerHeaterProvider implements SimpleRegistry.Provider { + private static final BoilerHeater HEATER = CreateBoilerHeaterProvider::heater; + private static final BoilerHeater REDHOT = new ConstantValueHeater(1); + private static final BoilerHeater GLOWING = new ConstantValueHeater(2); + private static final BoilerHeater INCANDESCENT = new ConstantValueHeater(3); + + private static float heater(Level level, BlockPos blockPos, BlockState blockState) { + if (blockState.is(ModBlocks.HEATER) && !blockState.getValue(HeaterBlock.OVERLOAD)) { + return 1; + } + return -1; + } + + @Override + public @Nullable BoilerHeater get(Block block) { + return switch (block) { + case HeaterBlock ignored -> HEATER; + case IncandescentBlock ignored -> INCANDESCENT; + case GlowingBlock ignored -> GLOWING; + case RedhotBlock ignored -> REDHOT; + default -> null; + }; + } + + private record ConstantValueHeater(float level) implements BoilerHeater { + + @Override + public float getHeat(Level level, BlockPos blockPos, BlockState blockState) { + return this.level; + } + } +} diff --git a/src/main/java/dev/anvilcraft/addon/create/integration/CreateIntegration.java b/src/main/java/dev/anvilcraft/addon/create/integration/CreateIntegration.java deleted file mode 100644 index 2383ae6..0000000 --- a/src/main/java/dev/anvilcraft/addon/create/integration/CreateIntegration.java +++ /dev/null @@ -1,137 +0,0 @@ -package dev.anvilcraft.addon.create.integration; - -import com.simibubi.create.AllDamageTypes; -import com.simibubi.create.AllItems; -import com.simibubi.create.api.boiler.BoilerHeater; -import com.simibubi.create.api.packager.unpacking.UnpackingHandler; -import com.simibubi.create.api.registry.SimpleRegistry; -import com.simibubi.create.content.kinetics.deployer.DeployerFakePlayer; -import com.tterrag.registrate.util.entry.ItemEntry; -import dev.anvilcraft.lib.integration.Integration; -import dev.dubhe.anvilcraft.AnvilCraft; -import dev.dubhe.anvilcraft.api.amulet.AmuletManager; -import dev.dubhe.anvilcraft.api.amulet.type.AmuletType; -import dev.dubhe.anvilcraft.block.HeaterBlock; -import dev.dubhe.anvilcraft.block.heatable.GlowingBlock; -import dev.dubhe.anvilcraft.block.heatable.IncandescentBlock; -import dev.dubhe.anvilcraft.block.heatable.RedhotBlock; -import dev.dubhe.anvilcraft.init.ModRegistries; -import dev.dubhe.anvilcraft.init.block.ModBlocks; -import dev.dubhe.anvilcraft.init.item.ModItemGroups; -import dev.dubhe.anvilcraft.init.item.ModItems; -import dev.dubhe.anvilcraft.item.amulet.AmuletItem; -import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe; -import dev.dubhe.anvilcraft.util.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.world.damagesource.DamageTypes; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.common.conditions.ModLoadedCondition; -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; -import net.neoforged.neoforge.registries.DeferredHolder; -import net.neoforged.neoforge.registries.DeferredRegister; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; - -import static dev.dubhe.anvilcraft.AnvilCraft.REGISTRATE; - -@Integration("create") -public class CreateIntegration { - private static final BoilerHeater HEATER = CreateIntegration::heater; - private static final BoilerHeater REDHOT = new ConstantValueHeater(1); - private static final BoilerHeater GLOWING = new ConstantValueHeater(2); - private static final BoilerHeater INCANDESCENT = new ConstantValueHeater(3); - private static final DeferredRegister REGISTER = DeferredRegister.create(ModRegistries.AMULET_TYPE_KEY, AnvilCraft.MOD_ID); - - private static float heater(Level level, BlockPos blockPos, BlockState blockState) { - if (blockState.is(ModBlocks.HEATER) && !blockState.getValue(HeaterBlock.OVERLOAD)) { - return 1; - } - return -1; - } - - @SuppressWarnings("UnstableApiUsage") - public void apply() { - BoilerHeater.REGISTRY.registerProvider(new MyProvider()); - AnvilCraft.MOD_BUS.addListener(this::registerToTab); - UnpackingHandler.REGISTRY.registerProvider(new BatchCrafterUnpackingHandler.Provider()); - REGISTER.register(AnvilCraft.MOD_BUS); - AmuletManager.INSTANCE.registerAmulets(COGWHEEL_AMULET::get); - } - - private void registerToTab(BuildCreativeModeTabContentsEvent event) { - if (event.getTabKey().equals(ModItemGroups.ANVILCRAFT_TOOL.getKey())) { - event.insertAfter( - ModItems.ANVIL_AMULET.asStack(), - COGWHEEL_AMULET.asStack(), - CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS - ); - } - } - - private static class MyProvider implements SimpleRegistry.Provider { - @Override - public @Nullable BoilerHeater get(Block block) { - return switch (block) { - case HeaterBlock ignored -> HEATER; - case IncandescentBlock ignored -> INCANDESCENT; - case GlowingBlock ignored -> GLOWING; - case RedhotBlock ignored -> REDHOT; - default -> null; - }; - } - } - - private record ConstantValueHeater(float level) implements BoilerHeater { - - @Override - public float getHeat(Level level, BlockPos blockPos, BlockState blockState) { - return this.level; - } - } - - public static final ItemEntry COGWHEEL_AMULET = REGISTRATE - .item( - "cogwheel_amulet", - properties -> new AmuletItem(properties) { - @Override - public Holder getType() { - return COGWHEEL; - } - } - ) - .properties(properties -> properties.stacksTo(1)) - .removeTab(ModItemGroups.ANVILCRAFT_INGREDIENTS.getKey()) - .recipe((ctx, provider) -> JewelCraftingRecipe.builder() - .withCondition(new ModLoadedCondition("create")) - .requires(ModItems.SILVER_INGOT, 1) - .requires(AllItems.PRECISION_MECHANISM, 16) - .result(new ItemStack(ctx.get())) - .save(provider) - ) - .register(); - - private static final DeferredHolder COGWHEEL = REGISTER.register( - "cogwheel", AmuletType.builder() - .obtainByDamage( - AllDamageTypes.CRUSH, - AllDamageTypes.CUCKOO_SURPRISE, - AllDamageTypes.DRILL, - AllDamageTypes.POTATO_CANNON, - AllDamageTypes.ROLLER, - AllDamageTypes.RUN_OVER, - AllDamageTypes.SAW - ) - .obtainOr((player, source) -> source.typeHolder().is(DamageTypes.PLAYER_ATTACK) && Optional.ofNullable(source.getEntity()) - .map(entity -> Util.instanceOfAny(entity, DeployerFakePlayer.class)) - .orElse(false)) - .immuneDamageFromObtain() - .amulet(COGWHEEL_AMULET) - ::build - ); -} diff --git a/src/main/java/dev/anvilcraft/addon/create/mixin/MechanicalBearingBlockEntityMixin.java b/src/main/java/dev/anvilcraft/addon/create/mixin/MechanicalBearingBlockEntityMixin.java index 83a0455..33b07f4 100644 --- a/src/main/java/dev/anvilcraft/addon/create/mixin/MechanicalBearingBlockEntityMixin.java +++ b/src/main/java/dev/anvilcraft/addon/create/mixin/MechanicalBearingBlockEntityMixin.java @@ -13,6 +13,8 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import javax.annotation.Nullable; + /** * Mixin类用于修改 {@link MechanicalBearingBlockEntity} 的行为。 * 此类通过继承 {@link GeneratingKineticBlockEntity} 并实现接口来扩展原版逻辑, @@ -28,7 +30,7 @@ abstract class MechanicalBearingBlockEntityMixin extends GeneratingKineticBlockE * @return 被带动的机械装置实体,可能为null */ @Shadow - public abstract ControlledContraptionEntity getMovedContraption(); + public abstract @Nullable ControlledContraptionEntity getMovedContraption(); /** * 构造一个新的 {@code MechanicalBearingBlockEntityMixin} 实例。 diff --git a/src/main/java/dev/anvilcraft/addon/create/mixin/package-info.java b/src/main/java/dev/anvilcraft/addon/create/mixin/package-info.java new file mode 100644 index 0000000..7a1e53a --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/mixin/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.mixin; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/package-info.java b/src/main/java/dev/anvilcraft/addon/create/package-info.java new file mode 100644 index 0000000..2ea4e84 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/dev/anvilcraft/addon/create/util/ChargeMovementBehaviour.java b/src/main/java/dev/anvilcraft/addon/create/util/ChargeMovementBehaviour.java index 0f6f71e..be99b6e 100644 --- a/src/main/java/dev/anvilcraft/addon/create/util/ChargeMovementBehaviour.java +++ b/src/main/java/dev/anvilcraft/addon/create/util/ChargeMovementBehaviour.java @@ -2,22 +2,17 @@ import com.simibubi.create.api.behaviour.movement.MovementBehaviour; import com.simibubi.create.content.contraptions.Contraption; -import com.simibubi.create.content.contraptions.ControlledContraptionEntity; -import com.simibubi.create.content.contraptions.bearing.MechanicalBearingBlockEntity; import com.simibubi.create.content.contraptions.bearing.StabilizedBearingMovementBehaviour; import com.simibubi.create.content.contraptions.behaviour.MovementContext; import dev.anvilcraft.addon.create.AnvilCraftCreateAddition; -import dev.anvilcraft.addon.create.mixin.ContraptionInvoker; import dev.dubhe.anvilcraft.api.chargecollector.ChargeCollectorManager; import dev.dubhe.anvilcraft.init.block.ModBlockTags; import dev.dubhe.anvilcraft.init.block.ModBlocks; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.neoforged.bus.api.SubscribeEvent; @@ -25,7 +20,6 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.event.server.ServerStartedEvent; import org.apache.commons.lang3.tuple.MutablePair; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Unique; @@ -45,7 +39,7 @@ public class ChargeMovementBehaviour implements MovementBehaviour { * @param context 移动上下文对象,包含世界、位置、状态等信息 */ @Override - public void tick(@NotNull MovementContext context) { + public void tick(MovementContext context) { Level level = context.world; double speed = context.motion.length(); BlockPos blockPos = BlockPos.containing(context.position); @@ -67,7 +61,7 @@ public void tick(@NotNull MovementContext context) { * @param blockPos 当前方块的位置 * @param speed 方块移动的速度大小 */ - public void magnetTick(@NotNull ChargeCollectorManager manager, @NotNull Level level, BlockPos blockPos, double speed) { + public void magnetTick(ChargeCollectorManager manager, Level level, BlockPos blockPos, double speed) { // 遍历六个方向查找相邻的金属方块并为其充能 for (Direction direction : Direction.values()) { BlockPos offsetPos = blockPos.relative(direction); @@ -88,7 +82,7 @@ public void magnetTick(@NotNull ChargeCollectorManager manager, @NotNull Level l * @param blockPos 当前方块的位置 * @param speed 方块移动的速度大小 */ - public void metalTick(@NotNull ChargeCollectorManager manager, @NotNull Level level, BlockPos blockPos, double speed) { + public void metalTick(ChargeCollectorManager manager, Level level, BlockPos blockPos, double speed) { // 遍历六个方向寻找相邻的磁铁方块,并将产生的电量传递给附近的集电器 int magnetCount = 0; for (Direction direction : Direction.values()) { @@ -128,7 +122,7 @@ public static void register(ServerStartedEvent event) { registered = true; } - private static @Nullable String registerBlock(@NotNull Block block) { + private static @Nullable String registerBlock(Block block) { MovementBehaviour behaviour = MovementBehaviour.REGISTRY.get(block); if (behaviour != null) { return null; @@ -153,7 +147,7 @@ public static void register(ServerStartedEvent event) { * @param state 方块的状态对象 * @return 如果是金属材料返回true,否则返回false */ - public static boolean isMetal(@NotNull BlockState state) { + public static boolean isMetal(BlockState state) { return state.is(Tags.Blocks.STORAGE_BLOCKS_COPPER) // 铜 || state.is(Tags.Blocks.STORAGE_BLOCKS_IRON) // 铁 || state.is(Tags.Blocks.STORAGE_BLOCKS_GOLD) // 金 @@ -187,7 +181,7 @@ public static boolean isMetal(@NotNull BlockState state) { } @Unique - public static float calculateStressApplied(@NotNull Contraption contraption) { + public static float calculateStressApplied(Contraption contraption) { float coefficient = 0.0f; // 遍历所有活动部件,查找具有ChargeMovementBehaviour的行为,并根据其位置累加系数 for (MutablePair actor : contraption.getActors()) { diff --git a/src/main/java/dev/anvilcraft/addon/create/util/package-info.java b/src/main/java/dev/anvilcraft/addon/create/util/package-info.java new file mode 100644 index 0000000..6e7e0d4 --- /dev/null +++ b/src/main/java/dev/anvilcraft/addon/create/util/package-info.java @@ -0,0 +1,7 @@ +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +package dev.anvilcraft.addon.create.util; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/resources/pack.png b/src/main/resources/pack.png new file mode 100644 index 0000000..979351e Binary files /dev/null and b/src/main/resources/pack.png differ diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml index a2ed8a7..323bcc0 100644 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -25,7 +25,7 @@ displayName = "${mod_name}" #mandatory # A URL for the "homepage" for this mod, displayed in the mod UI displayURL = "https://docs.anvilcraft.dev/" #optional # A file name (in the root of the mod JAR) containing a logo for display -#logoFile="anvilcraft_addon_template.png" #optional +logoFile="pack.png" #optional # A text field displayed in the mod UI #credits="" #optional # A text field displayed in the mod UI