From 8bfd89669f5d809328b71872dccdf23164987c1f Mon Sep 17 00:00:00 2001 From: Anastasia Chrysanthemum Date: Thu, 7 May 2026 02:58:23 +1000 Subject: [PATCH] refactor: Split `instances` submodule into a few submodules. --- .../fabric/build.gradle.kts | 2 +- .../fabric/CowponentsBlockEntitiesFabric.java | 20 ++ .../CowponentsBlockEntitiesClientFabric.java | 18 ++ .../impl/fabric/client/package-info.java | 6 + ...owponentsBlockEntitiesDedicatedFabric.java | 9 + .../fabric/server/dedicated/package-info.java | 6 + .../impl/fabric/server/package-info.java | 6 + .../fabric/src/main/resources/fabric.mod.json | 49 ++++ .../neoforge/build.gradle.kts | 4 +- .../neoforge/CowponentsInstancesNeoForge.java | 21 +- block_entities/xplat/build.gradle.kts | 28 +++ .../api/v1/CowponentsBlockEntityHelper.java | 35 +-- ...tancesDataComponentTypeBuilderWrapper.java | 4 +- ...entsInstancesEntityTypeBuilderWrapper.java | 10 +- .../v1/CowponentsInstancesInheritanceIds.java | 3 +- .../v1/event/CowponentsBlockEntityEvents.java | 16 +- ...entsDefaultBlockEntityComponentEvents.java | 66 ++++++ .../CowponentsBlockEntityComponentHolder.java | 80 +++++++ .../extension/CowponentsBlockEntityType.java | 22 ++ .../impl/CowponentsBlockEntities.java | 18 +- .../client/CowponentsBlockEntitiesClient.java | 8 + ...HolderCowponentsBlockEntityOriginated.java | 11 + .../CowponentsBlockEntitiesEventsImpl.java | 17 +- .../impl/mixin/Mixin_BlockEntity.java | 12 +- .../Mixin_DataComponentInitializers.java | 35 +++ .../CowponentsBlockEntitiesDedicated.java | 8 + .../impl/server/dedicated/package-info.java | 6 + .../BlockEntityComponentHelper.java | 18 +- .../DefaultBlockEntityComponentsImpl.java | 53 +++++ .../resources/cowponents_block_entities.cfg | 0 .../cowponents_block_entities.mixins.json | 13 ++ .../main/kotlin/conventions.loader.gradle.kts | 29 +-- .../main/kotlin/conventions.shared.gradle.kts | 162 +++++++++++++ .../kotlin/conventions.submodule.gradle.kts | 20 ++ .../main/kotlin/conventions.xplat.gradle.kts | 214 +++++++----------- .../cowponents/gradle/ModPlatform.kt | 23 ++ .../cowponents/gradle/Properties.kt | 60 +++-- .../impl/fabric/CowponentsFabric.java | 9 + .../CowponentsPlatformHelperFabric.java | 1 - .../fabric/src/main/resources/fabric.mod.json | 6 - .../CowponentsPlatformHelperNeoForge.java | 24 +- core/xplat/build.gradle.kts | 99 -------- .../network/NetworkableComponentChange.java | 30 +-- .../impl/network}/package-info.java | 2 +- entities/fabric/build.gradle.kts | 37 +++ .../impl/fabric/CowponentsEntitiesFabric.java | 20 +- .../CowponentsEntitiesClientFabric.java | 18 ++ .../impl/fabric/client/package-info.java | 6 + .../entities/impl/fabric}/package-info.java | 2 +- .../CowponentsEntitiesDedicatedFabric.java | 4 +- .../fabric/server/dedicated/package-info.java | 6 + .../impl/fabric/server/package-info.java | 6 + .../cowponents_entities.classtweaker | 0 .../fabric/src/main/resources/fabric.mod.json | 6 +- entities/neoforge/build.gradle.kts | 31 +++ .../neoforge/CowponentsInstancesNeoForge.java | 83 +++++++ .../CowponentsInstancesClientNeoForge.java | 27 +++ .../impl/neoforge}/client/package-info.java | 2 +- .../entities/impl/neoforge}/package-info.java | 2 +- .../CowponentsInstancesDedicatedNeoForge.java | 10 + .../server/dedicated/package-info.java | 6 + .../impl/neoforge/server/package-info.java | 6 + .../resources/META-INF/neoforge.mods.toml | 0 entities/xplat/build.gradle.kts | 29 +++ ...titiesDataComponentTypeBuilderWrapper.java | 62 +++++ ...nentsEntitiesEntityTypeBuilderWrapper.java | 73 ++++++ .../v1/CowponentsEntitiesInheritanceIds.java | 7 + .../api/v1/CowponentsEntityHelper.java | 36 +-- ...owponentsDefaultEntityComponentEvents.java | 16 +- .../api/v1/event/CowponentsEntityEvents.java | 16 +- .../CowponentsEntityComponentHolder.java | 4 +- .../CowponentsEntityDataComponentType.java | 4 +- ...ponentsEntityDataComponentTypeBuilder.java | 4 +- .../CowponentsEntityTypeBuilder.java | 8 +- .../entities/impl/CowponentsEntities.java | 36 +++ .../impl/client/CowponentsEntitiesClient.java | 8 + ...wponentsEntitiesClientNetworkHandlers.java | 44 ++++ .../entities/impl/client}/package-info.java | 2 +- ...Duck_HolderCowponentsEntityOriginated.java | 11 + .../impl/duck/Duck_TransferrableOnDeath.java | 5 + .../event/CowponentsEntitiesEventsImpl.java | 27 +++ .../Mixin_DataComponentInitializers.java | 6 +- .../mixin/Mixin_DataComponentTypeBuilder.java | 10 +- ...in_DataComponentTypeBuilderSimpleType.java | 10 +- .../entities}/impl/mixin/Mixin_Entity.java | 62 +++-- .../impl/mixin/Mixin_EntityTypeBuilder.java | 14 +- .../impl/mixin/Mixin_HolderReference.java | 10 +- .../SyncEntityComponentPacketClientbound.java | 35 +++ .../network/clientbound/package-info.java | 6 + .../entities/impl}/package-info.java | 2 +- .../CowponentsEntitiesDedicated.java | 8 + .../impl}/server/dedicated/package-info.java | 2 +- .../entities/impl/server/package-info.java | 6 + .../entity/DefaultEntityComponentsImpl.java | 10 +- .../world/entity/EntityComponentUtils.java | 42 ++-- .../main/resources/cowponents_entities.cfg | 6 + .../resources/cowponents_entities.mixins.json | 3 +- extensions/fabric/build.gradle.kts | 1 + extensions/neoforge/build.gradle.kts | 5 +- extensions/xplat/build.gradle.kts | 100 +------- ...ntsExtensionsDataComponentTypeBuilder.java | 2 +- gradle/libs.versions.toml | 20 +- .../CowponentsInstancesClientFabric.java | 18 -- .../fabric/server/dedicated/package-info.java | 6 - .../impl/fabric/server/package-info.java | 6 - .../CowponentsInstancesClientNeoForge.java | 27 --- .../impl/neoforge/client/package-info.java | 6 - .../instances/impl/neoforge/package-info.java | 6 - .../CowponentsInstancesDedicatedNeoForge.java | 10 - .../server/dedicated/package-info.java | 6 - .../impl/neoforge/server/package-info.java | 6 - instances/xplat/build.gradle.kts | 127 ----------- .../CowponentsInstancesValidationEvents.java | 23 -- .../client/CowponentsInstancesClient.java | 8 - .../CowponentsClientNetworkHandlers.java | 56 ----- .../instances/impl/client/package-info.java | 6 - .../duck/Duck_HolderCowponentsOriginated.java | 11 - .../impl/duck/Duck_TransferrableOnDeath.java | 5 - .../network/SyncEntityComponentPacket.java | 34 --- .../instances/impl/network/package-info.java | 6 - .../CowponentsInstancesDedicated.java | 8 - .../impl/server/dedicated/package-info.java | 6 - .../instances/impl/server/package-info.java | 6 - settings.gradle.kts | 3 +- test/fabric/build.gradle.kts | 2 +- test/neoforge/build.gradle.kts | 2 +- test/xplat/build.gradle.kts | 28 +-- .../cowponents/test/CowponentsTest.java | 6 +- .../test/commands/CowponentsTestCommands.java | 2 +- .../client/Mixin_LivingEntityRenderer.java | 8 +- .../CowponentsTestDataComponents.java | 8 +- 131 files changed, 1697 insertions(+), 1056 deletions(-) rename {instances => block_entities}/fabric/build.gradle.kts (92%) create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/CowponentsBlockEntitiesFabric.java create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/CowponentsBlockEntitiesClientFabric.java create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/package-info.java create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/CowponentsBlockEntitiesDedicatedFabric.java create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/package-info.java create mode 100644 block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/package-info.java create mode 100644 block_entities/fabric/src/main/resources/fabric.mod.json rename {instances => block_entities}/neoforge/build.gradle.kts (78%) rename {instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/block_entities}/impl/neoforge/CowponentsInstancesNeoForge.java (78%) create mode 100644 block_entities/xplat/build.gradle.kts rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities}/api/v1/CowponentsBlockEntityHelper.java (52%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities}/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java (91%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities}/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java (82%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities}/api/v1/CowponentsInstancesInheritanceIds.java (58%) rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsBlockEntityInheritanceEvents.java => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsBlockEntityEvents.java (76%) create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsDefaultBlockEntityComponentEvents.java create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityComponentHolder.java create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityType.java rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/CowponentsInstances.java => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/CowponentsBlockEntities.java (59%) create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/client/CowponentsBlockEntitiesClient.java create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/duck/Duck_HolderCowponentsBlockEntityOriginated.java rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/event/CowponentsInstancesInheritanceEventsImpl.java => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/event/CowponentsBlockEntitiesEventsImpl.java (60%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities}/impl/mixin/Mixin_BlockEntity.java (89%) create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_DataComponentInitializers.java create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/CowponentsBlockEntitiesDedicated.java create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/package-info.java rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/block/entity => block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity}/BlockEntityComponentHelper.java (63%) create mode 100644 block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/DefaultBlockEntityComponentsImpl.java rename instances/xplat/src/main/resources/cowponents_instances.cfg => block_entities/xplat/src/main/resources/cowponents_block_entities.cfg (100%) create mode 100644 block_entities/xplat/src/main/resources/cowponents_block_entities.mixins.json create mode 100644 build_logic/src/main/kotlin/conventions.shared.gradle.kts create mode 100644 build_logic/src/main/kotlin/conventions.submodule.gradle.kts create mode 100644 build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/ModPlatform.kt rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => core/xplat/src/main/java/lgbt/greenhouse/cowponents}/impl/network/NetworkableComponentChange.java (88%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl => core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network}/package-info.java (70%) create mode 100644 entities/fabric/build.gradle.kts rename instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/CowponentsInstancesFabric.java => entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/CowponentsEntitiesFabric.java (69%) create mode 100644 entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/CowponentsEntitiesClientFabric.java create mode 100644 entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/package-info.java rename {core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/client => entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric}/package-info.java (67%) rename instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/CowponentsInstancesDedicatedFabric.java => entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/CowponentsEntitiesDedicatedFabric.java (51%) create mode 100644 entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/package-info.java create mode 100644 entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/package-info.java rename instances/fabric/src/main/resources/cowponents_instances.classtweaker => entities/fabric/src/main/resources/cowponents_entities.classtweaker (100%) rename {instances => entities}/fabric/src/main/resources/fabric.mod.json (73%) create mode 100644 entities/neoforge/build.gradle.kts create mode 100644 entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/CowponentsInstancesNeoForge.java create mode 100644 entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/CowponentsInstancesClientNeoForge.java rename {instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric => entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge}/client/package-info.java (64%) rename {instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric => entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge}/package-info.java (67%) create mode 100644 entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java create mode 100644 entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/package-info.java create mode 100644 entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/package-info.java rename {instances => entities}/neoforge/src/main/resources/META-INF/neoforge.mods.toml (100%) create mode 100644 entities/xplat/build.gradle.kts create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesDataComponentTypeBuilderWrapper.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesEntityTypeBuilderWrapper.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesInheritanceIds.java rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/api/v1/CowponentsEntityHelper.java (54%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/api/v1/event/CowponentsDefaultEntityComponentEvents.java (79%) rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsEntityInheritanceEvents.java => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsEntityEvents.java (75%) rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsComponentHolder.java => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityComponentHolder.java (96%) rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentType.java => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentType.java (76%) rename instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentTypeBuilder.java => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentTypeBuilder.java (76%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/api/v1/extension/CowponentsEntityTypeBuilder.java (52%) create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/CowponentsEntities.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/CowponentsEntitiesClient.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/network/CowponentsEntitiesClientNetworkHandlers.java rename {core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client}/package-info.java (67%) create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_HolderCowponentsEntityOriginated.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_TransferrableOnDeath.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/event/CowponentsEntitiesEventsImpl.java rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_DataComponentInitializers.java (85%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_DataComponentTypeBuilder.java (67%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java (55%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_Entity.java (85%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_EntityTypeBuilder.java (72%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/mixin/Mixin_HolderReference.java (65%) create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/SyncEntityComponentPacketClientbound.java create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/package-info.java rename {core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/client => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl}/package-info.java (68%) create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/CowponentsEntitiesDedicated.java rename {core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl}/server/dedicated/package-info.java (65%) create mode 100644 entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/package-info.java rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/world/entity/DefaultEntityComponentsImpl.java (78%) rename {instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances => entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities}/impl/world/entity/EntityComponentUtils.java (71%) create mode 100644 entities/xplat/src/main/resources/cowponents_entities.cfg rename instances/xplat/src/main/resources/cowponents_instances.mixins.json => entities/xplat/src/main/resources/cowponents_entities.mixins.json (79%) delete mode 100644 instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/CowponentsInstancesClientFabric.java delete mode 100644 instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/package-info.java delete mode 100644 instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/package-info.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/CowponentsInstancesClientNeoForge.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/package-info.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/package-info.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/package-info.java delete mode 100644 instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/package-info.java delete mode 100644 instances/xplat/build.gradle.kts delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsInstancesValidationEvents.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/CowponentsInstancesClient.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/network/CowponentsClientNetworkHandlers.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/package-info.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_HolderCowponentsOriginated.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_TransferrableOnDeath.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/SyncEntityComponentPacket.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/package-info.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/CowponentsInstancesDedicated.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/package-info.java delete mode 100644 instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/package-info.java diff --git a/instances/fabric/build.gradle.kts b/block_entities/fabric/build.gradle.kts similarity index 92% rename from instances/fabric/build.gradle.kts rename to block_entities/fabric/build.gradle.kts index f83c9b3..1ca2de6 100644 --- a/instances/fabric/build.gradle.kts +++ b/block_entities/fabric/build.gradle.kts @@ -6,7 +6,7 @@ plugins { alias(libs.plugins.mod.publish) } -val props = Properties.MODULES["instances"]!! +val props = Properties.MODULES["block_entities"]!! dependencies { minecraft(libs.minecraft) diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/CowponentsBlockEntitiesFabric.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/CowponentsBlockEntitiesFabric.java new file mode 100644 index 0000000..5b44602 --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/CowponentsBlockEntitiesFabric.java @@ -0,0 +1,20 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.fabric; + +import lgbt.greenhouse.cowponents.block_entities.impl.CowponentsBlockEntities; +import net.fabricmc.api.ModInitializer; + +public class CowponentsBlockEntitiesFabric implements ModInitializer { + @Override + public void onInitialize() { + CowponentsBlockEntities.init(); + registerEvents(); + registerPayloads(); + } + + public static void registerEvents() { + } + + public static void registerPayloads() { + + } +} diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/CowponentsBlockEntitiesClientFabric.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/CowponentsBlockEntitiesClientFabric.java new file mode 100644 index 0000000..10688a3 --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/CowponentsBlockEntitiesClientFabric.java @@ -0,0 +1,18 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.fabric.client; + +import lgbt.greenhouse.cowponents.entities.impl.client.network.CowponentsEntitiesClientNetworkHandlers; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; + +public class CowponentsBlockEntitiesClientFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + registerPayloads(); + } + + public static void registerPayloads() { + ClientPlayNetworking.registerGlobalReceiver(SyncEntityComponentPacketClientbound.TYPE, + (payload, _) -> CowponentsEntitiesClientNetworkHandlers.syncEntityComponentPatch(payload)); + } +} diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/package-info.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/package-info.java new file mode 100644 index 0000000..af6b837 --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/client/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.block_entities.impl.fabric.client; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/CowponentsBlockEntitiesDedicatedFabric.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/CowponentsBlockEntitiesDedicatedFabric.java new file mode 100644 index 0000000..2ce4d7e --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/CowponentsBlockEntitiesDedicatedFabric.java @@ -0,0 +1,9 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.fabric.server.dedicated; + +import net.fabricmc.api.DedicatedServerModInitializer; + +public class CowponentsBlockEntitiesDedicatedFabric implements DedicatedServerModInitializer { + @Override + public void onInitializeServer() { + } +} diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/package-info.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/package-info.java new file mode 100644 index 0000000..7943014 --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/dedicated/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.block_entities.impl.fabric.server.dedicated; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/package-info.java b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/package-info.java new file mode 100644 index 0000000..d04f874 --- /dev/null +++ b/block_entities/fabric/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/fabric/server/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.block_entities.impl.fabric.server; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/block_entities/fabric/src/main/resources/fabric.mod.json b/block_entities/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..2eaab2f --- /dev/null +++ b/block_entities/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,49 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}", + "version": "${mod_version}+${minecraft_version}", + "name": "${mod_name}", + "description": "${mod_description}", + "authors": [ + "${mod_author}" + ], + "contributors": [ + "${fabric_mod_contributors}" + ], + "contact": { + "homepage": "${sources}", + "issues": "${sources}/issues", + "sources": "${sources}" + }, + "license": "${mod_license}", + "icon": "${mod_id}.png", + "environment": "*", + "entrypoints": { + "main": [ + "lgbt.greenhouse.cowponents.block_entities.impl.fabric.CowponentsBlockEntitiesFabric" + ], + "client": [ + "lgbt.greenhouse.cowponents.block_entities.impl.fabric.client.CowponentsBlockEntitiesClientFabric" + ], + "server": [ + "lgbt.greenhouse.cowponents.block_entities.impl.fabric.server.dedicated.CowponentsBlockEntitiesDedicatedFabric" + ] + }, + "mixins": [ + "${mod_id}.mixins.json" + ], + "depends": { + "fabricloader": "${fabric_loader_range}", + "fabric-api": "*", + "minecraft": "${fabric_minecraft_version_range}", + "java": ">=${java_version}" + }, + "custom": { + "modmenu": { + "badges": [ + "library" + ], + "parent": "cowponents" + } + } +} diff --git a/instances/neoforge/build.gradle.kts b/block_entities/neoforge/build.gradle.kts similarity index 78% rename from instances/neoforge/build.gradle.kts rename to block_entities/neoforge/build.gradle.kts index f7a591b..cba08ff 100644 --- a/instances/neoforge/build.gradle.kts +++ b/block_entities/neoforge/build.gradle.kts @@ -6,7 +6,7 @@ plugins { id("me.modmuss50.mod-publish-plugin") } -val props = Properties.MODULES["instances"]!! +val props = Properties.MODULES["block_entities"]!! dependencies { api(project(":core_neoforge")) @@ -17,7 +17,7 @@ neoForge { version = libs.versions.neoforge.get() addModdingDependenciesTo(sourceSets["test"]) - val at = project(":instances_xplat").file("src/main/resources/${props.modId}.cfg") + val at = project(":block_entities_xplat").file("src/main/resources/${props.modId}.cfg") if (at.exists()) setAccessTransformers(at) validateAccessTransformers = true diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/CowponentsInstancesNeoForge.java b/block_entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/neoforge/CowponentsInstancesNeoForge.java similarity index 78% rename from instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/CowponentsInstancesNeoForge.java rename to block_entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/neoforge/CowponentsInstancesNeoForge.java index 1e9fd04..3b96d25 100644 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/CowponentsInstancesNeoForge.java +++ b/block_entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/neoforge/CowponentsInstancesNeoForge.java @@ -1,10 +1,9 @@ -package lgbt.greenhouse.cowponents.instances.impl.neoforge; +package lgbt.greenhouse.cowponents.block_entities.impl.neoforge; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentType; -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; -import lgbt.greenhouse.cowponents.instances.impl.world.entity.EntityComponentUtils; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsInstancesDataComponentType; +import lgbt.greenhouse.cowponents.block_entities.impl.CowponentsBlockEntities; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.EntityComponentUtils; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; @@ -21,13 +20,13 @@ import java.util.List; import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; -@Mod(CowponentsInstances.MOD_ID) -@EventBusSubscriber(modid = CowponentsInstances.MOD_ID) +@Mod(CowponentsBlockEntities.MOD_ID) +@EventBusSubscriber(modid = CowponentsBlockEntities.MOD_ID) public class CowponentsInstancesNeoForge { public static final List DEFERRED_RUNNABLES = new ArrayList<>(); public CowponentsInstancesNeoForge(IEventBus eventBus) { - CowponentsInstances.init(); + CowponentsBlockEntities.init(); } @SubscribeEvent @@ -76,8 +75,8 @@ public class CowponentsInstancesNeoForge { public static void registerPayloadHandlers(RegisterPayloadHandlersEvent event) { event.registrar("1.0.0") .playToClient( - SyncEntityComponentPacket.TYPE, - SyncEntityComponentPacket.STREAM_CODEC + SyncEntityComponentPacketClientbound.TYPE, + SyncEntityComponentPacketClientbound.STREAM_CODEC ); } } diff --git a/block_entities/xplat/build.gradle.kts b/block_entities/xplat/build.gradle.kts new file mode 100644 index 0000000..c514d6e --- /dev/null +++ b/block_entities/xplat/build.gradle.kts @@ -0,0 +1,28 @@ +import lgbt.greenhouse.cowponents.gradle.Properties + +plugins { + id("conventions.xplat") + alias(libs.plugins.moddev) + alias(libs.plugins.mod.publish) +} + +val props = Properties.MODULES["block_entities"]!! + +dependencies { + compileOnly(libs.mixin) + compileOnly(libs.mixin.extras) + annotationProcessor(libs.mixin.extras) + + api(project(":core_xplat")) + "localCompile"(project(":extensions_xplat")) +} + +neoForge { + neoFormVersion = libs.versions.neoform.get() + addModdingDependenciesTo(sourceSets["test"]) + + val at = file("src/main/resources/${props.modId}.cfg") + if (at.exists()) + setAccessTransformers(at) + validateAccessTransformers = true +} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsBlockEntityHelper.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsBlockEntityHelper.java similarity index 52% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsBlockEntityHelper.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsBlockEntityHelper.java index 5965420..1f937ff 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsBlockEntityHelper.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsBlockEntityHelper.java @@ -1,6 +1,7 @@ -package lgbt.greenhouse.cowponents.instances.api.v1; +package lgbt.greenhouse.cowponents.block_entities.api.v1; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsComponentHolder; +import lgbt.greenhouse.cowponents.block_entities.api.v1.extension.CowponentsBlockEntityComponentHolder; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsBlockEntityComponentHold; import net.minecraft.core.component.*; import net.minecraft.world.level.block.entity.BlockEntity; import org.jspecify.annotations.Nullable; @@ -12,65 +13,65 @@ import java.util.stream.Stream; public class CowponentsBlockEntityHelper { @Nullable public static T get(BlockEntity blockEntity, DataComponentType componentType) { - return ((CowponentsComponentHolder) blockEntity).cowponents$get(componentType); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$get(componentType); } public static T getOrDefault(BlockEntity blockEntity, DataComponentType componentType, T defaultValue) { - return ((CowponentsComponentHolder) blockEntity).cowponents$getOrDefault(componentType, defaultValue); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$getOrDefault(componentType, defaultValue); } public static boolean has(BlockEntity blockEntity, DataComponentType componentType) { - return ((CowponentsComponentHolder) blockEntity).cowponents$has(componentType); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$has(componentType); } public static boolean hasNonDefault(BlockEntity blockEntity, DataComponentType componentType) { - return ((CowponentsComponentHolder) blockEntity).cowponents$hasNonDefault(componentType); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$hasNonDefault(componentType); } @Nullable public static T set(BlockEntity blockEntity, DataComponentType type, @Nullable T value) { - return ((CowponentsComponentHolder) blockEntity).cowponents$set(type, value); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$set(type, value); } @Nullable public static T set(BlockEntity blockEntity, TypedDataComponent type) { - return ((CowponentsComponentHolder) blockEntity).cowponents$set(type); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$set(type); } public static T remove(BlockEntity blockEntity, DataComponentType type) { - return ((CowponentsComponentHolder) blockEntity).cowponents$remove(type); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$remove(type); } @Nullable public static T update(BlockEntity blockEntity, DataComponentType type, T defaultValue, U value, BiFunction combiner) { - return ((CowponentsComponentHolder) blockEntity).cowponents$update(type, defaultValue, value, combiner); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$update(type, defaultValue, value, combiner); } public static T update(BlockEntity blockEntity, DataComponentType type, T defaultValue, UnaryOperator function) { - return ((CowponentsComponentHolder) blockEntity).cowponents$update(type, defaultValue, function); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$update(type, defaultValue, function); } public static void copyFrom(BlockEntity blockEntity, DataComponentType type, DataComponentGetter source) { - ((CowponentsComponentHolder) blockEntity).cowponents$copyFrom(type, source); + ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$copyFrom(type, source); } public static Stream getAllOfType(BlockEntity blockEntity, Class valueClass) { - return ((CowponentsComponentHolder) blockEntity).cowponents$getAllOfType(valueClass); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$getAllOfType(valueClass); } public static DataComponentMap getComponents(BlockEntity blockEntity) { - return ((CowponentsComponentHolder) blockEntity).cowponents$getComponents(); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$getComponents(); } public static DataComponentMap getPrototype(BlockEntity blockEntity) { - return ((CowponentsComponentHolder) blockEntity).cowponents$getPrototype(); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$getPrototype(); } public static DataComponentPatch getComponentsPatch(BlockEntity blockEntity) { - return ((CowponentsComponentHolder) blockEntity).cowponents$getComponentsPatch(); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$getComponentsPatch(); } public static DataComponentMap immutableComponents(BlockEntity blockEntity) { - return ((CowponentsComponentHolder) blockEntity).cowponents$immutableComponents(); + return ((CowponentsBlockEntityComponentHolder) blockEntity).cowponents$immutableComponents(); } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java similarity index 91% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java index d78e233..a47e770 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesDataComponentTypeBuilderWrapper.java @@ -1,6 +1,6 @@ -package lgbt.greenhouse.cowponents.instances.api.v1; +package lgbt.greenhouse.cowponents.block_entities.api.v1; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentTypeBuilder; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsInstancesDataComponentTypeBuilder; import net.minecraft.core.component.DataComponentType; import org.jspecify.annotations.NonNull; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java similarity index 82% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java index 5d58e1f..c33b2e1 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesEntityTypeBuilderWrapper.java @@ -1,6 +1,6 @@ -package lgbt.greenhouse.cowponents.instances.api.v1; +package lgbt.greenhouse.cowponents.block_entities.api.v1; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsEntityTypeBuilder; +import lgbt.greenhouse.cowponents.block_entities.api.v1.extension.CowponentsBlockEntityType; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentInitializers; import net.minecraft.core.component.DataComponentType; @@ -34,20 +34,20 @@ public class CowponentsInstancesEntityTypeBuilderWrapper { public CowponentsInstancesEntityTypeBuilderWrapper components(DataComponentType type, T value) { //noinspection unchecked - ((CowponentsEntityTypeBuilder) this.wrapped).cowponents_instances$component(type, value); + ((CowponentsBlockEntityType) this.wrapped).cowponents$component(type, value); return this; } public CowponentsInstancesEntityTypeBuilderWrapper delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { //noinspection unchecked - ((CowponentsEntityTypeBuilder) this.wrapped).cowponents_instances$delayedComponent(type, initializer); + ((CowponentsBlockEntityType) this.wrapped).cowponents$delayedComponent(type, initializer); return this; } public CowponentsInstancesEntityTypeBuilderWrapper delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { //noinspection unchecked - ((CowponentsEntityTypeBuilder) this.wrapped).cowponents_instances$delayedHolderComponent(type, valueKey); + ((CowponentsBlockEntityType) this.wrapped).cowponents$delayedHolderComponent(type, valueKey); return this; } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesInheritanceIds.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesInheritanceIds.java similarity index 58% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesInheritanceIds.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesInheritanceIds.java index deac36d..5920d82 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsInstancesInheritanceIds.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/CowponentsInstancesInheritanceIds.java @@ -1,8 +1,7 @@ -package lgbt.greenhouse.cowponents.instances.api.v1; +package lgbt.greenhouse.cowponents.block_entities.api.v1; import net.minecraft.resources.Identifier; public class CowponentsInstancesInheritanceIds { public static final Identifier BLOCK_ENTITY = Identifier.withDefaultNamespace("block_entity"); - public static final Identifier ENTITY = Identifier.withDefaultNamespace("entity"); } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsBlockEntityInheritanceEvents.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsBlockEntityEvents.java similarity index 76% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsBlockEntityInheritanceEvents.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsBlockEntityEvents.java index a810b66..aa7560a 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsBlockEntityInheritanceEvents.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsBlockEntityEvents.java @@ -1,17 +1,27 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.event; +package lgbt.greenhouse.cowponents.block_entities.api.v1.event; +import dev.yumi.commons.event.Event; import dev.yumi.commons.event.FilteredEvent; import dev.yumi.mc.core.api.YumiEvents; +import lgbt.greenhouse.cowponents.api.v1.event.CowponentsValidationEvents; import lgbt.greenhouse.cowponents.extensions.api.v1.event.InheritComponentCallback; import lgbt.greenhouse.cowponents.extensions.impl.event.CowponentsInheritanceEventsImpl; +import lgbt.greenhouse.cowponents.impl.util.ComponentValidationUtils; import net.minecraft.core.component.DataComponentType; import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; -import static lgbt.greenhouse.cowponents.instances.impl.event.CowponentsInstancesInheritanceEventsImpl.INHERIT_FROM_BLOCK_ENTITY_MAP; +import static lgbt.greenhouse.cowponents.block_entities.impl.event.CowponentsBlockEntitiesEventsImpl.INHERIT_FROM_BLOCK_ENTITY_MAP; + +public class CowponentsBlockEntityEvents { + /** + * An event used to validate addedComponents alongside other addedComponents specifically in a block entity context. + *

+ * Returning a DataResult#error within this event will roll back any addedComponents to what they were previously. + */ + public static final Event VALIDATE_BLOCK_ENTITY_COMPONENTS = YumiEvents.EVENTS.create(CowponentsValidationEvents.ValidateComponentsCallback.class, ComponentValidationUtils::validationCallback); -public class CowponentsBlockEntityInheritanceEvents { public static final FilteredEvent, DataComponentType> INHERIT_FROM_BLOCK_ENTITY = YumiEvents.EVENTS.createFiltered(InheritComponentCallback.class, DataComponentType.class, callbacks -> (blockEntity, registries) -> { for (var callback : callbacks) { Object value = callback.inherit(blockEntity, registries); diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsDefaultBlockEntityComponentEvents.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsDefaultBlockEntityComponentEvents.java new file mode 100644 index 0000000..43ae946 --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/event/CowponentsDefaultBlockEntityComponentEvents.java @@ -0,0 +1,66 @@ +package lgbt.greenhouse.cowponents.block_entities.api.v1.event; + +import dev.yumi.commons.event.Event; +import dev.yumi.mc.core.api.YumiEvents; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import java.util.Collection; +import java.util.function.Predicate; + +public class CowponentsDefaultBlockEntityComponentEvents { + public static final Event MODIFY = YumiEvents.EVENTS.create(ModifyCallback.class); + + public interface ModifyContext { + /** + * Modify the default data components of the specified item. + * + * @param entityTypePredicate A predicate to match entity types to modify + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} and a {@link HolderLookup.Provider} to modify the entity's components. + */ + void modify(Predicate> entityTypePredicate, ModifyConsumer builderConsumer); + + /** + * Modify the default data components of the specified item. + * + * @param entityType The entity types to modify + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's components. + */ + default void modify(BlockEntityType entityType, ModifyConsumer builderConsumer) { + modify(Predicate.isEqual(entityType), builderConsumer); + } + + /** + * Modify the default data components of the specified items. + * + * @param entityTypes The entity types to modify + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's components. + */ + default void modify(Collection> entityTypes, ModifyConsumer builderConsumer) { + modify(entityTypes::contains, builderConsumer); + } + } + + @FunctionalInterface + public interface ModifyCallback { + /** + * Modify the default data components of entity types using the provided {@link ModifyContext} instance. + * + * @param context The context to modify entity types + */ + void modify(ModifyContext context); + } + + public interface ModifyConsumer { + /** + * A consumer used for modifying the provided {@link DataComponentMap.Builder}. + * + * @param builder The current data component builder for the entity type. + * @param lookupProvider A lookup provider to obtain holders and holder sets from registries. + * @param entityType The entity type to modify. + */ + void modify(DataComponentMap.Builder builder, HolderLookup.Provider lookupProvider, BlockEntityType entityType); + } +} diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityComponentHolder.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityComponentHolder.java new file mode 100644 index 0000000..7dab8e5 --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityComponentHolder.java @@ -0,0 +1,80 @@ +package lgbt.greenhouse.cowponents.block_entities.api.v1.extension; + +import net.minecraft.core.component.*; +import org.jspecify.annotations.Nullable; + +import java.util.function.BiFunction; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; + +public interface CowponentsBlockEntityComponentHolder { + default DataComponentMap cowponents$getComponents() { + throw new AssertionError("Implemented via mixin."); + } + + default T cowponents$get(DataComponentType componentType) { + return cowponents$getComponents().get(componentType); + } + + default T cowponents$getOrDefault(DataComponentType componentType, T defaultValue) { + return cowponents$getComponents().getOrDefault(componentType, defaultValue); + } + + default boolean cowponents$has(DataComponentType componentType) { + return cowponents$getComponents().has(componentType); + } + + default boolean cowponents$hasNonDefault(DataComponentType type) { + throw new AssertionError("Implemented via mixin."); + } + + default @Nullable T cowponents$set(DataComponentType type, @Nullable T value) { + throw new AssertionError("Implemented via mixin."); + } + + default @Nullable T cowponents$set(TypedDataComponent value) { + throw new AssertionError("Implemented via mixin."); + } + + default @Nullable T cowponents$remove(DataComponentType type) { + throw new AssertionError("Implemented via mixin."); + } + + default @Nullable T cowponents$update(DataComponentType type, T defaultValue, U value, BiFunction combiner) { + return this.cowponents$set(type, combiner.apply(this.cowponents$getOrDefault(type, defaultValue), value)); + } + + default @Nullable T cowponents$update(DataComponentType type, T defaultValue, UnaryOperator function) { + T value = this.cowponents$getOrDefault(type, defaultValue); + return this.cowponents$set(type, function.apply(value)); + } + + default void cowponents$copyFrom(DataComponentType type, DataComponentGetter source) { + this.cowponents$set(type, source.get(type)); + } + + @SuppressWarnings("unchecked") + default Stream cowponents$getAllOfType(Class valueClass) { + return this.cowponents$getComponents() + .stream() + .map(TypedDataComponent::value) + .filter(value -> valueClass.isAssignableFrom(value.getClass())) + .map(value -> (T) value); + } + + default void cowponents$applyComponentsAndValidate(DataComponentPatch patch) { + throw new AssertionError("Implemented via mixin."); + } + + default DataComponentMap cowponents$getPrototype() { + throw new AssertionError("Implemented via mixin."); + } + + default DataComponentPatch cowponents$getComponentsPatch() { + throw new AssertionError("Implemented via mixin."); + } + + default DataComponentMap cowponents$immutableComponents() { + throw new AssertionError("Implemented via mixin."); + } +} diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityType.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityType.java new file mode 100644 index 0000000..5379dfa --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/api/v1/extension/CowponentsBlockEntityType.java @@ -0,0 +1,22 @@ +package lgbt.greenhouse.cowponents.block_entities.api.v1.extension; + +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponentInitializers; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; + +public interface CowponentsBlockEntityType { + default BlockEntityType cowponents$component(DataComponentType type, T value) { + throw new AssertionError("Implemented via mixin."); + } + + default BlockEntityType cowponents$delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { + throw new AssertionError("Implemented via mixin."); + } + + default BlockEntityType cowponents$delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { + throw new AssertionError("Implemented via mixin."); + } +} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/CowponentsInstances.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/CowponentsBlockEntities.java similarity index 59% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/CowponentsInstances.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/CowponentsBlockEntities.java index 68a38de..ba3d090 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/CowponentsInstances.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/CowponentsBlockEntities.java @@ -1,26 +1,23 @@ -package lgbt.greenhouse.cowponents.instances.impl; +package lgbt.greenhouse.cowponents.block_entities.impl; import lgbt.greenhouse.cowponents.extensions.api.v1.CowponentsInheritanceIdRegistry; import lgbt.greenhouse.cowponents.extensions.api.v1.event.CowponentsInheritanceImplementationEvents; import lgbt.greenhouse.cowponents.impl.Cowponents; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsInstancesInheritanceIds; -import lgbt.greenhouse.cowponents.instances.impl.world.block.entity.BlockEntityComponentHelper; -import lgbt.greenhouse.cowponents.instances.impl.world.entity.EntityComponentUtils; +import lgbt.greenhouse.cowponents.block_entities.api.v1.CowponentsInstancesInheritanceIds; +import lgbt.greenhouse.cowponents.block_entities.impl.world.block_entity.BlockEntityComponentHelper; import net.minecraft.resources.Identifier; -import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class CowponentsInstances { - public static final String MOD_ID = "cowponents_instances"; - public static final String MOD_NAME = "Cowponents: Instances"; +public class CowponentsBlockEntities { + public static final String MOD_ID = "cowponents_block_entities"; + public static final String MOD_NAME = "Cowponents: Block Entities"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_NAME); public static void init() { if (Cowponents.getPlatformHelper().isModLoaded("cowponents_extensions")) { CowponentsInheritanceIdRegistry.register(BlockEntity.class, CowponentsInstancesInheritanceIds.BLOCK_ENTITY); - CowponentsInheritanceIdRegistry.register(Entity.class, CowponentsInstancesInheritanceIds.ENTITY); CowponentsInheritanceImplementationEvents.registerObtainLookupEvent(CowponentsInstancesInheritanceIds.BLOCK_ENTITY, instance -> { if (instance.getLevel() != null) { @@ -28,11 +25,8 @@ public class CowponentsInstances { } return null; }); - CowponentsInheritanceImplementationEvents.registerObtainLookupEvent(CowponentsInstancesInheritanceIds.ENTITY, instance -> - instance.level().registryAccess()); CowponentsInheritanceImplementationEvents.registerInstancedInheritEvent(CowponentsInstancesInheritanceIds.BLOCK_ENTITY, BlockEntityComponentHelper::refreshInherited); - CowponentsInheritanceImplementationEvents.registerInstancedInheritEvent(CowponentsInstancesInheritanceIds.ENTITY, EntityComponentUtils::refreshInherited); } } diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/client/CowponentsBlockEntitiesClient.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/client/CowponentsBlockEntitiesClient.java new file mode 100644 index 0000000..74cd90c --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/client/CowponentsBlockEntitiesClient.java @@ -0,0 +1,8 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.client; + +import lgbt.greenhouse.cowponents.block_entities.impl.CowponentsBlockEntities; +import org.slf4j.Logger; + +public class CowponentsBlockEntitiesClient { + public static final Logger LOG = CowponentsBlockEntities.getLogger("Client"); +} diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/duck/Duck_HolderCowponentsBlockEntityOriginated.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/duck/Duck_HolderCowponentsBlockEntityOriginated.java new file mode 100644 index 0000000..642c105 --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/duck/Duck_HolderCowponentsBlockEntityOriginated.java @@ -0,0 +1,11 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.duck; + +import net.minecraft.core.component.DataComponentType; + +import java.util.Set; + +public interface Duck_HolderCowponentsBlockEntityOriginated { + Set> cowponents_block_entities$getCowponentsOriginated(); + + void cowponents_block_entities$setCowponentsOriginated(Set> types); +} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/event/CowponentsInstancesInheritanceEventsImpl.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/event/CowponentsBlockEntitiesEventsImpl.java similarity index 60% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/event/CowponentsInstancesInheritanceEventsImpl.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/event/CowponentsBlockEntitiesEventsImpl.java index ece5908..d37472b 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/event/CowponentsInstancesInheritanceEventsImpl.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/event/CowponentsBlockEntitiesEventsImpl.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.impl.event; +package lgbt.greenhouse.cowponents.block_entities.impl.event; import dev.yumi.commons.event.ContextualizedEvent; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; @@ -6,15 +6,13 @@ import lgbt.greenhouse.cowponents.extensions.api.v1.event.InheritComponentCallba import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentType; import net.minecraft.resources.Identifier; -import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.BlockEntity; import org.jspecify.annotations.Nullable; import java.util.Map; -public class CowponentsInstancesInheritanceEventsImpl { +public class CowponentsBlockEntitiesEventsImpl { public static final Map, ContextualizedEvent, DataComponentType>> INHERIT_FROM_BLOCK_ENTITY_MAP = new Object2ObjectArrayMap<>(); - public static final Map, ContextualizedEvent, DataComponentType>> INHERIT_FROM_ENTITY_MAP = new Object2ObjectArrayMap<>(); @SuppressWarnings("unchecked") @Nullable @@ -26,15 +24,4 @@ public class CowponentsInstancesInheritanceEventsImpl { } return null; } - - @SuppressWarnings("unchecked") - @Nullable - public static T invokeComponentForEntityEvent(DataComponentType type, Entity entity, HolderLookup.Provider lookupProvider) { - if (INHERIT_FROM_ENTITY_MAP.containsKey(type)) { - return (T) INHERIT_FROM_ENTITY_MAP.get(type) - .invoker() - .inherit(entity, lookupProvider); - } - return null; - } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_BlockEntity.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_BlockEntity.java similarity index 89% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_BlockEntity.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_BlockEntity.java index dd1a147..b463fc8 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_BlockEntity.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_BlockEntity.java @@ -1,13 +1,13 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.block_entities.impl.mixin; import com.mojang.serialization.DataResult; +import lgbt.greenhouse.cowponents.block_entities.api.v1.extension.CowponentsBlockEntityComponentHolder; +import lgbt.greenhouse.cowponents.block_entities.impl.duck.Duck_HolderCowponentsBlockEntityOriginated; import lgbt.greenhouse.cowponents.extensions.impl.duck.Duck_InheritableDataComponentMap; import lgbt.greenhouse.cowponents.extensions.impl.util.InheritedValueUtils; import lgbt.greenhouse.cowponents.impl.Cowponents; import lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsComponentHolder; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_HolderCowponentsOriginated; -import lgbt.greenhouse.cowponents.instances.impl.world.block.entity.BlockEntityComponentHelper; +import lgbt.greenhouse.cowponents.block_entities.impl.world.block_entity.BlockEntityComponentHelper; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.component.*; @@ -27,7 +27,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Optional; @Mixin(BlockEntity.class) -public abstract class Mixin_BlockEntity implements CowponentsComponentHolder { +public abstract class Mixin_BlockEntity implements CowponentsBlockEntityComponentHolder { @Unique private PatchedDataComponentMap cowponents$components; @@ -116,7 +116,7 @@ public abstract class Mixin_BlockEntity implements CowponentsComponentHolder { @Override public DataComponentMap cowponents$getPrototype() { Holder> holder = typeHolder(); - var cowponentsOriginated = ((Duck_HolderCowponentsOriginated) holder).cowponents_instances$getCowponentsOriginated(); + var cowponentsOriginated = ((Duck_HolderCowponentsBlockEntityOriginated) holder).cowponents_block_entities$getCowponentsOriginated(); if (cowponentsOriginated.isEmpty()) return DataComponentMap.EMPTY; diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_DataComponentInitializers.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_DataComponentInitializers.java new file mode 100644 index 0000000..203eeb7 --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/mixin/Mixin_DataComponentInitializers.java @@ -0,0 +1,35 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; +import lgbt.greenhouse.cowponents.block_entities.api.v1.event.CowponentsDefaultBlockEntityComponentEvents; +import lgbt.greenhouse.cowponents.block_entities.impl.world.block_entity.DefaultBlockEntityComponentsImpl; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentInitializers; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.entity.BlockEntityType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Map; + +@Mixin(DataComponentInitializers.class) +public abstract class Mixin_DataComponentInitializers { + @ModifyReturnValue(method = "runInitializers", at = @At(value = "RETURN")) + private static Map, DataComponentMap.Builder> cowponents$runDefaultEntityComponents(Map, DataComponentMap.Builder> original, @Local(argsOnly = true) HolderLookup.Provider lookupProvider) { + for (BlockEntityType blockEntityType : BuiltInRegistries.BLOCK_ENTITY_TYPE) { + //noinspection deprecation + ResourceKey> key = blockEntityType.builtInRegistryHolder().key(); + DataComponentMap.Builder builder = original.getOrDefault(key, DataComponentMap.builder()); + CowponentsDefaultBlockEntityComponentEvents.MODIFY + .invoker() + .modify(new DefaultBlockEntityComponentsImpl(builder, lookupProvider, blockEntityType)); + if (!original.containsKey(key) && !builder.build().isEmpty()) { + original.put(key, builder); + } + } + return original; + } +} diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/CowponentsBlockEntitiesDedicated.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/CowponentsBlockEntitiesDedicated.java new file mode 100644 index 0000000..eaf0efe --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/CowponentsBlockEntitiesDedicated.java @@ -0,0 +1,8 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.server.dedicated; + +import lgbt.greenhouse.cowponents.block_entities.impl.CowponentsBlockEntities; +import org.slf4j.Logger; + +public class CowponentsBlockEntitiesDedicated { + public static final Logger LOG = CowponentsBlockEntities.getLogger("Dedicated Server"); +} diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/package-info.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/package-info.java new file mode 100644 index 0000000..0f065df --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/server/dedicated/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.block_entities.impl.server.dedicated; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/block/entity/BlockEntityComponentHelper.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/BlockEntityComponentHelper.java similarity index 63% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/block/entity/BlockEntityComponentHelper.java rename to block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/BlockEntityComponentHelper.java index 7988452..b2faf7d 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/block/entity/BlockEntityComponentHelper.java +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/BlockEntityComponentHelper.java @@ -1,12 +1,12 @@ -package lgbt.greenhouse.cowponents.instances.impl.world.block.entity; +package lgbt.greenhouse.cowponents.block_entities.impl.world.block_entity; import com.mojang.serialization.DataResult; import lgbt.greenhouse.cowponents.api.v1.DataComponentGetterSetter; +import lgbt.greenhouse.cowponents.block_entities.api.v1.event.CowponentsBlockEntityEvents; import lgbt.greenhouse.cowponents.impl.util.ComponentValidationUtils; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsBlockEntityHelper; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsInstancesValidationEvents; -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import lgbt.greenhouse.cowponents.instances.impl.event.CowponentsInstancesInheritanceEventsImpl; +import lgbt.greenhouse.cowponents.block_entities.api.v1.CowponentsBlockEntityHelper; +import lgbt.greenhouse.cowponents.block_entities.impl.CowponentsBlockEntities; +import lgbt.greenhouse.cowponents.block_entities.impl.event.CowponentsBlockEntitiesEventsImpl; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentType; @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import org.slf4j.Logger; public class BlockEntityComponentHelper { - public static final Logger LOGGER = CowponentsInstances.getLogger("Block Entity Components"); + public static final Logger LOGGER = CowponentsBlockEntities.getLogger("Block Entity Components"); public static DataResult validate(BlockEntity blockEntity) { DataComponentMap components = CowponentsBlockEntityHelper.getComponents(blockEntity); @@ -25,14 +25,14 @@ public class BlockEntityComponentHelper { return globalValidation.map(_ -> blockEntity); } - return CowponentsInstancesValidationEvents.VALIDATE_BLOCK_ENTITY_COMPONENTS + return CowponentsBlockEntityEvents.VALIDATE_BLOCK_ENTITY_COMPONENTS .invoker() .validate(components) .map(_ -> blockEntity); } public static void refreshInherited(BlockEntity blockEntity, HolderLookup.Provider lookupProvider, DataComponentGetterSetter getterSetter) { - for (var type : CowponentsInstancesInheritanceEventsImpl.INHERIT_FROM_BLOCK_ENTITY_MAP.keySet()) { + for (var type : CowponentsBlockEntitiesEventsImpl.INHERIT_FROM_BLOCK_ENTITY_MAP.keySet()) { inheritValue(lookupProvider, blockEntity, type, getterSetter); } } @@ -41,7 +41,7 @@ public class BlockEntityComponentHelper { BlockEntity blockEntity, DataComponentType type, DataComponentGetterSetter getterSetter) { - T toValue = CowponentsInstancesInheritanceEventsImpl.invokeComponentForBlockEntityEvent(type, blockEntity, lookupProvider); + T toValue = CowponentsBlockEntitiesEventsImpl.invokeComponentForBlockEntityEvent(type, blockEntity, lookupProvider); if (toValue != null) { getterSetter.set(type, toValue); } diff --git a/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/DefaultBlockEntityComponentsImpl.java b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/DefaultBlockEntityComponentsImpl.java new file mode 100644 index 0000000..60ad09e --- /dev/null +++ b/block_entities/xplat/src/main/java/lgbt/greenhouse/cowponents/block_entities/impl/world/block_entity/DefaultBlockEntityComponentsImpl.java @@ -0,0 +1,53 @@ +package lgbt.greenhouse.cowponents.block_entities.impl.world.block_entity; + +import lgbt.greenhouse.cowponents.block_entities.api.v1.event.CowponentsDefaultBlockEntityComponentEvents; +import lgbt.greenhouse.cowponents.block_entities.impl.duck.Duck_HolderCowponentsBlockEntityOriginated; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.component.TypedDataComponent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.entity.BlockEntityType; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Predicate; + +public class DefaultBlockEntityComponentsImpl implements CowponentsDefaultBlockEntityComponentEvents.ModifyContext { + private final DataComponentMap.Builder builder; + private final HolderLookup.Provider lookupProvider; + private final BlockEntityType blockEntityType; + + public DefaultBlockEntityComponentsImpl(DataComponentMap.Builder builder, HolderLookup.Provider lookupProvider, BlockEntityType blockEntityType) { + this.builder = builder; + this.lookupProvider = lookupProvider; + this.blockEntityType = blockEntityType; + } + + @Override + public void modify(Predicate> entityTypePredicate, CowponentsDefaultBlockEntityComponentEvents.ModifyConsumer builderConsumer) { + if (!entityTypePredicate.test(blockEntityType)) + return; + + //noinspection deprecation + Holder> holder = blockEntityType.builtInRegistryHolder(); + + DataComponentMap oldComponents = builder.build(); + + builderConsumer.modify(builder, lookupProvider, blockEntityType); + + DataComponentMap newComponents = builder.build(); + + Set> originated = new HashSet<>(((Duck_HolderCowponentsBlockEntityOriginated) holder).cowponents_block_entities$getCowponentsOriginated()); + for (TypedDataComponent component : newComponents + .stream() + .filter(typed -> !oldComponents.has(typed.type()) || !oldComponents.get(typed.type()).equals(typed.value())) + .toList()) { + originated.add(component.type()); + } + if (!originated.isEmpty()) { + ((Duck_HolderCowponentsBlockEntityOriginated) holder).cowponents_block_entities$setCowponentsOriginated(originated); + } + } +} diff --git a/instances/xplat/src/main/resources/cowponents_instances.cfg b/block_entities/xplat/src/main/resources/cowponents_block_entities.cfg similarity index 100% rename from instances/xplat/src/main/resources/cowponents_instances.cfg rename to block_entities/xplat/src/main/resources/cowponents_block_entities.cfg diff --git a/block_entities/xplat/src/main/resources/cowponents_block_entities.mixins.json b/block_entities/xplat/src/main/resources/cowponents_block_entities.mixins.json new file mode 100644 index 0000000..ee4ce4e --- /dev/null +++ b/block_entities/xplat/src/main/resources/cowponents_block_entities.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "lgbt.greenhouse.cowponents.block_entities.impl.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [ + "Mixin_BlockEntity", + "Mixin_DataComponentInitializers" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/build_logic/src/main/kotlin/conventions.loader.gradle.kts b/build_logic/src/main/kotlin/conventions.loader.gradle.kts index 112905a..52fe009 100644 --- a/build_logic/src/main/kotlin/conventions.loader.gradle.kts +++ b/build_logic/src/main/kotlin/conventions.loader.gradle.kts @@ -1,7 +1,8 @@ +import lgbt.greenhouse.cowponents.gradle.ModPlatform import lgbt.greenhouse.cowponents.gradle.Properties plugins { - id("conventions.xplat") + id("conventions.shared") } configurations { @@ -19,22 +20,22 @@ configurations { } } -val xplatProjectName = ":" + project.name.replace(Regex("(fabric|neoforge)$"), "xplat") -val xplatProject: Project = project(xplatProjectName)!! -val props = Properties.MODULES[project.name.split("_")[0]]!! +val xplatProjectName = ":${ModPlatform.convertModuleName(project.name, ModPlatform.XPLAT)}" +val xplatProject: Project = project(xplatProjectName) +val props = project.ext["props"] as Properties.ModuleProperties evaluationDependsOn(xplatProjectName) -gradle.projectsEvaluated { - sourceSets { - getByName("main") { - compileClasspath += xplatProject.sourceSets["main"].output - runtimeClasspath += xplatProject.sourceSets["main"].output - } - getByName("test") { - compileClasspath += xplatProject.sourceSets["test"].output - runtimeClasspath += xplatProject.sourceSets["test"].output - } +sourceSets { + getByName("main") { + compileClasspath += xplatProject.sourceSets["main"].output + runtimeClasspath += xplatProject.sourceSets["main"].output + } + getByName("test") { + compileClasspath += xplatProject.sourceSets["main"].output + runtimeClasspath += xplatProject.sourceSets["main"].output + compileClasspath += xplatProject.sourceSets["test"].output + runtimeClasspath += xplatProject.sourceSets["test"].output } } diff --git a/build_logic/src/main/kotlin/conventions.shared.gradle.kts b/build_logic/src/main/kotlin/conventions.shared.gradle.kts new file mode 100644 index 0000000..85ae8fa --- /dev/null +++ b/build_logic/src/main/kotlin/conventions.shared.gradle.kts @@ -0,0 +1,162 @@ +import lgbt.greenhouse.cowponents.gradle.Properties +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.kotlin.dsl.get +import kotlin.text.replace + +plugins { + base + `java-library` + idea + `maven-publish` +} + +// https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 +val libs = the() + +val coreProps = Properties.MODULES["core"]!! +val props = Properties.MODULES[project.name.replace(Regex("_(xplat|fabric|neoforge)$"), "")]!! +project.ext["props"] = props + +base.archivesName.set("${props.archivesBaseName}-${project.name.split("_")[1]}") +group = Properties.GROUP +version = "${props.version}+${Properties.FRIENDLY_MINECRAFT_VERSION}" + +configurations { + register("localCompile") { + isCanBeResolved = true + isCanBeConsumed = false + } + getByName("compileClasspath") { + extendsFrom(configurations["localCompile"]) + } +} + +java { + toolchain.languageVersion.set(JavaLanguageVersion.of(Properties.JAVA_VERSION)) + withSourcesJar() + withJavadocJar() +} + +repositories { + // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository + exclusiveContent { + forRepository { + maven("https://repo.spongepowered.org/repository/maven-public") { + name = "Sponge" + } + } + filter { + @Suppress("UnstableApiUsage") + includeGroupAndSubgroups("org.spongepowered") + } + } + exclusiveContent { + forRepositories( + maven("https://maven.parchmentmc.org/") { + name = "ParchmentMC" + }, + maven("https://maven.neoforged.net/releases") { + name = "NeoForge" + } + ) + filter { includeGroup("org.parchmentmc.data") } + } + maven("https://maven.fabricmc.net/") { + name = "Fabric" + } + maven("https://maven.terraformersmc.com/") { + name = "TerraformersMC" + } + maven("https://maven.greenhouse.lgbt/releases") { + name = "Greenhouse Modding" + } + mavenCentral() + mavenLocal() +} + +tasks { + named("sourcesJar").configure { + from(rootProject.file("LICENSE")) { + rename { "${it}_${props.name}" } + } + } + named("jar").configure { + from(rootProject.file("LICENSE")) { + rename { "${it}_${props.name}" } + } + + manifest { + attributes["Specification-Title"] = props.name + attributes["Specification-Vendor"] = Properties.MOD_AUTHOR + attributes["Specification-Version"] = archiveVersion + attributes["Implementation-Title"] = project.name + attributes["Implementation-Version"] = archiveVersion + attributes["Implementation-Vendor"] = Properties.MOD_AUTHOR + attributes["Built-On-Minecraft"] = libs.versions.minecraft.get() + } + } + + named("test").configure { + failOnNoDiscoveredTests = false + } + + val expandProps = mapOf( + "mod_version" to props.version, + "core_version" to coreProps.version, + "group" to project.group, //Else we target the task's group. + "minecraft_version" to Properties.FRIENDLY_MINECRAFT_VERSION, + "fabric_api_version" to libs.versions.fabric.api.get(), + "fabric_loader_version" to libs.versions.fabric.loader.get(), + "fabric_minecraft_version_range" to Properties.FABRIC_MINECRAFT_RANGE, + "fabric_loader_range" to Properties.FABRIC_LOADER_RANGE, + "mod_name" to props.displayName, + "mod_author" to Properties.MOD_AUTHOR, + "neoforge_mod_contributors" to Properties.MOD_CONTRIBUTORS.joinToString(), + "fabric_mod_contributors" to Properties.MOD_CONTRIBUTORS.joinToString("\",\n\t\t\""), + "mod_id" to props.modId, + "mod_license" to Properties.LICENSE, + "mod_description" to props.description, + "neoforge_version" to libs.versions.neoforge.get(), + "neoforge_minecraft_version_range" to Properties.NEOFORGE_MINECRAFT_RANGE, + "neoforge_loader_version_range" to Properties.NEOFORGE_LOADER_RANGE, + "neoforge_version_range" to Properties.NEOFORGE_RANGE, + "java_version" to Properties.JAVA_VERSION, + "modrinth_page" to Properties.MODRINTH_PAGE, + "sources" to "${Properties.FORGEJO_URL}/${Properties.FORGEJO_REPO}" + ) + + val processResourcesTasks = + listOf("processResources", "processTestResources", "processDatagenResources", "processGametestResources") + + withType().matching { processResourcesTasks.contains(it.name) }.configureEach { + inputs.properties(expandProps) + filesMatching(setOf("fabric.mod.json", "META-INF/neoforge.mods.toml", "*.mixins.json")) { + expand(expandProps) + } + exclude("\\.cache") + } +} + +if (props.publishToMaven) { + publishing { + publications { + create("mavenJava") { + artifactId = base.archivesName.get() + from(components["java"]) + } + } + repositories { + maven { + name = "Greenhouse" + url = uri(Properties.MAVEN_URL) + credentials { + username = System.getenv("MAVEN_USERNAME") + password = System.getenv("MAVEN_PASSWORD") + } + authentication { + create("basic") + } + } + } + } +} diff --git a/build_logic/src/main/kotlin/conventions.submodule.gradle.kts b/build_logic/src/main/kotlin/conventions.submodule.gradle.kts new file mode 100644 index 0000000..268d5f7 --- /dev/null +++ b/build_logic/src/main/kotlin/conventions.submodule.gradle.kts @@ -0,0 +1,20 @@ +import lgbt.greenhouse.cowponents.gradle.ModPlatform + +evaluationDependsOn(":core_xplat") + +val platform = ModPlatform.fromModuleName(project.name) +val corePlatformName = ":core${platform.projectSuffix}" +if (platform != ModPlatform.XPLAT) { + evaluationDependsOn(corePlatformName) +} + +dependencies { + "xplatJava"(project(":core_xplat", "xplatJava")) + "xplatTestJava"(project(":core_xplat", "xplatTestJava")) + "xplatResources"(project(":core_xplat", "xplatResources")) + "xplatTestResources"(project(":core_xplat", "xplatTestResources")) + + if (platform != ModPlatform.XPLAT) { + "api"(project(corePlatformName)) + } +} diff --git a/build_logic/src/main/kotlin/conventions.xplat.gradle.kts b/build_logic/src/main/kotlin/conventions.xplat.gradle.kts index d55217c..9d2d4de 100644 --- a/build_logic/src/main/kotlin/conventions.xplat.gradle.kts +++ b/build_logic/src/main/kotlin/conventions.xplat.gradle.kts @@ -1,160 +1,108 @@ import lgbt.greenhouse.cowponents.gradle.Properties -import org.gradle.accessors.dm.LibrariesForLibs -import org.gradle.kotlin.dsl.get +import org.gradle.jvm.component.internal.DefaultJvmSoftwareComponent +import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal plugins { - base - `java-library` - idea - `maven-publish` + id("conventions.shared") } -// https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 -val libs = the() - -val coreProps = Properties.MODULES["core"]!! -val props = Properties.MODULES[project.name.split("_")[0]]!! -project.ext["props"] = props - -base.archivesName.set("${props.modId}-${project.name}") -group = props.group -version = "${props.version}+${Properties.FRIENDLY_MINECRAFT_VERSION}" +val props = project.ext["props"] as Properties.ModuleProperties configurations { - register("localCompile") { - isCanBeResolved = true - isCanBeConsumed = false + register("xplatJava") { + isCanBeResolved = false + isCanBeConsumed = true } - getByName("compileClasspath") { - extendsFrom(configurations["localCompile"]) + register("xplatTestJava") { + isCanBeResolved = false + isCanBeConsumed = true } -} - -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(Properties.JAVA_VERSION)) - withSourcesJar() - withJavadocJar() -} - -repositories { - // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository - exclusiveContent { - forRepository { - maven("https://repo.spongepowered.org/repository/maven-public") { - name = "Sponge" - } - } - filter { - @Suppress("UnstableApiUsage") - includeGroupAndSubgroups("org.spongepowered") - } + register("xplatResources") { + isCanBeResolved = false + isCanBeConsumed = true } - exclusiveContent { - forRepositories( - maven("https://maven.parchmentmc.org/") { - name = "ParchmentMC" - }, - maven("https://maven.neoforged.net/releases") { - name = "NeoForge" - } - ) - filter { includeGroup("org.parchmentmc.data") } - } - maven("https://maven.fabricmc.net/") { - name = "Fabric" - } - maven("https://maven.terraformersmc.com/") { - name = "TerraformersMC" - } - maven("https://maven.greenhouse.lgbt/releases") { - name = "Greenhouse Modding" + register("xplatTestResources") { + isCanBeResolved = false + isCanBeConsumed = true } - mavenCentral() - mavenLocal() -} - -tasks { - named("sourcesJar").configure { - from(rootProject.file("LICENSE")) { - rename { "${it}_${props.name}" } + getByName("apiElements") { + outgoing { + capability("${group}:${base.archivesName.get()}:${version}") } } - named("jar").configure { - from(rootProject.file("LICENSE")) { - rename { "${it}_${props.name}" } - } - - manifest { - attributes["Specification-Title"] = props.name - attributes["Specification-Vendor"] = Properties.MOD_AUTHOR - attributes["Specification-Version"] = archiveVersion - attributes["Implementation-Title"] = project.name - attributes["Implementation-Version"] = archiveVersion - attributes["Implementation-Vendor"] = Properties.MOD_AUTHOR - attributes["Built-On-Minecraft"] = libs.versions.minecraft.get() + if (props.publishToMaven) { + register("apiCompileElements") { + outgoing { + capability("${group}:${base.archivesName.get()}-api:${version}") + } } } +} - named("test").configure { - failOnNoDiscoveredTests = false - } +artifacts { + add("xplatJava", sourceSets["main"].java.sourceDirectories.singleFile) + add("xplatResources", sourceSets["main"].resources.sourceDirectories.singleFile) + add("xplatTestJava", sourceSets["test"].java.sourceDirectories.singleFile) + add("xplatTestResources", sourceSets["test"].resources.sourceDirectories.singleFile) +} - val expandProps = mapOf( - "mod_version" to props.version, - "core_version" to coreProps.version, - "group" to project.group, //Else we target the task's group. - "minecraft_version" to Properties.FRIENDLY_MINECRAFT_VERSION, - "fabric_api_version" to libs.versions.fabric.api.get(), - "fabric_loader_version" to libs.versions.fabric.loader.get(), - "fabric_minecraft_version_range" to Properties.FABRIC_MINECRAFT_RANGE, - "fabric_loader_range" to Properties.FABRIC_LOADER_RANGE, - "mod_name" to props.displayName, - "mod_author" to Properties.MOD_AUTHOR, - "neoforge_mod_contributors" to Properties.MOD_CONTRIBUTORS.joinToString(), - "fabric_mod_contributors" to Properties.MOD_CONTRIBUTORS.joinToString("\",\n\t\t\""), - "mod_id" to props.modId, - "mod_license" to Properties.LICENSE, - "mod_description" to props.description, - "neoforge_version" to libs.versions.neoforge.get(), - "neoforge_minecraft_version_range" to Properties.NEOFORGE_MINECRAFT_RANGE, - "neoforge_loader_version_range" to Properties.NEOFORGE_LOADER_RANGE, - "neoforge_version_range" to Properties.NEOFORGE_RANGE, - "java_version" to Properties.JAVA_VERSION, - "modrinth_page" to Properties.MODRINTH_PAGE, - "sources" to "${Properties.FORGEJO_URL}/${Properties.FORGEJO_REPO}" - ) +if (props.publishToMaven) { + val apiComponent = components.create("api") as DefaultJvmSoftwareComponent - val processResourcesTasks = - listOf("processResources", "processTestResources", "processDatagenResources", "processGametestResources") + tasks { + register("apiJar") { + archiveBaseName.set(props.archivesBaseName) + archiveClassifier = "api" + dependsOn(named("jar")) + from(zipTree(getByName("jar").archiveFile)) + includes.add("${Properties.GROUP.replace(".", "/")}/api/v1/**") + } + } - withType().matching { processResourcesTasks.contains(it.name) }.configureEach { - inputs.properties(expandProps) - filesMatching(setOf("fabric.mod.json", "META-INF/neoforge.mods.toml", "*.mixins.json")) { - expand(expandProps) + project.afterEvaluate { + val main = sourceSets["main"] + configurations.getByName("apiCompileElements") { + extendsFrom(configurations[main.apiConfigurationName]) + attributes { + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.LIBRARY)) + attribute( + LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, + objects.named(LibraryElements::class, LibraryElements.JAR) + ) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class, Usage.JAVA_API)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling::class, Bundling.EXTERNAL)) + var languageVersion = java.toolchain.languageVersion + if (languageVersion.isPresent) { + attributes.attribute( + TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, + languageVersion.get().asInt() + ) + } + } + } + artifacts.add( + "apiCompileElements", + tasks.getByName("apiJar") + ) { + classifier = "api" + } + apiComponent.addVariantsFromConfiguration(configurations["apiCompileElements"]) { + mapToMavenScope("compile") + mapToOptional() + } + apiComponent.addVariantsFromConfiguration(configurations[main.sourcesElementsConfigurationName]) { + mapToOptional() + } + apiComponent.addVariantsFromConfiguration(configurations[main.javadocElementsConfigurationName]) { + mapToOptional() } - exclude("\\.cache") } -} -if (props.name != "test") { publishing { publications { - create("mavenJavaImpl") { - artifactId = base.archivesName.get() - from(components["java"]) - } - } - repositories { - maven { - name = "Greenhouse" - url = uri(Properties.MAVEN_URL) - credentials { - username = System.getenv("MAVEN_USERNAME") - password = System.getenv("MAVEN_PASSWORD") - } - authentication { - create("basic") - } + create("mavenJavaApi") { + artifactId = props.archivesBaseName + "-api" + from(components["api"]) } } } diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/ModPlatform.kt b/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/ModPlatform.kt new file mode 100644 index 0000000..c0f8a3d --- /dev/null +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/ModPlatform.kt @@ -0,0 +1,23 @@ +package lgbt.greenhouse.cowponents.gradle + +enum class ModPlatform(val projectSuffix: String) { + XPLAT("_xplat"), + FABRIC("_fabric"), + NEOFORGE("_neoforge"); + + companion object { + fun convertModuleName(projectName: String, modPlatform: ModPlatform): String { + val oldPlatform = fromModuleName(projectName) + return projectName.replace(oldPlatform.projectSuffix, modPlatform.projectSuffix) + } + + fun fromModuleName(projectName: String): ModPlatform { + for (modPlatform in entries) { + if (projectName.endsWith(modPlatform.projectSuffix)) { + return modPlatform + } + } + throw IllegalStateException("Unable to find platform from module name. Module name must end with _xplat, _fabric, or _neoforge.") + } + } +} diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/Properties.kt b/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/Properties.kt index 854e0e0..5eb6f43 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/Properties.kt +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/cowponents/gradle/Properties.kt @@ -4,18 +4,19 @@ object Properties { const val FRIENDLY_MINECRAFT_VERSION = "26.1.x" const val JAVA_VERSION = 25 + const val GROUP = "lgbt.greenhouse.cowponents" const val MOD_AUTHOR = "Greenhouse Modding" val MOD_CONTRIBUTORS = listOf("ChrysanthCow") const val LICENSE = "MPL-2.0" - val SUPPORTED_MINECRAFT_VERSIONS = listOf("26.1") + val SUPPORTED_MINECRAFT_VERSIONS = listOf("26.1", "26.1.1", "26.1.2") const val FABRIC_LOADER_RANGE = ">=0.17" const val FABRIC_MINECRAFT_RANGE = "~26.1-" const val NEOFORGE_LOADER_RANGE = "[4,)" const val NEOFORGE_RANGE = "[26.1.0.0-alpha.9,26.2.0.0)" - const val NEOFORGE_MINECRAFT_RANGE = "[26.1-snapshot-6,26.2)" + const val NEOFORGE_MINECRAFT_RANGE = "[26.1,26.2)" const val MODRINTH_PAGE = "https://modrinth.com/project/cowponents" const val MODRINTH_PROJECT_ID = "??????" @@ -30,43 +31,66 @@ object Properties { "core" to ModuleProperties( "core", "Cowponents", - "lgbt.greenhouse.cowponents", - "A library relating to components", + "A library relating to components.", "1.0.0-alpha.1", - "cowponents" + "cowponents", + "cowponents-core", + true ), "extensions" to ModuleProperties( "extensions", "Cowponents: Extensions", - "lgbt.greenhouse.cowponents.extensions", "Implements additional options for components.", "1.0.0-alpha.1", - "cowponents_extensions" + "cowponents_extensions", + "cowponents-extensions", + true ), - "instances" to ModuleProperties( - "instances", - "Cowponents: Instances", - "lgbt.greenhouse.cowponents.instances", - "Implements component block entities and entities.", + "block_entities" to ModuleProperties( + "block_entities", + "Cowponents: Block Entities", + "Implements components for block entities.", "1.0.0-alpha.1", - "cowponents_instances" + "cowponents_block_entities", + "cowponents-block-entities", + true + ), + "chunks" to ModuleProperties( + "chunks", + "Cowponents: Chunks", + "Implements components for chunks.", + "1.0.0-alpha.1", + "cowponents_chunks", + "cowponents-chunks", + true + ), + "entities" to ModuleProperties( + "entities", + "Cowponents: Entities", + "Implements components for entities.", + "1.0.0-alpha.1", + "cowponents_entities", + "cowponents-entities", + true ), "test" to ModuleProperties( "test", "Cowponents: Test", - "lgbt.greenhouse.cowponents.test", - "Tests for Cowponents", + "Tests for Cowponents.", "1.0.0", - "cowponents_test" + "cowponents_test", + "cowponents-test", + false ) ) class ModuleProperties( val name: String, val displayName: String, - val group: String, val description: String, val version: String, - val modId: String + val modId: String, + val archivesBaseName: String, + val publishToMaven: Boolean ) } diff --git a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/CowponentsFabric.java b/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/CowponentsFabric.java index 20a8fd1..7ae98b7 100644 --- a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/CowponentsFabric.java +++ b/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/CowponentsFabric.java @@ -1,9 +1,18 @@ package lgbt.greenhouse.cowponents.impl.fabric; +import lgbt.greenhouse.cowponents.impl.Cowponents; +import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; public class CowponentsFabric implements ModInitializer { @Override public void onInitialize() { + registerEvents(); + } + + private static void registerEvents() { + ServerLifecycleEvents.SERVER_STARTING.register(server -> Cowponents.server = server); + ServerLifecycleEvents.SERVER_STOPPED.register(_ -> Cowponents.server = null); } } diff --git a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/platform/CowponentsPlatformHelperFabric.java b/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/platform/CowponentsPlatformHelperFabric.java index 4885572..d84c1bb 100644 --- a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/platform/CowponentsPlatformHelperFabric.java +++ b/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/platform/CowponentsPlatformHelperFabric.java @@ -49,7 +49,6 @@ public class CowponentsPlatformHelperFabric implements CowponentsPlatformHelper @Override public void sendClientboundTracking(Entity entity, CustomPacketPayload payload) { - //noinspection NullableProblems List players = Stream.concat(PlayerLookup.tracking(entity).stream(), Stream.of(entity)) .map(e -> { if (e instanceof ServerPlayer serverPlayer) { diff --git a/core/fabric/src/main/resources/fabric.mod.json b/core/fabric/src/main/resources/fabric.mod.json index df04608..449f046 100644 --- a/core/fabric/src/main/resources/fabric.mod.json +++ b/core/fabric/src/main/resources/fabric.mod.json @@ -21,12 +21,6 @@ "entrypoints": { "main": [ "lgbt.greenhouse.cowponents.impl.fabric.CowponentsFabric" - ], - "client": [ - "lgbt.greenhouse.cowponents.impl.fabric.client.CowponentsClientFabric" - ], - "server": [ - "lgbt.greenhouse.cowponents.impl.fabric.server.dedicated.CowponentsDedicatedFabric" ] }, "mixins": [ diff --git a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/platform/CowponentsPlatformHelperNeoForge.java b/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/platform/CowponentsPlatformHelperNeoForge.java index 854dc5b..e037364 100644 --- a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/platform/CowponentsPlatformHelperNeoForge.java +++ b/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/platform/CowponentsPlatformHelperNeoForge.java @@ -4,10 +4,15 @@ import lgbt.greenhouse.cowponents.impl.neoforge.CowponentsNeoForge; import lgbt.greenhouse.cowponents.impl.platform.CowponentsPlatformHelper; import lgbt.greenhouse.cowponents.impl.platform.Platform; import lgbt.greenhouse.cowponents.impl.platform.side.Side; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.neoforged.fml.LogicalSide; import net.neoforged.fml.ModList; import net.neoforged.fml.loading.FMLLoader; import net.neoforged.fml.util.thread.SidedThreadGroup; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; +import net.neoforged.neoforge.network.PacketDistributor; import org.jetbrains.annotations.ApiStatus; public class CowponentsPlatformHelperNeoForge implements CowponentsPlatformHelper { @@ -30,16 +35,23 @@ public class CowponentsPlatformHelperNeoForge implements CowponentsPlatformHelpe public Side getSide() { return switch (FMLLoader.getCurrent().getDist()) { case CLIENT -> Side.CLIENT; - case DEDICATED_SERVER -> Side.SERVER; + case DEDICATED_SERVER -> Side.DEDICATED; }; } @Override - public Side getCurrentThreadSide() { - if (!(Thread.currentThread().getThreadGroup() instanceof SidedThreadGroup sided)) { - return Side.SERVER; - } - return sided.getSide() == LogicalSide.CLIENT ? Side.CLIENT : Side.SERVER; + public void sendClientbound(ServerPlayer player, CustomPacketPayload payload) { + PacketDistributor.sendToPlayer(player, payload); + } + + @Override + public void sendClientboundTracking(Entity entity, CustomPacketPayload payload) { + PacketDistributor.sendToPlayersTrackingEntityAndSelf(entity, payload); + } + + @Override + public void sendServerbound(CustomPacketPayload payload) { + ClientPacketDistributor.sendToServer(payload); } @Override diff --git a/core/xplat/build.gradle.kts b/core/xplat/build.gradle.kts index 5d414dc..edf8395 100644 --- a/core/xplat/build.gradle.kts +++ b/core/xplat/build.gradle.kts @@ -1,6 +1,4 @@ import lgbt.greenhouse.cowponents.gradle.Properties -import org.gradle.jvm.component.internal.DefaultJvmSoftwareComponent -import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal plugins { id("conventions.xplat") @@ -8,38 +6,8 @@ plugins { alias(libs.plugins.mod.publish) } -val apiComponent = components.create("api") as DefaultJvmSoftwareComponent val props = Properties.MODULES["core"]!! -configurations { - register("xplatJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - getByName("apiElements") { - outgoing { - capability("${props.group}:${props.modId}:${props.version}") - } - } - register("apiCompileElements") { - outgoing { - capability("${props.group}:${props.modId}-api:${props.version}") - } - } -} - dependencies { compileOnly(libs.mixin) compileOnly(libs.mixin.extras) @@ -57,70 +25,3 @@ neoForge { setAccessTransformers(at) validateAccessTransformers = true } - -tasks { - register("apiJar") { - archiveBaseName.set(props.modId) - archiveClassifier = "api" - - dependsOn(named("jar")) - - from(zipTree(getByName("jar").archiveFile)) - includes.add("lgbt/greenhouse/cowponents/entities/api/v1/**") - } -} - -tasks.getByName("assemble").dependsOn("apiJar") - -artifacts { - add("xplatJava", sourceSets["main"].java.sourceDirectories.singleFile) - add("xplatResources", sourceSets["main"].resources.sourceDirectories.singleFile) - add("xplatTestJava", sourceSets["test"].java.sourceDirectories.singleFile) - add("xplatTestResources", sourceSets["test"].resources.sourceDirectories.singleFile) -} - -project.afterEvaluate { - val main = sourceSets["main"]!! - - configurations.getByName("apiCompileElements") { - extendsFrom(configurations[main.apiConfigurationName]) - attributes { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.LIBRARY)) - attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements::class, LibraryElements.JAR)) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class, Usage.JAVA_API)) - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling::class, Bundling.EXTERNAL)) - var languageVersion = java.toolchain.languageVersion - if (languageVersion.isPresent) { - attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, languageVersion.get().asInt()) - } - } - } - - artifacts.add( - "apiCompileElements", - tasks.getByName("apiJar") - ) { - classifier = "api" - } - - apiComponent.addVariantsFromConfiguration(configurations["apiCompileElements"]) { - mapToMavenScope("compile") - mapToOptional() - } - - apiComponent.addVariantsFromConfiguration(configurations[main.sourcesElementsConfigurationName]) { - mapToOptional() - } - apiComponent.addVariantsFromConfiguration(configurations[main.javadocElementsConfigurationName]) { - mapToOptional() - } -} - -publishing { - publications { - create("mavenJavaApi") { - artifactId = props.modId + "-api" - from(components["api"]) - } - } -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/NetworkableComponentChange.java b/core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/NetworkableComponentChange.java similarity index 88% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/NetworkableComponentChange.java rename to core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/NetworkableComponentChange.java index c113dc0..0188642 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/NetworkableComponentChange.java +++ b/core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/NetworkableComponentChange.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.impl.network; +package lgbt.greenhouse.cowponents.impl.network; import io.netty.buffer.ByteBuf; import lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils; @@ -41,30 +41,20 @@ public sealed interface NetworkableComponentChange permits NetworkableCompone static List> createChangeList(DataComponentPatch patch, HashedPatchMap oldPatchMap, HashedPatchMap.HashGenerator hashGenerator) { List> list = new ArrayList<>(); - for (var entry : patch.entrySet()) { - DataComponentType type = entry.getKey(); - if ( - entry.getValue().isPresent() - && ( - !oldPatchMap.addedComponents().containsKey(type) - || !hashGenerator.apply( - new TypedDataComponent<>( - castComponentType(type), - entry.getValue().get() - ) - ).equals(oldPatchMap.addedComponents().get(type)) - ) - ) { - list.add(new NetworkableComponentChange.Added<>(castComponentType(type), entry.getValue().get())); - continue; + DataComponentPatch.SplitResult split = patch.split(); + + for (TypedDataComponent added : split.added()) { + if (!oldPatchMap.addedComponents().containsKey(added.type()) || !hashGenerator.apply(added).equals(oldPatchMap.addedComponents().get(added.type()))) { + list.add(new NetworkableComponentChange.Added<>(castComponentType(added.type()), added.value())); } + } - if (entry.getValue().isEmpty() && !oldPatchMap.removedComponents().contains(type)) { - list.add(new NetworkableComponentChange.Removed<>(type)); + for (DataComponentType removed : split.removed()) { + if (!oldPatchMap.removedComponents().contains(removed)) { + list.add(new NetworkableComponentChange.Removed<>(removed)); } } - DataComponentPatch.SplitResult split = patch.split(); for (DataComponentType oldAdded : oldPatchMap.addedComponents().keySet()) { if (!split.added().has(oldAdded) && !split.removed().contains(oldAdded)) { list.add(new NetworkableComponentChange.Unpatched<>(oldAdded)); diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/package-info.java b/core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/package-info.java similarity index 70% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/package-info.java rename to core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/package-info.java index 378ac53..c0d051b 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/package-info.java +++ b/core/xplat/src/main/java/lgbt/greenhouse/cowponents/impl/network/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.instances.impl; +package lgbt.greenhouse.cowponents.impl.network; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/entities/fabric/build.gradle.kts b/entities/fabric/build.gradle.kts new file mode 100644 index 0000000..8de0046 --- /dev/null +++ b/entities/fabric/build.gradle.kts @@ -0,0 +1,37 @@ +import lgbt.greenhouse.cowponents.gradle.Properties + +plugins { + id("conventions.loader") + id("conventions.submodule") + alias(libs.plugins.loom) + alias(libs.plugins.mod.publish) +} + +val props = Properties.MODULES["entities"]!! + +dependencies { + minecraft(libs.minecraft) + + implementation(libs.fabric.loader) + implementation(libs.fabric.api) + + api(project(":core_fabric")) + "localCompile"(project(":extensions_fabric")) +} + +loom { + val aw = file("src/main/resources/${props.modId}.classtweaker") + if (aw.exists()) + accessWidenerPath.set(aw) + mods { + register(props.modId) { + sourceSet(sourceSets["main"]) + } + } +} + +tasks { + named("processResources").configure { + exclude("${props.modId}.cfg") + } +} diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/CowponentsInstancesFabric.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/CowponentsEntitiesFabric.java similarity index 69% rename from instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/CowponentsInstancesFabric.java rename to entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/CowponentsEntitiesFabric.java index 5cfe457..8fff10b 100644 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/CowponentsInstancesFabric.java +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/CowponentsEntitiesFabric.java @@ -1,10 +1,10 @@ -package lgbt.greenhouse.cowponents.instances.impl.fabric; +package lgbt.greenhouse.cowponents.entities.impl.fabric; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentType; -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; -import lgbt.greenhouse.cowponents.instances.impl.world.entity.EntityComponentUtils; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentType; +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.EntityComponentUtils; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.entity.event.v1.ServerEntityLevelChangeEvents; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; @@ -14,10 +14,10 @@ import net.minecraft.core.component.DataComponentPatch; import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; -public class CowponentsInstancesFabric implements ModInitializer { +public class CowponentsEntitiesFabric implements ModInitializer { @Override public void onInitialize() { - CowponentsInstances.init(); + CowponentsEntities.init(); registerEvents(); registerPayloads(); } @@ -32,7 +32,7 @@ public class CowponentsInstancesFabric implements ModInitializer { DataComponentPatch.Builder patch = DataComponentPatch.builder(); for (var entry : CowponentsEntityHelper.getComponentsPatch(oldPlayer).entrySet()) { - if (!alive && !((CowponentsInstancesDataComponentType)entry.getKey()).cowponents$transferOnDeath()) + if (!alive && !((CowponentsEntityDataComponentType)entry.getKey()).cowponents$transferOnDeath()) continue; entry.getValue().ifPresentOrElse( @@ -52,6 +52,6 @@ public class CowponentsInstancesFabric implements ModInitializer { } public static void registerPayloads() { - PayloadTypeRegistry.clientboundPlay().register(SyncEntityComponentPacket.TYPE, SyncEntityComponentPacket.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(SyncEntityComponentPacketClientbound.TYPE, SyncEntityComponentPacketClientbound.STREAM_CODEC); } } diff --git a/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/CowponentsEntitiesClientFabric.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/CowponentsEntitiesClientFabric.java new file mode 100644 index 0000000..287f86d --- /dev/null +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/CowponentsEntitiesClientFabric.java @@ -0,0 +1,18 @@ +package lgbt.greenhouse.cowponents.entities.impl.fabric.client; + +import lgbt.greenhouse.cowponents.entities.impl.client.network.CowponentsEntitiesClientNetworkHandlers; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; + +public class CowponentsEntitiesClientFabric implements ClientModInitializer { + @Override + public void onInitializeClient() { + registerPayloads(); + } + + public static void registerPayloads() { + ClientPlayNetworking.registerGlobalReceiver(SyncEntityComponentPacketClientbound.TYPE, + (payload, _) -> CowponentsEntitiesClientNetworkHandlers.syncEntityComponentPatch(payload)); + } +} diff --git a/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/package-info.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/package-info.java new file mode 100644 index 0000000..a4a271d --- /dev/null +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/client/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.fabric.client; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/client/package-info.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/package-info.java similarity index 67% rename from core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/client/package-info.java rename to entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/package-info.java index 63ae249..053c9b0 100644 --- a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/client/package-info.java +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.impl.neoforge.client; +package lgbt.greenhouse.cowponents.entities.impl.fabric; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/CowponentsInstancesDedicatedFabric.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/CowponentsEntitiesDedicatedFabric.java similarity index 51% rename from instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/CowponentsInstancesDedicatedFabric.java rename to entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/CowponentsEntitiesDedicatedFabric.java index 886be91..6bd4070 100644 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/CowponentsInstancesDedicatedFabric.java +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/CowponentsEntitiesDedicatedFabric.java @@ -1,8 +1,8 @@ -package lgbt.greenhouse.cowponents.instances.impl.fabric.server.dedicated; +package lgbt.greenhouse.cowponents.entities.impl.fabric.server.dedicated; import net.fabricmc.api.DedicatedServerModInitializer; -public class CowponentsInstancesDedicatedFabric implements DedicatedServerModInitializer { +public class CowponentsEntitiesDedicatedFabric implements DedicatedServerModInitializer { @Override public void onInitializeServer() { registerEvents(); diff --git a/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/package-info.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/package-info.java new file mode 100644 index 0000000..280437c --- /dev/null +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/dedicated/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.fabric.server.dedicated; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/package-info.java b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/package-info.java new file mode 100644 index 0000000..7d7f9de --- /dev/null +++ b/entities/fabric/src/main/java/lgbt/greenhouse/cowponents/entities/impl/fabric/server/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.fabric.server; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/instances/fabric/src/main/resources/cowponents_instances.classtweaker b/entities/fabric/src/main/resources/cowponents_entities.classtweaker similarity index 100% rename from instances/fabric/src/main/resources/cowponents_instances.classtweaker rename to entities/fabric/src/main/resources/cowponents_entities.classtweaker diff --git a/instances/fabric/src/main/resources/fabric.mod.json b/entities/fabric/src/main/resources/fabric.mod.json similarity index 73% rename from instances/fabric/src/main/resources/fabric.mod.json rename to entities/fabric/src/main/resources/fabric.mod.json index d16c627..d89802b 100644 --- a/instances/fabric/src/main/resources/fabric.mod.json +++ b/entities/fabric/src/main/resources/fabric.mod.json @@ -20,13 +20,13 @@ "environment": "*", "entrypoints": { "main": [ - "lgbt.greenhouse.cowponents.instances.impl.fabric.CowponentsInstancesFabric" + "lgbt.greenhouse.cowponents.entities.impl.fabric.CowponentsEntitiesFabric" ], "client": [ - "lgbt.greenhouse.cowponents.instances.impl.fabric.client.CowponentsInstancesClientFabric" + "lgbt.greenhouse.cowponents.entities.impl.fabric.client.CowponentsEntitiesClientFabric" ], "server": [ - "lgbt.greenhouse.cowponents.instances.impl.fabric.server.dedicated.CowponentsInstancesDedicatedFabric" + "lgbt.greenhouse.cowponents.entities.impl.fabric.server.dedicated.CowponentsEntitiesDedicatedFabric" ] }, "mixins": [ diff --git a/entities/neoforge/build.gradle.kts b/entities/neoforge/build.gradle.kts new file mode 100644 index 0000000..0958bfe --- /dev/null +++ b/entities/neoforge/build.gradle.kts @@ -0,0 +1,31 @@ +import lgbt.greenhouse.cowponents.gradle.Properties + +plugins { + id("conventions.loader") + id("conventions.submodule") + alias(libs.plugins.moddev) + alias(libs.plugins.mod.publish) +} + +val props = Properties.MODULES["entities"]!! + +dependencies { + api(project(":core_neoforge")) + "localCompile"(project(":extensions_neoforge")) +} + +neoForge { + version = libs.versions.neoforge.get() + addModdingDependenciesTo(sourceSets["test"]) + + val at = project(":entities_xplat").file("src/main/resources/${props.modId}.cfg") + if (at.exists()) + setAccessTransformers(at) + validateAccessTransformers = true + + mods { + register(props.modId) { + sourceSet(sourceSets["main"]) + } + } +} diff --git a/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/CowponentsInstancesNeoForge.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/CowponentsInstancesNeoForge.java new file mode 100644 index 0000000..ad8798c --- /dev/null +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/CowponentsInstancesNeoForge.java @@ -0,0 +1,83 @@ +package lgbt.greenhouse.cowponents.entities.impl.neoforge; + +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentType; +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.EntityComponentUtils; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; + +import java.util.ArrayList; +import java.util.List; + +import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; + +@Mod(CowponentsEntities.MOD_ID) +@EventBusSubscriber(modid = CowponentsEntities.MOD_ID) +public class CowponentsInstancesNeoForge { + public static final List DEFERRED_RUNNABLES = new ArrayList<>(); + + public CowponentsInstancesNeoForge(IEventBus eventBus) { + CowponentsEntities.init(); + } + + @SubscribeEvent + public static void onPlayerClone(PlayerEvent.Clone event) { + Player oldPlayer = event.getOriginal(); + Player newPlayer = event.getEntity(); + boolean wasDeath = event.isWasDeath(); + + if (CowponentsEntityHelper.getComponentsPatch(oldPlayer).isEmpty()) + return; + + DataComponentPatch.Builder patch = DataComponentPatch.builder(); + for (var entry : CowponentsEntityHelper.getComponentsPatch(oldPlayer).entrySet()) { + if (wasDeath && !((CowponentsEntityDataComponentType)entry.getKey()).cowponents$transferOnDeath()) + continue; + + entry.getValue().ifPresentOrElse( + value -> patch.set(castComponentType(entry.getKey()), value), + () -> patch.remove(entry.getKey()) + ); + } + CowponentsEntityHelper.applyComponentsAndValidate(newPlayer, patch.build()); + EntityComponentUtils.syncComponents(newPlayer); + } + + @SubscribeEvent + public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + if (event.getEntity() instanceof ServerPlayer serverPlayer) { + EntityComponentUtils.syncComponentsToPlayer(serverPlayer, serverPlayer); + } + } + + @SubscribeEvent + public static void onPlayerStartTracking(PlayerEvent.StartTracking event) { + if (event.getEntity() instanceof ServerPlayer serverPlayer) { + EntityComponentUtils.syncComponentsToPlayer(event.getTarget(), serverPlayer); + } + } + + @SubscribeEvent + public static void onFmlCommonSetup(FMLCommonSetupEvent event) { + DEFERRED_RUNNABLES.forEach(event::enqueueWork); + } + + @SubscribeEvent + public static void registerPayloadHandlers(RegisterPayloadHandlersEvent event) { + event.registrar("1.0.0") + .playToClient( + SyncEntityComponentPacketClientbound.TYPE, + SyncEntityComponentPacketClientbound.STREAM_CODEC + ); + } +} diff --git a/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/CowponentsInstancesClientNeoForge.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/CowponentsInstancesClientNeoForge.java new file mode 100644 index 0000000..a76dc8a --- /dev/null +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/CowponentsInstancesClientNeoForge.java @@ -0,0 +1,27 @@ +package lgbt.greenhouse.cowponents.entities.impl.neoforge.client; + +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import lgbt.greenhouse.cowponents.entities.impl.client.network.CowponentsEntitiesClientNetworkHandlers; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; + +@Mod(value = CowponentsEntities.MOD_ID, dist = Dist.CLIENT) +@EventBusSubscriber(modid = CowponentsEntities.MOD_ID, value = Dist.CLIENT) +public class CowponentsInstancesClientNeoForge { + public CowponentsInstancesClientNeoForge(IEventBus eventBus) { + + } + + @SubscribeEvent + public static void registerClientPayloadHandlers(RegisterClientPayloadHandlersEvent event) { + event.register( + SyncEntityComponentPacketClientbound.TYPE, + (packet, _) -> CowponentsEntitiesClientNetworkHandlers.syncEntityComponentPatch(packet) + ); + } +} diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/package-info.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/package-info.java similarity index 64% rename from instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/package-info.java rename to entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/package-info.java index 1f0830c..60d3e8b 100644 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/package-info.java +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/client/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.instances.impl.fabric.client; +package lgbt.greenhouse.cowponents.entities.impl.neoforge.client; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/package-info.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/package-info.java similarity index 67% rename from instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/package-info.java rename to entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/package-info.java index c176d3a..01c3c02 100644 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/package-info.java +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.instances.impl.fabric; +package lgbt.greenhouse.cowponents.entities.impl.neoforge; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java new file mode 100644 index 0000000..b719fa4 --- /dev/null +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java @@ -0,0 +1,10 @@ +package lgbt.greenhouse.cowponents.entities.impl.neoforge.server.dedicated; + +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.fml.common.Mod; + +@Mod(value = CowponentsEntities.MOD_ID, dist = Dist.DEDICATED_SERVER) +public class CowponentsInstancesDedicatedNeoForge { + +} diff --git a/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/package-info.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/package-info.java new file mode 100644 index 0000000..49cc70a --- /dev/null +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/dedicated/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.neoforge.server.dedicated; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/package-info.java b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/package-info.java new file mode 100644 index 0000000..2687627 --- /dev/null +++ b/entities/neoforge/src/main/java/lgbt/greenhouse/cowponents/entities/impl/neoforge/server/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.neoforge.server; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/entities/neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 100% rename from instances/neoforge/src/main/resources/META-INF/neoforge.mods.toml rename to entities/neoforge/src/main/resources/META-INF/neoforge.mods.toml diff --git a/entities/xplat/build.gradle.kts b/entities/xplat/build.gradle.kts new file mode 100644 index 0000000..6266250 --- /dev/null +++ b/entities/xplat/build.gradle.kts @@ -0,0 +1,29 @@ +import lgbt.greenhouse.cowponents.gradle.Properties + +plugins { + id("conventions.xplat") + id("conventions.submodule") + alias(libs.plugins.moddev) + alias(libs.plugins.mod.publish) +} + +val props = Properties.MODULES["entities"]!! + +dependencies { + compileOnly(libs.mixin) + compileOnly(libs.mixin.extras) + annotationProcessor(libs.mixin.extras) + + api(project(":core_xplat")) + "localCompile"(project(":extensions_xplat")) +} + +neoForge { + neoFormVersion = libs.versions.neoform.get() + addModdingDependenciesTo(sourceSets["test"]) + + val at = file("src/main/resources/${props.modId}.cfg") + if (at.exists()) + setAccessTransformers(at) + validateAccessTransformers = true +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesDataComponentTypeBuilderWrapper.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesDataComponentTypeBuilderWrapper.java new file mode 100644 index 0000000..86df481 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesDataComponentTypeBuilderWrapper.java @@ -0,0 +1,62 @@ +package lgbt.greenhouse.cowponents.entities.api.v1; + +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentTypeBuilder; +import net.minecraft.core.component.DataComponentType; +import org.jspecify.annotations.NonNull; + +/** + * A wrapper for {@link DataComponentType.Builder} for cross-platform implementations + * that do not support interface injection. + * + * @param The component value type. + */ +public class CowponentsEntitiesDataComponentTypeBuilderWrapper { + /** + * Wraps a {@link DataComponentType.Builder} to allow it to use Cowponents: Instances methods. + * + * @param toWrap A data component type builder. + * @param The component value type. + * @return A wrapper wrapping the data component type builder. + */ + public static CowponentsEntitiesDataComponentTypeBuilderWrapper wrap(DataComponentType.Builder toWrap) { + return new CowponentsEntitiesDataComponentTypeBuilderWrapper<>(toWrap); + } + + private final DataComponentType.Builder wrapped; + + private CowponentsEntitiesDataComponentTypeBuilderWrapper(DataComponentType.Builder wrapped) { + this.wrapped = wrapped; + } + + /** + * Whether to transfer this component back to the new instance of a player when they die. + * + * @return This builder. + */ + @NonNull + public CowponentsEntitiesDataComponentTypeBuilderWrapper transferOnDeath() { + //noinspection unchecked + ((CowponentsEntityDataComponentTypeBuilder) wrapped).cowponents$transferOnDeath(); + return this; + } + + /** + * Unwraps the {@link DataComponentType.Builder}. + * + * @return The wrapped data component type builder. + */ + public DataComponentType.Builder unwrap() { + return wrapped; + } + + /** + * Builds the wrapped builder. + *

+ * Provided for convenience to avoid unnecessary unwrapping. + * + * @return A built {@link DataComponentType} + */ + public DataComponentType build() { + return wrapped.build(); + } +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesEntityTypeBuilderWrapper.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesEntityTypeBuilderWrapper.java new file mode 100644 index 0000000..bdd53d8 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesEntityTypeBuilderWrapper.java @@ -0,0 +1,73 @@ +package lgbt.greenhouse.cowponents.entities.api.v1; + +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityTypeBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponentInitializers; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; + +/** + * A wrapper for {@link EntityType.Builder} for cross-platform implementations + * that do not support interface injection. + * + * @param The entity class. + */ +public class CowponentsEntitiesEntityTypeBuilderWrapper { + /** + * Wraps a {@link DataComponentType.Builder} to allow it to use Cowponents: Instances methods. + * + * @param toWrap A data component type builder. + * @param The entity type. + * @return A wrapper wrapping the entity type builder. + */ + public static CowponentsEntitiesEntityTypeBuilderWrapper wrap(EntityType.Builder toWrap) { + return new CowponentsEntitiesEntityTypeBuilderWrapper<>(toWrap); + } + + private final EntityType.Builder wrapped; + + private CowponentsEntitiesEntityTypeBuilderWrapper(EntityType.Builder wrapped) { + this.wrapped = wrapped; + } + + public CowponentsEntitiesEntityTypeBuilderWrapper components(DataComponentType type, T value) { + //noinspection unchecked + ((CowponentsEntityTypeBuilder) this.wrapped).cowponents$component(type, value); + return this; + } + + public CowponentsEntitiesEntityTypeBuilderWrapper delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { + //noinspection unchecked + ((CowponentsEntityTypeBuilder) this.wrapped).cowponents$delayedComponent(type, initializer); + return this; + } + + + public CowponentsEntitiesEntityTypeBuilderWrapper delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { + //noinspection unchecked + ((CowponentsEntityTypeBuilder) this.wrapped).cowponents$delayedHolderComponent(type, valueKey); + return this; + } + + /** + * Unwraps the {@link EntityType.Builder}. + * + * @return The wrapped entity type builder. + */ + public EntityType.Builder unwrap() { + return wrapped; + } + + /** + * Builds the wrapped builder. + *

+ * Provided for convenience to avoid unnecessary unwrapping. + * + * @return A built {@link EntityType} + */ + public EntityType build(ResourceKey> key) { + return wrapped.build(key); + } +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesInheritanceIds.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesInheritanceIds.java new file mode 100644 index 0000000..e2c0e5a --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntitiesInheritanceIds.java @@ -0,0 +1,7 @@ +package lgbt.greenhouse.cowponents.entities.api.v1; + +import net.minecraft.resources.Identifier; + +public class CowponentsEntitiesInheritanceIds { + public static final Identifier ENTITY = Identifier.withDefaultNamespace("entity"); +} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsEntityHelper.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntityHelper.java similarity index 54% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsEntityHelper.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntityHelper.java index 20fb7be..14f45df 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/CowponentsEntityHelper.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/CowponentsEntityHelper.java @@ -1,6 +1,6 @@ -package lgbt.greenhouse.cowponents.instances.api.v1; +package lgbt.greenhouse.cowponents.entities.api.v1; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsComponentHolder; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityComponentHolder; import net.minecraft.core.component.*; import net.minecraft.world.entity.Entity; import org.jspecify.annotations.Nullable; @@ -12,69 +12,69 @@ import java.util.stream.Stream; public class CowponentsEntityHelper { @Nullable public static T get(Entity entity, DataComponentType componentType) { - return ((CowponentsComponentHolder) entity).cowponents$get(componentType); + return ((CowponentsEntityComponentHolder) entity).cowponents$get(componentType); } public static T getOrDefault(Entity entity, DataComponentType componentType, T defaultValue) { - return ((CowponentsComponentHolder) entity).cowponents$getOrDefault(componentType, defaultValue); + return ((CowponentsEntityComponentHolder) entity).cowponents$getOrDefault(componentType, defaultValue); } public static boolean has(Entity entity, DataComponentType componentType) { - return ((CowponentsComponentHolder) entity).cowponents$has(componentType); + return ((CowponentsEntityComponentHolder) entity).cowponents$has(componentType); } public static boolean hasNonDefault(Entity entity, DataComponentType componentType) { - return ((CowponentsComponentHolder) entity).cowponents$hasNonDefault(componentType); + return ((CowponentsEntityComponentHolder) entity).cowponents$hasNonDefault(componentType); } @Nullable public static T set(Entity entity, DataComponentType type, @Nullable T value) { - return ((CowponentsComponentHolder) entity).cowponents$set(type, value); + return ((CowponentsEntityComponentHolder) entity).cowponents$set(type, value); } @Nullable public static T set(Entity entity, TypedDataComponent type) { - return ((CowponentsComponentHolder) entity).cowponents$set(type); + return ((CowponentsEntityComponentHolder) entity).cowponents$set(type); } public static T remove(Entity entity, DataComponentType type) { - return ((CowponentsComponentHolder) entity).cowponents$remove(type); + return ((CowponentsEntityComponentHolder) entity).cowponents$remove(type); } @Nullable public static T update(Entity entity, DataComponentType type, T defaultValue, U value, BiFunction combiner) { - return ((CowponentsComponentHolder) entity).cowponents$update(type, defaultValue, value, combiner); + return ((CowponentsEntityComponentHolder) entity).cowponents$update(type, defaultValue, value, combiner); } public static T update(Entity entity, DataComponentType type, T defaultValue, UnaryOperator function) { - return ((CowponentsComponentHolder) entity).cowponents$update(type, defaultValue, function); + return ((CowponentsEntityComponentHolder) entity).cowponents$update(type, defaultValue, function); } public static void copyFrom(Entity entity, DataComponentType type, DataComponentGetter source) { - ((CowponentsComponentHolder) entity).cowponents$copyFrom(type, source); + ((CowponentsEntityComponentHolder) entity).cowponents$copyFrom(type, source); } public static void applyComponentsAndValidate(Entity entity, DataComponentPatch patch) { - ((CowponentsComponentHolder) entity).cowponents$applyComponentsAndValidate(patch); + ((CowponentsEntityComponentHolder) entity).cowponents$applyComponentsAndValidate(patch); } public static Stream getAllOfType(Entity entity, Class valueClass) { - return ((CowponentsComponentHolder) entity).cowponents$getAllOfType(valueClass); + return ((CowponentsEntityComponentHolder) entity).cowponents$getAllOfType(valueClass); } public static DataComponentMap getComponents(Entity entity) { - return ((CowponentsComponentHolder) entity).cowponents$getComponents(); + return ((CowponentsEntityComponentHolder) entity).cowponents$getComponents(); } public static DataComponentMap getPrototype(Entity entity) { - return ((CowponentsComponentHolder) entity).cowponents$getPrototype(); + return ((CowponentsEntityComponentHolder) entity).cowponents$getPrototype(); } public static DataComponentPatch getComponentsPatch(Entity entity) { - return ((CowponentsComponentHolder) entity).cowponents$getComponentsPatch(); + return ((CowponentsEntityComponentHolder) entity).cowponents$getComponentsPatch(); } public static DataComponentMap immutableComponents(Entity entity) { - return ((CowponentsComponentHolder) entity).cowponents$immutableComponents(); + return ((CowponentsEntityComponentHolder) entity).cowponents$immutableComponents(); } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsDefaultEntityComponentEvents.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsDefaultEntityComponentEvents.java similarity index 79% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsDefaultEntityComponentEvents.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsDefaultEntityComponentEvents.java index 0288bf7..e1e045b 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsDefaultEntityComponentEvents.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsDefaultEntityComponentEvents.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.event; +package lgbt.greenhouse.cowponents.entities.api.v1.event; import dev.yumi.commons.event.Event; import dev.yumi.mc.core.api.YumiEvents; @@ -15,28 +15,28 @@ public class CowponentsDefaultEntityComponentEvents { public interface ModifyContext { /** - * Modify the default data addedComponents of the specified item. + * Modify the default data components of the specified item. * * @param entityTypePredicate A predicate to match entity types to modify - * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} and a {@link HolderLookup.Provider} to modify the entity's addedComponents. + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} and a {@link HolderLookup.Provider} to modify the entity's components. */ void modify(Predicate> entityTypePredicate, ModifyConsumer builderConsumer); /** - * Modify the default data addedComponents of the specified item. + * Modify the default data components of the specified item. * * @param entityType The entity types to modify - * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's addedComponents. + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's components. */ default void modify(EntityType entityType, ModifyConsumer builderConsumer) { modify(Predicate.isEqual(entityType), builderConsumer); } /** - * Modify the default data addedComponents of the specified items. + * Modify the default data components of the specified items. * * @param entityTypes The entity types to modify - * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's addedComponents. + * @param builderConsumer A consumer that provides a {@link DataComponentMap.Builder} to modify the item's components. */ default void modify(Collection> entityTypes, ModifyConsumer builderConsumer) { modify(entityTypes::contains, builderConsumer); @@ -46,7 +46,7 @@ public class CowponentsDefaultEntityComponentEvents { @FunctionalInterface public interface ModifyCallback { /** - * Modify the default data addedComponents of entity types using the provided {@link ModifyContext} instance. + * Modify the default data components of entity types using the provided {@link ModifyContext} instance. * * @param context The context to modify entity types */ diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsEntityInheritanceEvents.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsEntityEvents.java similarity index 75% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsEntityInheritanceEvents.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsEntityEvents.java index 33b9ed9..6a09ca2 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsEntityInheritanceEvents.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/event/CowponentsEntityEvents.java @@ -1,17 +1,27 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.event; +package lgbt.greenhouse.cowponents.entities.api.v1.event; +import dev.yumi.commons.event.Event; import dev.yumi.commons.event.FilteredEvent; import dev.yumi.mc.core.api.YumiEvents; +import lgbt.greenhouse.cowponents.api.v1.event.CowponentsValidationEvents; import lgbt.greenhouse.cowponents.extensions.api.v1.event.InheritComponentCallback; import lgbt.greenhouse.cowponents.extensions.impl.event.CowponentsInheritanceEventsImpl; +import lgbt.greenhouse.cowponents.impl.util.ComponentValidationUtils; import net.minecraft.core.component.DataComponentType; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import static lgbt.greenhouse.cowponents.instances.impl.event.CowponentsInstancesInheritanceEventsImpl.INHERIT_FROM_ENTITY_MAP; +import static lgbt.greenhouse.cowponents.entities.impl.event.CowponentsEntitiesEventsImpl.INHERIT_FROM_ENTITY_MAP; + +public class CowponentsEntityEvents { + /** + * An event used to validate addedComponents alongside other addedComponents specifically in an entity context. + *

+ * Returning a DataResult#error within this event will roll back any addedComponents to what they were previously. + */ + public static final Event VALIDATE_ENTITY_COMPONENTS = YumiEvents.EVENTS.create(CowponentsValidationEvents.ValidateComponentsCallback.class, ComponentValidationUtils::validationCallback); -public class CowponentsEntityInheritanceEvents { public static final FilteredEvent, DataComponentType> INHERIT_FROM_ENTITY = YumiEvents.EVENTS.createFiltered(InheritComponentCallback.class, DataComponentType.class, callbacks -> (entity, registries) -> { for (var callback : callbacks) { Object value = callback.inherit(entity, registries); diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsComponentHolder.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityComponentHolder.java similarity index 96% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsComponentHolder.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityComponentHolder.java index 779b09c..6ca9841 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsComponentHolder.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityComponentHolder.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.extension; +package lgbt.greenhouse.cowponents.entities.api.v1.extension; import net.minecraft.core.component.*; import org.jspecify.annotations.Nullable; @@ -7,7 +7,7 @@ import java.util.function.BiFunction; import java.util.function.UnaryOperator; import java.util.stream.Stream; -public interface CowponentsComponentHolder { +public interface CowponentsEntityComponentHolder { default DataComponentMap cowponents$getComponents() { throw new AssertionError("Implemented via mixin."); } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentType.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentType.java similarity index 76% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentType.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentType.java index c6c3f1c..e2a340c 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentType.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentType.java @@ -1,11 +1,11 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.extension; +package lgbt.greenhouse.cowponents.entities.api.v1.extension; import net.minecraft.core.component.DataComponentType; /** * An extension to {@link DataComponentType} for Cowponents: Instances specific fields. */ -public interface CowponentsInstancesDataComponentType { +public interface CowponentsEntityDataComponentType { /** * Whether to transfer this component back to the new instance of a player when they die. * diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentTypeBuilder.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentTypeBuilder.java similarity index 76% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentTypeBuilder.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentTypeBuilder.java index 91a80d0..3b66cb2 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsInstancesDataComponentTypeBuilder.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityDataComponentTypeBuilder.java @@ -1,11 +1,11 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.extension; +package lgbt.greenhouse.cowponents.entities.api.v1.extension; import net.minecraft.core.component.DataComponentType; /** * An extension to {@link DataComponentType.Builder} for Cowponents: Instances specific fields. */ -public interface CowponentsInstancesDataComponentTypeBuilder { +public interface CowponentsEntityDataComponentTypeBuilder { /** * Whether to transfer this component back to the new instance of a player when they die. * diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsEntityTypeBuilder.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityTypeBuilder.java similarity index 52% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsEntityTypeBuilder.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityTypeBuilder.java index cc98a5c..e538137 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/extension/CowponentsEntityTypeBuilder.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/api/v1/extension/CowponentsEntityTypeBuilder.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.extension; +package lgbt.greenhouse.cowponents.entities.api.v1.extension; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentInitializers; @@ -8,15 +8,15 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; public interface CowponentsEntityTypeBuilder { - default EntityType.Builder cowponents_instances$component(DataComponentType type, T value) { + default EntityType.Builder cowponents$component(DataComponentType type, T value) { throw new AssertionError("Implemented via mixin."); } - default EntityType.Builder cowponents_instances$delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { + default EntityType.Builder cowponents$delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { throw new AssertionError("Implemented via mixin."); } - default EntityType.Builder cowponents_instances$delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { + default EntityType.Builder cowponents$delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { throw new AssertionError("Implemented via mixin."); } } diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/CowponentsEntities.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/CowponentsEntities.java new file mode 100644 index 0000000..8ee193d --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/CowponentsEntities.java @@ -0,0 +1,36 @@ +package lgbt.greenhouse.cowponents.entities.impl; + +import lgbt.greenhouse.cowponents.extensions.api.v1.CowponentsInheritanceIdRegistry; +import lgbt.greenhouse.cowponents.extensions.api.v1.event.CowponentsInheritanceImplementationEvents; +import lgbt.greenhouse.cowponents.impl.Cowponents; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntitiesInheritanceIds; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.EntityComponentUtils; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.Entity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CowponentsEntities { + public static final String MOD_ID = "cowponents_entities"; + public static final String MOD_NAME = "Cowponents: Entities"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_NAME); + + public static void init() { + if (Cowponents.getPlatformHelper().isModLoaded("cowponents_extensions")) { + CowponentsInheritanceIdRegistry.register(Entity.class, CowponentsEntitiesInheritanceIds.ENTITY); + + CowponentsInheritanceImplementationEvents.registerObtainLookupEvent(CowponentsEntitiesInheritanceIds.ENTITY, instance -> + instance.level().registryAccess()); + + CowponentsInheritanceImplementationEvents.registerInstancedInheritEvent(CowponentsEntitiesInheritanceIds.ENTITY, EntityComponentUtils::refreshInherited); + } + } + + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(MOD_ID, path); + } + + public static Logger getLogger(String... subsystems) { + return LoggerFactory.getLogger(MOD_NAME + "/" + String.join("/", subsystems)); + } +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/CowponentsEntitiesClient.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/CowponentsEntitiesClient.java new file mode 100644 index 0000000..6574148 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/CowponentsEntitiesClient.java @@ -0,0 +1,8 @@ +package lgbt.greenhouse.cowponents.entities.impl.client; + +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import org.slf4j.Logger; + +public class CowponentsEntitiesClient { + public static final Logger LOG = CowponentsEntities.getLogger("Client"); +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/network/CowponentsEntitiesClientNetworkHandlers.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/network/CowponentsEntitiesClientNetworkHandlers.java new file mode 100644 index 0000000..3588def --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/network/CowponentsEntitiesClientNetworkHandlers.java @@ -0,0 +1,44 @@ +package lgbt.greenhouse.cowponents.entities.impl.client.network; + +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.impl.network.NetworkableComponentChange; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; +import net.minecraft.client.Minecraft; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentPatch; +import net.minecraft.world.entity.Entity; + +import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; + +public class CowponentsEntitiesClientNetworkHandlers { + public static void syncEntityComponentPatch(SyncEntityComponentPacketClientbound packet) { + Minecraft client = Minecraft.getInstance(); + client.execute(() -> { + assert client.level != null; + Entity entity = client.level.getEntity(packet.entityId()); + if (entity == null) { + return; + } + + DataComponentMap prototype = CowponentsEntityHelper.getPrototype(entity); + DataComponentPatch.Builder patch = DataComponentPatch.builder(); + + for (NetworkableComponentChange change : packet.changes()) { + switch (change.kind()) { + case ADDED -> patch.set(castComponentType(change.type()), change.value()); + case REMOVED -> patch.remove(change.type()); + case UNPATCHED -> { + Object defaultValue = prototype.get(change.type()); + if (defaultValue == null) { + patch.remove(change.type()); + continue; + } + patch.set(castComponentType(change.type()), defaultValue); + } + } + } + + CowponentsEntityHelper.applyComponentsAndValidate(entity, patch.build()); + }); + } +} diff --git a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/package-info.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/package-info.java similarity index 67% rename from core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/package-info.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/package-info.java index 40b76f5..0c14c22 100644 --- a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/package-info.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/client/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.impl.neoforge.server; +package lgbt.greenhouse.cowponents.entities.impl.client; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_HolderCowponentsEntityOriginated.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_HolderCowponentsEntityOriginated.java new file mode 100644 index 0000000..baf21b4 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_HolderCowponentsEntityOriginated.java @@ -0,0 +1,11 @@ +package lgbt.greenhouse.cowponents.entities.impl.duck; + +import net.minecraft.core.component.DataComponentType; + +import java.util.Set; + +public interface Duck_HolderCowponentsEntityOriginated { + Set> cowponents_entities$getCowponentsOriginated(); + + void cowponents_entities$setCowponentsOriginated(Set> types); +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_TransferrableOnDeath.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_TransferrableOnDeath.java new file mode 100644 index 0000000..ca23223 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/duck/Duck_TransferrableOnDeath.java @@ -0,0 +1,5 @@ +package lgbt.greenhouse.cowponents.entities.impl.duck; + +public interface Duck_TransferrableOnDeath { + void cowponents_entities$setTransferOnDeath(boolean value); +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/event/CowponentsEntitiesEventsImpl.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/event/CowponentsEntitiesEventsImpl.java new file mode 100644 index 0000000..7e587cf --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/event/CowponentsEntitiesEventsImpl.java @@ -0,0 +1,27 @@ +package lgbt.greenhouse.cowponents.entities.impl.event; + +import dev.yumi.commons.event.ContextualizedEvent; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import lgbt.greenhouse.cowponents.extensions.api.v1.event.InheritComponentCallback; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.Entity; +import org.jspecify.annotations.Nullable; + +import java.util.Map; + +public class CowponentsEntitiesEventsImpl { + public static final Map, ContextualizedEvent, DataComponentType>> INHERIT_FROM_ENTITY_MAP = new Object2ObjectArrayMap<>(); + + @SuppressWarnings("unchecked") + @Nullable + public static T invokeComponentForEntityEvent(DataComponentType type, Entity entity, HolderLookup.Provider lookupProvider) { + if (INHERIT_FROM_ENTITY_MAP.containsKey(type)) { + return (T) INHERIT_FROM_ENTITY_MAP.get(type) + .invoker() + .inherit(entity, lookupProvider); + } + return null; + } +} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentInitializers.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentInitializers.java similarity index 85% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentInitializers.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentInitializers.java index 1640a34..8dc5cb6 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentInitializers.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentInitializers.java @@ -1,9 +1,9 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsDefaultEntityComponentEvents; -import lgbt.greenhouse.cowponents.instances.impl.world.entity.DefaultEntityComponentsImpl; +import lgbt.greenhouse.cowponents.entities.api.v1.event.CowponentsDefaultEntityComponentEvents; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.DefaultEntityComponentsImpl; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentInitializers; import net.minecraft.core.component.DataComponentMap; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilder.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilder.java similarity index 67% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilder.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilder.java index ef5c1b3..e1c527c 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilder.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilder.java @@ -1,8 +1,8 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentTypeBuilder; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_TransferrableOnDeath; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentTypeBuilder; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_TransferrableOnDeath; import net.minecraft.core.component.DataComponentType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; @SuppressWarnings("unchecked") @Mixin(DataComponentType.Builder.class) -public class Mixin_DataComponentTypeBuilder implements CowponentsInstancesDataComponentTypeBuilder { +public class Mixin_DataComponentTypeBuilder implements CowponentsEntityDataComponentTypeBuilder { @Unique private boolean cowponents_instances$transferOnDeath = false; @@ -22,7 +22,7 @@ public class Mixin_DataComponentTypeBuilder implements CowponentsInstancesDat @ModifyReturnValue(method = "build", at = @At("RETURN")) private DataComponentType cowponents_instances$setTransferOnDeath(DataComponentType original) { - ((Duck_TransferrableOnDeath) original).cowponents_instances$setTransferOnDeath(cowponents_instances$transferOnDeath); + ((Duck_TransferrableOnDeath) original).cowponents_entities$setTransferOnDeath(cowponents_instances$transferOnDeath); return original; } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java similarity index 55% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java index 08a5733..28a9d32 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_DataComponentTypeBuilderSimpleType.java @@ -1,12 +1,12 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentType; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_TransferrableOnDeath; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentType; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_TransferrableOnDeath; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @Mixin(targets = "net/minecraft/core/component/DataComponentType$Builder$SimpleType") -public class Mixin_DataComponentTypeBuilderSimpleType implements CowponentsInstancesDataComponentType, Duck_TransferrableOnDeath { +public class Mixin_DataComponentTypeBuilderSimpleType implements CowponentsEntityDataComponentType, Duck_TransferrableOnDeath { @Unique private boolean cowponents_instances$transferOnDeath = false; @@ -16,7 +16,7 @@ public class Mixin_DataComponentTypeBuilderSimpleType implements CowponentsIn } @Override - public void cowponents_instances$setTransferOnDeath(boolean value) { + public void cowponents_entities$setTransferOnDeath(boolean value) { cowponents_instances$transferOnDeath = value; } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_Entity.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_Entity.java similarity index 85% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_Entity.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_Entity.java index d8d146b..ceeb5a2 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_Entity.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_Entity.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -12,10 +12,10 @@ import lgbt.greenhouse.cowponents.extensions.impl.util.InheritedValueUtils; import lgbt.greenhouse.cowponents.impl.Cowponents; import lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils; import lgbt.greenhouse.cowponents.impl.util.ComponentCodecUtils; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsComponentHolder; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_HolderCowponentsOriginated; -import lgbt.greenhouse.cowponents.instances.impl.world.entity.EntityComponentUtils; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityComponentHolder; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_HolderCowponentsEntityOriginated; +import lgbt.greenhouse.cowponents.entities.impl.world.entity.EntityComponentUtils; import net.minecraft.core.Holder; import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.*; @@ -25,6 +25,7 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; +import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -38,7 +39,7 @@ import java.util.Optional; import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; @Mixin(Entity.class) -public abstract class Mixin_Entity implements CowponentsComponentHolder { +public abstract class Mixin_Entity implements CowponentsEntityComponentHolder { @Unique private PatchedDataComponentMap cowponents$components; @Unique @@ -48,7 +49,7 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { private LoadingCache, Integer> cowponents$componentCache = CacheBuilder.newBuilder() .maximumSize(256L) .build(new CacheLoader<>() { - public Integer load(TypedDataComponent component) { + public @NonNull Integer load(@NonNull TypedDataComponent component) { return ComponentCodecUtils.getComponentHash(component, Mixin_Entity.this.registryAccess()); } }); @@ -81,7 +82,11 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { @Inject(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;readAdditionalSaveData(Lnet/minecraft/world/level/storage/ValueInput;)V")) private void cowponents_instances$loadComponentPatch(ValueInput input, CallbackInfo ci) { - input.read("cowponents:components", DataComponentPatch.CODEC).ifPresent(this::cowponents$applyComponentsAndValidate); + input.read("cowponents:components", DataComponentPatch.CODEC).ifPresent(patch -> { + DataComponentPatch oldPatch = cowponents$getComponentsPatch(); + cowponents$components.clearPatch(); + cowponents$applyComponentsAndValidate(patch, oldPatch); + }); } @ModifyExpressionValue(method = "get", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/component/DataComponentMap;get(Lnet/minecraft/core/component/DataComponentType;)Ljava/lang/Object;")) @@ -116,7 +121,7 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { T setValue = cowponents$components.set(ComponentCastUtils.castComponentType(type), value); if (!cowponents$hashedPatchMap.matches(cowponents$getComponentsPatch(), cowponents$componentCache::getUnchecked)) { EntityComponentUtils.syncComponentChanges( - (Entity)(Object)this, + (Entity) (Object) this, cowponents$components.asPatch(), cowponents$hashedPatchMap, cowponents$componentCache::getUnchecked @@ -134,7 +139,7 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { T setValue = cowponents$components.set(value); if (!cowponents$hashedPatchMap.matches(cowponents$getComponentsPatch(), cowponents$componentCache::getUnchecked)) { EntityComponentUtils.syncComponentChanges( - (Entity)(Object)this, + (Entity) (Object) this, cowponents$components.asPatch(), cowponents$hashedPatchMap, cowponents$componentCache::getUnchecked @@ -152,7 +157,7 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { T removedValue = cowponents$components.remove(type); if (!cowponents$hashedPatchMap.matches(cowponents$getComponentsPatch(), cowponents$componentCache::getUnchecked)) { EntityComponentUtils.syncComponentChanges( - (Entity)(Object)this, + (Entity) (Object) this, cowponents$components.asPatch(), cowponents$hashedPatchMap, cowponents$componentCache::getUnchecked @@ -183,23 +188,13 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { @Override public void cowponents$applyComponentsAndValidate(DataComponentPatch patch) { DataComponentPatch oldPatch = cowponents$getComponentsPatch(); - PatchedDataComponentMap components = (PatchedDataComponentMap) cowponents$getComponents(); - components.applyPatch(patch); - Optional> validationError = EntityComponentUtils.validateEntity((Entity) (Object) this).error(); - if (validationError.isPresent()) { - EntityComponentUtils.LOGGER.error("Failed to apply component patch '{}' to entity: '{}'", patch, validationError.get().message()); - components.restorePatch(oldPatch); - } - cowponents$hashedPatchMap = HashedPatchMap.create( - cowponents$components.asPatch(), - cowponents$componentCache::getUnchecked - ); + cowponents$applyComponentsAndValidate(patch, oldPatch); } @Override public DataComponentMap cowponents$getPrototype() { Holder> holder = typeHolder(); - var cowponentsOriginated = ((Duck_HolderCowponentsOriginated) holder).cowponents_instances$getCowponentsOriginated(); + var cowponentsOriginated = ((Duck_HolderCowponentsEntityOriginated) holder).cowponents_entities$getCowponentsOriginated(); if (cowponentsOriginated.isEmpty()) return DataComponentMap.EMPTY; @@ -208,4 +203,25 @@ public abstract class Mixin_Entity implements CowponentsComponentHolder { .components() .filter(cowponentsOriginated::contains); } + + @Unique + private void cowponents$applyComponentsAndValidate(DataComponentPatch patch, DataComponentPatch oldPatch) { + PatchedDataComponentMap components = (PatchedDataComponentMap) cowponents$getComponents(); + components.applyPatch(patch); + Optional> validationError = EntityComponentUtils.validateEntity((Entity) (Object) this).error(); + if (validationError.isPresent()) { + EntityComponentUtils.LOGGER.error("Failed to apply component patch '{}' to entity: '{}'", patch, validationError.get().message()); + components.restorePatch(oldPatch); + } + EntityComponentUtils.syncComponentChanges( + (Entity) (Object) this, + cowponents$components.asPatch(), + cowponents$hashedPatchMap, + cowponents$componentCache::getUnchecked + ); + cowponents$hashedPatchMap = HashedPatchMap.create( + cowponents$components.asPatch(), + cowponents$componentCache::getUnchecked + ); + } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_EntityTypeBuilder.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_EntityTypeBuilder.java similarity index 72% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_EntityTypeBuilder.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_EntityTypeBuilder.java index 041c8e6..8bfba93 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_EntityTypeBuilder.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_EntityTypeBuilder.java @@ -1,8 +1,8 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsEntityTypeBuilder; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_HolderCowponentsOriginated; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityTypeBuilder; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_HolderCowponentsEntityOriginated; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentInitializers; import net.minecraft.core.component.DataComponentType; @@ -26,19 +26,19 @@ public class Mixin_EntityTypeBuilder implements CowponentsEnti @Unique private final Set> cowponents_instances$cowponentsOriginated = new HashSet<>(); - public EntityType.Builder cowponents_instances$component(DataComponentType type, T value) { + public EntityType.Builder cowponents$component(DataComponentType type, T value) { cowponents_instances$componentInitializer.add(type, value); cowponents_instances$cowponentsOriginated.add(type); return (EntityType.Builder) (Object) this; } - public EntityType.Builder cowponents_instances$delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { + public EntityType.Builder cowponents$delayedComponent(DataComponentType type, DataComponentInitializers.SingleComponentInitializer initializer) { cowponents_instances$componentInitializer.andThen(initializer.asInitializer(type)); cowponents_instances$cowponentsOriginated.add(type); return (EntityType.Builder) (Object) this; } - public EntityType.Builder cowponents_instances$delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { + public EntityType.Builder cowponents$delayedHolderComponent(DataComponentType> type, ResourceKey valueKey) { cowponents_instances$componentInitializer.andThen((components, context, _) -> components.set(type, context.getOrThrow(valueKey))); cowponents_instances$cowponentsOriginated.add(type); return (EntityType.Builder) (Object) this; @@ -51,7 +51,7 @@ public class Mixin_EntityTypeBuilder implements CowponentsEnti if (holder instanceof Holder.Reference> ref && !cowponents_instances$cowponentsOriginated.isEmpty()) { BuiltInRegistries.DATA_COMPONENT_INITIALIZERS.add(ref.key(), cowponents_instances$componentInitializer); - ((Duck_HolderCowponentsOriginated) holder).cowponents_instances$setCowponentsOriginated(cowponents_instances$cowponentsOriginated); + ((Duck_HolderCowponentsEntityOriginated) holder).cowponents_entities$setCowponentsOriginated(cowponents_instances$cowponentsOriginated); } return original; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_HolderReference.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_HolderReference.java similarity index 65% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_HolderReference.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_HolderReference.java index 9404632..3c7b46f 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/mixin/Mixin_HolderReference.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/mixin/Mixin_HolderReference.java @@ -1,6 +1,6 @@ -package lgbt.greenhouse.cowponents.instances.impl.mixin; +package lgbt.greenhouse.cowponents.entities.impl.mixin; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_HolderCowponentsOriginated; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_HolderCowponentsEntityOriginated; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentType; import org.spongepowered.asm.mixin.Mixin; @@ -11,17 +11,17 @@ import java.util.Objects; import java.util.Set; @Mixin(Holder.Reference.class) -public class Mixin_HolderReference implements Duck_HolderCowponentsOriginated { +public class Mixin_HolderReference implements Duck_HolderCowponentsEntityOriginated { @Unique private Set> cowponents_instances$cowponentsOriginated; @Override - public Set> cowponents_instances$getCowponentsOriginated() { + public Set> cowponents_entities$getCowponentsOriginated() { return Objects.requireNonNullElse(cowponents_instances$cowponentsOriginated, Collections.emptySet()); } @Override - public void cowponents_instances$setCowponentsOriginated(Set> types) { + public void cowponents_entities$setCowponentsOriginated(Set> types) { cowponents_instances$cowponentsOriginated = Collections.unmodifiableSet(types); } diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/SyncEntityComponentPacketClientbound.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/SyncEntityComponentPacketClientbound.java new file mode 100644 index 0000000..b36ef8a --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/SyncEntityComponentPacketClientbound.java @@ -0,0 +1,35 @@ +package lgbt.greenhouse.cowponents.entities.impl.network.clientbound; + +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import lgbt.greenhouse.cowponents.impl.network.NetworkableComponentChange; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; + +import java.util.List; + +public record SyncEntityComponentPacketClientbound(int entityId, + List> changes) implements CustomPacketPayload { + public static Type TYPE = new Type<>(CowponentsEntities.id("sync_entity_components")); + public static StreamCodec STREAM_CODEC = StreamCodec.of( + SyncEntityComponentPacketClientbound::write, SyncEntityComponentPacketClientbound::read + ); + + public static SyncEntityComponentPacketClientbound read(RegistryFriendlyByteBuf buf) { + int entityId = ByteBufCodecs.INT.decode(buf); + List> changes = NetworkableComponentChange.STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buf); + + return new SyncEntityComponentPacketClientbound(entityId, changes); + } + + public static void write(RegistryFriendlyByteBuf buf, SyncEntityComponentPacketClientbound packet) { + ByteBufCodecs.INT.encode(buf, packet.entityId); + NetworkableComponentChange.STREAM_CODEC.apply(ByteBufCodecs.list()).encode(buf, packet.changes); + } + + @Override + public Type type() { + return TYPE; + } +} diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/package-info.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/package-info.java new file mode 100644 index 0000000..b88c9b6 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/network/clientbound/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.network.clientbound; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/client/package-info.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/package-info.java similarity index 68% rename from core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/client/package-info.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/package-info.java index 6016894..64ac988 100644 --- a/core/fabric/src/main/java/lgbt/greenhouse/cowponents/impl/fabric/client/package-info.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.impl.fabric.client; +package lgbt.greenhouse.cowponents.entities.impl; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/CowponentsEntitiesDedicated.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/CowponentsEntitiesDedicated.java new file mode 100644 index 0000000..5048ef6 --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/CowponentsEntitiesDedicated.java @@ -0,0 +1,8 @@ +package lgbt.greenhouse.cowponents.entities.impl.server.dedicated; + +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import org.slf4j.Logger; + +public class CowponentsEntitiesDedicated { + public static final Logger LOG = CowponentsEntities.getLogger("Dedicated Server"); +} diff --git a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/dedicated/package-info.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/package-info.java similarity index 65% rename from core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/dedicated/package-info.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/package-info.java index a10f1cc..39d664f 100644 --- a/core/neoforge/src/main/java/lgbt/greenhouse/cowponents/impl/neoforge/server/dedicated/package-info.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/dedicated/package-info.java @@ -1,6 +1,6 @@ @ApiStatus.Internal @NullMarked -package lgbt.greenhouse.cowponents.impl.neoforge.server.dedicated; +package lgbt.greenhouse.cowponents.entities.impl.server.dedicated; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; diff --git a/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/package-info.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/package-info.java new file mode 100644 index 0000000..1c2ac9e --- /dev/null +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/server/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.cowponents.entities.impl.server; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/DefaultEntityComponentsImpl.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/DefaultEntityComponentsImpl.java similarity index 78% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/DefaultEntityComponentsImpl.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/DefaultEntityComponentsImpl.java index b7a086f..58cec07 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/DefaultEntityComponentsImpl.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/DefaultEntityComponentsImpl.java @@ -1,7 +1,7 @@ -package lgbt.greenhouse.cowponents.instances.impl.world.entity; +package lgbt.greenhouse.cowponents.entities.impl.world.entity; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsDefaultEntityComponentEvents; -import lgbt.greenhouse.cowponents.instances.impl.duck.Duck_HolderCowponentsOriginated; +import lgbt.greenhouse.cowponents.entities.api.v1.event.CowponentsDefaultEntityComponentEvents; +import lgbt.greenhouse.cowponents.entities.impl.duck.Duck_HolderCowponentsEntityOriginated; import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentMap; @@ -38,7 +38,7 @@ public class DefaultEntityComponentsImpl implements CowponentsDefaultEntityCompo DataComponentMap newComponents = builder.build(); - Set> originated = new HashSet<>(((Duck_HolderCowponentsOriginated) holder).cowponents_instances$getCowponentsOriginated()); + Set> originated = new HashSet<>(((Duck_HolderCowponentsEntityOriginated) holder).cowponents_entities$getCowponentsOriginated()); for (TypedDataComponent component : newComponents .stream() .filter(typed -> !oldComponents.has(typed.type()) || !oldComponents.get(typed.type()).equals(typed.value())) @@ -46,7 +46,7 @@ public class DefaultEntityComponentsImpl implements CowponentsDefaultEntityCompo originated.add(component.type()); } if (!originated.isEmpty()) { - ((Duck_HolderCowponentsOriginated) holder).cowponents_instances$setCowponentsOriginated(originated); + ((Duck_HolderCowponentsEntityOriginated) holder).cowponents_entities$setCowponentsOriginated(originated); } } } diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/EntityComponentUtils.java b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/EntityComponentUtils.java similarity index 71% rename from instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/EntityComponentUtils.java rename to entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/EntityComponentUtils.java index 7abad42..3b0fb56 100644 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/world/entity/EntityComponentUtils.java +++ b/entities/xplat/src/main/java/lgbt/greenhouse/cowponents/entities/impl/world/entity/EntityComponentUtils.java @@ -1,15 +1,15 @@ -package lgbt.greenhouse.cowponents.instances.impl.world.entity; +package lgbt.greenhouse.cowponents.entities.impl.world.entity; import com.mojang.serialization.DataResult; import lgbt.greenhouse.cowponents.api.v1.DataComponentGetterSetter; +import lgbt.greenhouse.cowponents.entities.api.v1.event.CowponentsEntityEvents; import lgbt.greenhouse.cowponents.impl.Cowponents; import lgbt.greenhouse.cowponents.impl.util.ComponentValidationUtils; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsInstancesValidationEvents; -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import lgbt.greenhouse.cowponents.instances.impl.event.CowponentsInstancesInheritanceEventsImpl; -import lgbt.greenhouse.cowponents.instances.impl.network.NetworkableComponentChange; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.impl.CowponentsEntities; +import lgbt.greenhouse.cowponents.entities.impl.event.CowponentsEntitiesEventsImpl; +import lgbt.greenhouse.cowponents.impl.network.NetworkableComponentChange; +import lgbt.greenhouse.cowponents.entities.impl.network.clientbound.SyncEntityComponentPacketClientbound; import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentPatch; @@ -28,7 +28,7 @@ import java.util.Optional; import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; public class EntityComponentUtils { - public static final Logger LOGGER = CowponentsInstances.getLogger("Entity Components"); + public static final Logger LOGGER = CowponentsEntities.getLogger("Entity Components"); public static DataResult validateEntity(Entity entity) { DataComponentMap components = CowponentsEntityHelper.getComponents(entity); @@ -38,14 +38,14 @@ public class EntityComponentUtils { return globalValidation.map(_ -> entity); } - return CowponentsInstancesValidationEvents.VALIDATE_ENTITY_COMPONENTS + return CowponentsEntityEvents.VALIDATE_ENTITY_COMPONENTS .invoker() .validate(components) .map(_ -> entity); } public static void refreshInherited(Entity entity, HolderLookup.Provider lookupProvider, DataComponentGetterSetter getterSetter) { - for (var type : CowponentsInstancesInheritanceEventsImpl.INHERIT_FROM_ENTITY_MAP.keySet()) { + for (var type : CowponentsEntitiesEventsImpl.INHERIT_FROM_ENTITY_MAP.keySet()) { inheritValue(lookupProvider, entity, type, getterSetter); } } @@ -59,21 +59,25 @@ public class EntityComponentUtils { if (changes.isEmpty()) return; - Cowponents.getPlatformHelper().sendClientboundTracking(entity, new SyncEntityComponentPacket(entity.getId(), getAllComponentChanges(entity))); + Cowponents.getPlatformHelper().sendClientboundTracking(entity, new SyncEntityComponentPacketClientbound(entity.getId(), getAllComponentChanges(entity))); } public static void syncComponentChanges(Entity entity, DataComponentPatch patch, HashedPatchMap oldPatchMap, HashedPatchMap.HashGenerator hashGenerator) { - SyncEntityComponentPacket packet = new SyncEntityComponentPacket( + if (entity.level().isClientSide()) + return; + + var changeList = NetworkableComponentChange.createChangeList(patch, oldPatchMap, hashGenerator); + if (changeList.isEmpty()) + return; + + SyncEntityComponentPacketClientbound packet = new SyncEntityComponentPacketClientbound( entity.getId(), - NetworkableComponentChange.createChangeList(patch, oldPatchMap, hashGenerator) + changeList ); - if (entity.level().isClientSide()) { - Cowponents.getPlatformHelper().sendServerbound(packet); - return; - } + Cowponents.getPlatformHelper().sendClientboundTracking(entity, packet); } @@ -87,7 +91,7 @@ public class EntityComponentUtils { if (changes.isEmpty()) return; - Cowponents.getPlatformHelper().sendClientbound(player, new SyncEntityComponentPacket(entity.getId(), changes)); + Cowponents.getPlatformHelper().sendClientbound(player, new SyncEntityComponentPacketClientbound(entity.getId(), changes)); } private static List> getAllComponentChanges(Entity entity) { @@ -110,7 +114,7 @@ public class EntityComponentUtils { Entity entity, DataComponentType type, DataComponentGetterSetter getterSetter) { - T toValue = CowponentsInstancesInheritanceEventsImpl.invokeComponentForEntityEvent(type, entity, lookupProvider); + T toValue = CowponentsEntitiesEventsImpl.invokeComponentForEntityEvent(type, entity, lookupProvider); if (toValue != null) { getterSetter.set(type, toValue); } diff --git a/entities/xplat/src/main/resources/cowponents_entities.cfg b/entities/xplat/src/main/resources/cowponents_entities.cfg new file mode 100644 index 0000000..8aeda6d --- /dev/null +++ b/entities/xplat/src/main/resources/cowponents_entities.cfg @@ -0,0 +1,6 @@ +public net.minecraft.core.component.DataComponentInitializers$BakedEntry +public net.minecraft.core.component.DataComponentInitializers$BakedEntry (Lnet/minecraft/core/Holder$Reference;Lnet/minecraft/core/component/DataComponentMap;)V +public net.minecraft.core.component.DataComponentInitializers$InitializerEntry +public net.minecraft.core.component.DataComponentInitializers$InitializerEntry (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/component/DataComponentInitializers$Initializer;)V +public net.minecraft.core.component.DataComponentInitializers$PendingComponentBuilders +public net.minecraft.core.component.DataComponentInitializers$PendingComponentBuilders (Lnet/minecraft/resources/ResourceKey;Ljava/util/Map;)V diff --git a/instances/xplat/src/main/resources/cowponents_instances.mixins.json b/entities/xplat/src/main/resources/cowponents_entities.mixins.json similarity index 79% rename from instances/xplat/src/main/resources/cowponents_instances.mixins.json rename to entities/xplat/src/main/resources/cowponents_entities.mixins.json index 9243a72..056b859 100644 --- a/instances/xplat/src/main/resources/cowponents_instances.mixins.json +++ b/entities/xplat/src/main/resources/cowponents_entities.mixins.json @@ -1,10 +1,9 @@ { "required": true, "minVersion": "0.8", - "package": "lgbt.greenhouse.cowponents.instances.impl.mixin", + "package": "lgbt.greenhouse.cowponents.entities.impl.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ - "Mixin_BlockEntity", "Mixin_DataComponentInitializers", "Mixin_DataComponentTypeBuilder", "Mixin_DataComponentTypeBuilderSimpleType", diff --git a/extensions/fabric/build.gradle.kts b/extensions/fabric/build.gradle.kts index 73cac34..b4f9ad4 100644 --- a/extensions/fabric/build.gradle.kts +++ b/extensions/fabric/build.gradle.kts @@ -2,6 +2,7 @@ import lgbt.greenhouse.cowponents.gradle.Properties plugins { id("conventions.loader") + id("conventions.submodule") alias(libs.plugins.loom) alias(libs.plugins.mod.publish) } diff --git a/extensions/neoforge/build.gradle.kts b/extensions/neoforge/build.gradle.kts index b8544eb..c874f2e 100644 --- a/extensions/neoforge/build.gradle.kts +++ b/extensions/neoforge/build.gradle.kts @@ -2,8 +2,9 @@ import lgbt.greenhouse.cowponents.gradle.Properties plugins { id("conventions.loader") - id("net.neoforged.moddev") - id("me.modmuss50.mod-publish-plugin") + id("conventions.submodule") + alias(libs.plugins.moddev) + alias(libs.plugins.mod.publish) } val props = Properties.MODULES["extensions"]!! diff --git a/extensions/xplat/build.gradle.kts b/extensions/xplat/build.gradle.kts index 61e2770..65ee7cd 100644 --- a/extensions/xplat/build.gradle.kts +++ b/extensions/xplat/build.gradle.kts @@ -1,45 +1,14 @@ import lgbt.greenhouse.cowponents.gradle.Properties -import org.gradle.jvm.component.internal.DefaultJvmSoftwareComponent -import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal plugins { id("conventions.xplat") + id("conventions.submodule") alias(libs.plugins.moddev) alias(libs.plugins.mod.publish) } -val apiComponent = components.create("api") as DefaultJvmSoftwareComponent val props = Properties.MODULES["extensions"]!! -configurations { - register("xplatJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - getByName("apiElements") { - outgoing { - capability("${props.group}:${props.modId}:${props.version}") - } - } - register("apiCompileElements") { - outgoing { - capability("${props.group}:${props.modId}-api:${props.version}") - } - } -} - dependencies { compileOnly(libs.mixin) compileOnly(libs.mixin.extras) @@ -57,70 +26,3 @@ neoForge { setAccessTransformers(at) validateAccessTransformers = true } - -tasks { - register("apiJar") { - archiveBaseName.set(props.modId) - archiveClassifier = "api" - - dependsOn(named("jar")) - - from(zipTree(getByName("jar").archiveFile)) - includes.add("lgbt/greenhouse/cowponents/entities/api/v1/**") - } -} - -tasks.getByName("assemble").dependsOn("apiJar") - -artifacts { - add("xplatJava", sourceSets["main"].java.sourceDirectories.singleFile) - add("xplatResources", sourceSets["main"].resources.sourceDirectories.singleFile) - add("xplatTestJava", sourceSets["test"].java.sourceDirectories.singleFile) - add("xplatTestResources", sourceSets["test"].resources.sourceDirectories.singleFile) -} - -project.afterEvaluate { - val main = sourceSets["main"]!! - - configurations.getByName("apiCompileElements") { - extendsFrom(configurations[main.apiConfigurationName]) - attributes { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.LIBRARY)) - attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements::class, LibraryElements.JAR)) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class, Usage.JAVA_API)) - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling::class, Bundling.EXTERNAL)) - var languageVersion = java.toolchain.languageVersion - if (languageVersion.isPresent) { - attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, languageVersion.get().asInt()) - } - } - } - - artifacts.add( - "apiCompileElements", - tasks.getByName("apiJar") - ) { - classifier = "api" - } - - apiComponent.addVariantsFromConfiguration(configurations["apiCompileElements"]) { - mapToMavenScope("compile") - mapToOptional() - } - - apiComponent.addVariantsFromConfiguration(configurations[main.sourcesElementsConfigurationName]) { - mapToOptional() - } - apiComponent.addVariantsFromConfiguration(configurations[main.javadocElementsConfigurationName]) { - mapToOptional() - } -} - -publishing { - publications { - create("mavenJavaApi") { - artifactId = props.modId + "-api" - from(components["api"]) - } - } -} diff --git a/extensions/xplat/src/main/java/lgbt/greenhouse/cowponents/extensions/api/v1/extension/CowponentsExtensionsDataComponentTypeBuilder.java b/extensions/xplat/src/main/java/lgbt/greenhouse/cowponents/extensions/api/v1/extension/CowponentsExtensionsDataComponentTypeBuilder.java index faaa520..e23d1f9 100644 --- a/extensions/xplat/src/main/java/lgbt/greenhouse/cowponents/extensions/api/v1/extension/CowponentsExtensionsDataComponentTypeBuilder.java +++ b/extensions/xplat/src/main/java/lgbt/greenhouse/cowponents/extensions/api/v1/extension/CowponentsExtensionsDataComponentTypeBuilder.java @@ -7,7 +7,7 @@ import net.minecraft.core.component.DataComponentType; import java.util.function.Supplier; /** - * An extension to {@link DataComponentType.Builder} for CowponentsExtensions specific fields. + * An extension to {@link DataComponentType.Builder} for Cowponents: Extensions specific fields. */ public interface CowponentsExtensionsDataComponentTypeBuilder { /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d1ee324..f95261d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,26 +1,26 @@ [versions] # Minecraft -minecraft = "26.1-pre-3" +minecraft = "26.1.2" # Xplat -neoform = "26.1-pre-3-1" -mixin = "0.16.5+mixin.0.8.7" -mixin-extras = "0.5.0" +neoform = "26.1.2-1" +mixin = "0.17.1+mixin.0.8.7" +mixin-extras = "0.5.3" # Fabric -fabric-loader = "0.18.4" -fabric-api = "0.143.14+26.1" -mod-menu = "18.0.0-alpha.6" +fabric-loader = "0.19.0" +fabric-api = "0.145.4+26.1.2" +mod-menu = "18.0.0-alpha.8" # NeoForge -neoforge = "26.1.0.0-alpha.15+pre-3" +neoforge = "26.1.2.13-beta" # Dependencies -yumi-mc-foundation = "1.0.0-beta.2+26.1-pre-2" +yumi-mc-foundation = "1.0.0+26.1" # Gradle loom = "1.15.+" -moddev = "2.0.140" +moddev = "2.0.141" mod-publish = "1.1.0" [libraries] diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/CowponentsInstancesClientFabric.java b/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/CowponentsInstancesClientFabric.java deleted file mode 100644 index 73d4061..0000000 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/client/CowponentsInstancesClientFabric.java +++ /dev/null @@ -1,18 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.fabric.client; - -import lgbt.greenhouse.cowponents.instances.impl.client.network.CowponentsClientNetworkHandlers; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; - -public class CowponentsInstancesClientFabric implements ClientModInitializer { - @Override - public void onInitializeClient() { - registerPayloads(); - } - - public static void registerPayloads() { - ClientPlayNetworking.registerGlobalReceiver(SyncEntityComponentPacket.TYPE, - (payload, _) -> CowponentsClientNetworkHandlers.syncEntityComponentPatch(payload)); - } -} diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/package-info.java b/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/package-info.java deleted file mode 100644 index 3f4b953..0000000 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/dedicated/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.fabric.server.dedicated; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/package-info.java b/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/package-info.java deleted file mode 100644 index 87dbfdc..0000000 --- a/instances/fabric/src/main/java/lgbt/greenhouse/cowponents/instances/impl/fabric/server/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.fabric.server; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/CowponentsInstancesClientNeoForge.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/CowponentsInstancesClientNeoForge.java deleted file mode 100644 index e3ac03d..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/CowponentsInstancesClientNeoForge.java +++ /dev/null @@ -1,27 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.neoforge.client; - -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import lgbt.greenhouse.cowponents.instances.impl.client.network.CowponentsClientNetworkHandlers; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; - -@Mod(value = CowponentsInstances.MOD_ID, dist = Dist.CLIENT) -@EventBusSubscriber(modid = CowponentsInstances.MOD_ID, value = Dist.CLIENT) -public class CowponentsInstancesClientNeoForge { - public CowponentsInstancesClientNeoForge(IEventBus eventBus) { - - } - - @SubscribeEvent - public static void registerClientPayloadHandlers(RegisterClientPayloadHandlersEvent event) { - event.register( - SyncEntityComponentPacket.TYPE, - (packet, _) -> CowponentsClientNetworkHandlers.syncEntityComponentPatch(packet) - ); - } -} diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/package-info.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/package-info.java deleted file mode 100644 index f9fa8a5..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/client/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.neoforge.client; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/package-info.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/package-info.java deleted file mode 100644 index daafe04..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.neoforge; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java deleted file mode 100644 index ea85e07..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/CowponentsInstancesDedicatedNeoForge.java +++ /dev/null @@ -1,10 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.neoforge.server.dedicated; - -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.common.Mod; - -@Mod(value = CowponentsInstances.MOD_ID, dist = Dist.DEDICATED_SERVER) -public class CowponentsInstancesDedicatedNeoForge { - -} diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/package-info.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/package-info.java deleted file mode 100644 index 9320e46..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/dedicated/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.neoforge.server.dedicated; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/package-info.java b/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/package-info.java deleted file mode 100644 index 2e4e8c5..0000000 --- a/instances/neoforge/src/main/java/lgbt/greenhouse/cowponents/instances/impl/neoforge/server/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.neoforge.server; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/build.gradle.kts b/instances/xplat/build.gradle.kts deleted file mode 100644 index c289011..0000000 --- a/instances/xplat/build.gradle.kts +++ /dev/null @@ -1,127 +0,0 @@ -import lgbt.greenhouse.cowponents.gradle.Properties -import org.gradle.jvm.component.internal.DefaultJvmSoftwareComponent -import org.gradle.jvm.component.internal.JvmSoftwareComponentInternal - -plugins { - id("conventions.xplat") - alias(libs.plugins.moddev) - alias(libs.plugins.mod.publish) -} - -val apiComponent = components.create("api") as DefaultJvmSoftwareComponent -val props = Properties.MODULES["instances"]!! - -configurations { - register("xplatJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - getByName("apiElements") { - outgoing { - capability("${props.group}:${props.modId}:${props.version}") - } - } - register("apiCompileElements") { - outgoing { - capability("${props.group}:${props.modId}-api:${props.version}") - } - } -} - -dependencies { - compileOnly(libs.mixin) - compileOnly(libs.mixin.extras) - annotationProcessor(libs.mixin.extras) - - api(project(":core_xplat")) - "localCompile"(project(":extensions_xplat")) -} - -neoForge { - neoFormVersion = libs.versions.neoform.get() - addModdingDependenciesTo(sourceSets["test"]) - - val at = file("src/main/resources/${props.modId}.cfg") - if (at.exists()) - setAccessTransformers(at) - validateAccessTransformers = true -} - -tasks { - register("apiJar") { - archiveBaseName.set(props.modId) - archiveClassifier = "api" - - dependsOn(named("jar")) - - from(zipTree(getByName("jar").archiveFile)) - includes.add("lgbt/greenhouse/cowponents/entities/api/v1/**") - } -} - -tasks.getByName("assemble").dependsOn("apiJar") - -artifacts { - add("xplatJava", sourceSets["main"].java.sourceDirectories.singleFile) - add("xplatResources", sourceSets["main"].resources.sourceDirectories.singleFile) - add("xplatTestJava", sourceSets["test"].java.sourceDirectories.singleFile) - add("xplatTestResources", sourceSets["test"].resources.sourceDirectories.singleFile) -} - -project.afterEvaluate { - val main = sourceSets["main"]!! - - configurations.getByName("apiCompileElements") { - extendsFrom(configurations[main.apiConfigurationName]) - attributes { - attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class, Category.LIBRARY)) - attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements::class, LibraryElements.JAR)) - attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage::class, Usage.JAVA_API)) - attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling::class, Bundling.EXTERNAL)) - var languageVersion = java.toolchain.languageVersion - if (languageVersion.isPresent) { - attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, languageVersion.get().asInt()) - } - } - } - - artifacts.add( - "apiCompileElements", - tasks.getByName("apiJar") - ) { - classifier = "api" - } - - apiComponent.addVariantsFromConfiguration(configurations["apiCompileElements"]) { - mapToMavenScope("compile") - mapToOptional() - } - - apiComponent.addVariantsFromConfiguration(configurations[main.sourcesElementsConfigurationName]) { - mapToOptional() - } - apiComponent.addVariantsFromConfiguration(configurations[main.javadocElementsConfigurationName]) { - mapToOptional() - } -} - -publishing { - publications { - create("mavenJavaApi") { - artifactId = props.modId + "-api" - from(components["api"]) - } - } -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsInstancesValidationEvents.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsInstancesValidationEvents.java deleted file mode 100644 index 6a6956f..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/api/v1/event/CowponentsInstancesValidationEvents.java +++ /dev/null @@ -1,23 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.api.v1.event; - -import dev.yumi.commons.event.Event; -import dev.yumi.mc.core.api.YumiEvents; -import lgbt.greenhouse.cowponents.api.v1.event.CowponentsValidationEvents; -import lgbt.greenhouse.cowponents.impl.util.ComponentValidationUtils; -import net.minecraft.resources.Identifier; - -public class CowponentsInstancesValidationEvents { - /** - * An event used to validate addedComponents alongside other addedComponents specifically in a block entity context. - *

- * Returning a DataResult#error within this event will roll back any addedComponents to what they were previously. - */ - public static final Event VALIDATE_BLOCK_ENTITY_COMPONENTS = YumiEvents.EVENTS.create(CowponentsValidationEvents.ValidateComponentsCallback.class, ComponentValidationUtils::validationCallback); - - /** - * An event used to validate addedComponents alongside other addedComponents specifically in an entity context. - *

- * Returning a DataResult#error within this event will roll back any addedComponents to what they were previously. - */ - public static final Event VALIDATE_ENTITY_COMPONENTS = YumiEvents.EVENTS.create(CowponentsValidationEvents.ValidateComponentsCallback.class, ComponentValidationUtils::validationCallback); -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/CowponentsInstancesClient.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/CowponentsInstancesClient.java deleted file mode 100644 index 3dd9d92..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/CowponentsInstancesClient.java +++ /dev/null @@ -1,8 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.client; - -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import org.slf4j.Logger; - -public class CowponentsInstancesClient { - public static final Logger LOG = CowponentsInstances.getLogger("Client"); -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/network/CowponentsClientNetworkHandlers.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/network/CowponentsClientNetworkHandlers.java deleted file mode 100644 index 8eb9a78..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/network/CowponentsClientNetworkHandlers.java +++ /dev/null @@ -1,56 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.client.network; - -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; -import lgbt.greenhouse.cowponents.instances.impl.network.NetworkableComponentChange; -import lgbt.greenhouse.cowponents.instances.impl.network.SyncEntityComponentPacket; -import net.minecraft.client.Minecraft; -import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.core.component.DataComponentType; -import net.minecraft.core.component.PatchedDataComponentMap; -import net.minecraft.world.entity.Entity; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import static lgbt.greenhouse.cowponents.impl.util.ComponentCastUtils.castComponentType; - -public class CowponentsClientNetworkHandlers { - public static void syncEntityComponentPatch(SyncEntityComponentPacket packet) { - Minecraft client = Minecraft.getInstance(); - client.execute(() -> { - assert client.level != null; - Entity entity = client.level.getEntity(packet.entityId()); - if (entity == null) { - return; - } - - DataComponentPatch.Builder patch = DataComponentPatch.builder(); - Set> modifiedTypes = new HashSet<>(); - - for (NetworkableComponentChange change : packet.changes()) { - switch (change.kind()) { - case ADDED -> patch.set(castComponentType(change.type()), change.value()); - case REMOVED -> patch.remove(change.type()); - case UNPATCHED -> {} - } - modifiedTypes.add(change.type()); - } - - for (var value : CowponentsEntityHelper.getComponentsPatch(entity).entrySet()) { - DataComponentType type = value.getKey(); - - if (modifiedTypes.contains(type)) - continue; - - Optional optional = value.getValue(); - optional.ifPresentOrElse( - v -> patch.set(castComponentType(type), v), - () -> patch.remove(type) - ); - } - - ((PatchedDataComponentMap)CowponentsEntityHelper.getComponents(entity)).restorePatch(patch.build()); - }); - } -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/package-info.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/package-info.java deleted file mode 100644 index 7975727..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/client/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.client; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_HolderCowponentsOriginated.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_HolderCowponentsOriginated.java deleted file mode 100644 index 824d235..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_HolderCowponentsOriginated.java +++ /dev/null @@ -1,11 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.duck; - -import net.minecraft.core.component.DataComponentType; - -import java.util.Set; - -public interface Duck_HolderCowponentsOriginated { - Set> cowponents_instances$getCowponentsOriginated(); - - void cowponents_instances$setCowponentsOriginated(Set> types); -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_TransferrableOnDeath.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_TransferrableOnDeath.java deleted file mode 100644 index 034cfcf..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/duck/Duck_TransferrableOnDeath.java +++ /dev/null @@ -1,5 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.duck; - -public interface Duck_TransferrableOnDeath { - void cowponents_instances$setTransferOnDeath(boolean value); -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/SyncEntityComponentPacket.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/SyncEntityComponentPacket.java deleted file mode 100644 index fce268d..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/SyncEntityComponentPacket.java +++ /dev/null @@ -1,34 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.network; - -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.network.protocol.common.custom.CustomPacketPayload; - -import java.util.List; - -public record SyncEntityComponentPacket(int entityId, - List> changes) implements CustomPacketPayload { - public static Type TYPE = new Type<>(CowponentsInstances.id("sync_entity_components")); - public static StreamCodec STREAM_CODEC = StreamCodec.of( - SyncEntityComponentPacket::write, SyncEntityComponentPacket::read - ); - - public static SyncEntityComponentPacket read(RegistryFriendlyByteBuf buf) { - int entityId = ByteBufCodecs.INT.decode(buf); - List> changes = NetworkableComponentChange.STREAM_CODEC.apply(ByteBufCodecs.list()).decode(buf); - - return new SyncEntityComponentPacket(entityId, changes); - } - - public static void write(RegistryFriendlyByteBuf buf, SyncEntityComponentPacket packet) { - ByteBufCodecs.INT.encode(buf, packet.entityId); - NetworkableComponentChange.STREAM_CODEC.apply(ByteBufCodecs.list()).encode(buf, packet.changes); - } - - @Override - public Type type() { - return TYPE; - } -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/package-info.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/package-info.java deleted file mode 100644 index 6d96565..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/network/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.network; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/CowponentsInstancesDedicated.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/CowponentsInstancesDedicated.java deleted file mode 100644 index ed67d01..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/CowponentsInstancesDedicated.java +++ /dev/null @@ -1,8 +0,0 @@ -package lgbt.greenhouse.cowponents.instances.impl.server.dedicated; - -import lgbt.greenhouse.cowponents.instances.impl.CowponentsInstances; -import org.slf4j.Logger; - -public class CowponentsInstancesDedicated { - public static final Logger LOG = CowponentsInstances.getLogger("Dedicated Server"); -} diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/package-info.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/package-info.java deleted file mode 100644 index 911dfe4..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/dedicated/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.server.dedicated; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/package-info.java b/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/package-info.java deleted file mode 100644 index 624bf07..0000000 --- a/instances/xplat/src/main/java/lgbt/greenhouse/cowponents/instances/impl/server/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ApiStatus.Internal -@NullMarked -package lgbt.greenhouse.cowponents.instances.impl.server; - -import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NullMarked; diff --git a/settings.gradle.kts b/settings.gradle.kts index aada2ff..02940b1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,8 +27,9 @@ fun module(module: String) { // This should match the folder name of the project, or else IDEA may complain (see https://youtrack.jetbrains.com/issue/IDEA-317606) rootProject.name = "cowponents" +module("block_entities") module("core") -module("instances") +module("entities") module("extensions") module("test") diff --git a/test/fabric/build.gradle.kts b/test/fabric/build.gradle.kts index 63129ad..f73505c 100644 --- a/test/fabric/build.gradle.kts +++ b/test/fabric/build.gradle.kts @@ -18,7 +18,7 @@ dependencies { implementation(project(":core_fabric")) implementation(project(":extensions_fabric")) - implementation(project(":instances_fabric")) + implementation(project(":entities_fabric")) } loom { diff --git a/test/neoforge/build.gradle.kts b/test/neoforge/build.gradle.kts index af788f7..995361e 100644 --- a/test/neoforge/build.gradle.kts +++ b/test/neoforge/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { implementation(project(":core_neoforge")) implementation(project(":extensions_neoforge")) - implementation(project(":instances_neoforge")) + implementation(project(":entities_neoforge")) } neoForge { diff --git a/test/xplat/build.gradle.kts b/test/xplat/build.gradle.kts index 02f51b7..70446b2 100644 --- a/test/xplat/build.gradle.kts +++ b/test/xplat/build.gradle.kts @@ -8,25 +8,6 @@ plugins { val props = Properties.MODULES["test"]!! -configurations { - register("xplatJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestJava") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatResources") { - isCanBeResolved = false - isCanBeConsumed = true - } - register("xplatTestResources") { - isCanBeResolved = false - isCanBeConsumed = true - } -} - dependencies { testCompileOnly(libs.mixin) testCompileOnly(libs.mixin.extras) @@ -34,7 +15,7 @@ dependencies { testCompileOnly(project(":core_xplat")) testCompileOnly(project(":extensions_xplat")) - testCompileOnly(project(":instances_xplat")) + testCompileOnly(project(":entities_xplat")) } neoForge { @@ -52,10 +33,3 @@ neoForge { setAccessTransformers(ats) validateAccessTransformers = true } - -artifacts { - add("xplatJava", sourceSets["main"].java.sourceDirectories.singleFile) - add("xplatResources", sourceSets["main"].resources.sourceDirectories.singleFile) - add("xplatTestJava", sourceSets["test"].java.sourceDirectories.singleFile) - add("xplatTestResources", sourceSets["test"].resources.sourceDirectories.singleFile) -} diff --git a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/CowponentsTest.java b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/CowponentsTest.java index d1e966d..dc1fdc5 100644 --- a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/CowponentsTest.java +++ b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/CowponentsTest.java @@ -2,8 +2,8 @@ package lgbt.greenhouse.cowponents.test; import lgbt.greenhouse.cowponents.extensions.api.v1.event.CowponentsComponentInheritanceEvents; import lgbt.greenhouse.cowponents.extensions.api.v1.event.CowponentsItemStackInheritanceEvents; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsDefaultEntityComponentEvents; -import lgbt.greenhouse.cowponents.instances.api.v1.event.CowponentsEntityInheritanceEvents; +import lgbt.greenhouse.cowponents.entities.api.v1.event.CowponentsDefaultEntityComponentEvents; +import lgbt.greenhouse.cowponents.entities.api.v1.event.CowponentsEntityEvents; import lgbt.greenhouse.cowponents.test.registry.CowponentsTestDataComponents; import net.minecraft.core.component.DataComponents; import net.minecraft.network.chat.Component; @@ -38,7 +38,7 @@ public class CowponentsTest { return mutable.toImmutable(); }, Items.NETHERITE_AXE); - CowponentsEntityInheritanceEvents.registerForTypes(CowponentsTestDataComponents.ENTITY_TINT.get(), (value, _) -> { + CowponentsEntityEvents.registerForTypes(CowponentsTestDataComponents.ENTITY_TINT.get(), (value, _) -> { RandomSource random = new LegacyRandomSource(value.getUUID().hashCode()); return random.nextIntBetweenInclusive(0, 0xFFFFFF); }, EntityType.PLAYER); diff --git a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/commands/CowponentsTestCommands.java b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/commands/CowponentsTestCommands.java index 932e522..72ead32 100644 --- a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/commands/CowponentsTestCommands.java +++ b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/commands/CowponentsTestCommands.java @@ -6,7 +6,7 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.mojang.brigadier.tree.LiteralCommandNode; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; import lgbt.greenhouse.cowponents.test.registry.CowponentsTestDataComponents; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; diff --git a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/mixin/client/Mixin_LivingEntityRenderer.java b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/mixin/client/Mixin_LivingEntityRenderer.java index 00c4151..99bebf1 100644 --- a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/mixin/client/Mixin_LivingEntityRenderer.java +++ b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/mixin/client/Mixin_LivingEntityRenderer.java @@ -2,7 +2,7 @@ package lgbt.greenhouse.cowponents.test.mixin.client; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.sugar.Local; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsEntityHelper; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntityHelper; import lgbt.greenhouse.cowponents.test.duck.Duck_EntityTintComponent; import lgbt.greenhouse.cowponents.test.registry.CowponentsTestDataComponents; import net.minecraft.client.color.ColorLerper; @@ -19,7 +19,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class Mixin_LivingEntityRenderer { @Inject(method = "extractRenderState(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;F)V", at = @At("TAIL")) private void cowponents_test$extractTintComponent(T entity, S state, float partialTicks, CallbackInfo ci) { - ((Duck_EntityTintComponent) state).cowponents_test$setEntityTint(entity.getOrDefault(CowponentsTestDataComponents.ENTITY_TINT.get(), -1)); + int tint = CowponentsEntityHelper.has(entity, CowponentsTestDataComponents.ENTITY_TINT.get()) + ? entity.getOrDefault(CowponentsTestDataComponents.ENTITY_TINT.get(), -1) + : -1; + ((Duck_EntityTintComponent) state).cowponents_test$setEntityTint(tint); + if (CowponentsEntityHelper.has(entity, CowponentsTestDataComponents.RAINBOW.get())) { state.outlineColor = ColorLerper.getLerpedColor(ColorLerper.Type.SHEEP, state.ageInTicks); } diff --git a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/registry/CowponentsTestDataComponents.java b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/registry/CowponentsTestDataComponents.java index 607208c..bb1082b 100644 --- a/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/registry/CowponentsTestDataComponents.java +++ b/test/xplat/src/test/java/lgbt/greenhouse/cowponents/test/registry/CowponentsTestDataComponents.java @@ -2,8 +2,8 @@ package lgbt.greenhouse.cowponents.test.registry; import lgbt.greenhouse.cowponents.extensions.api.v1.CowponentsExtensionsDataComponentTypeBuilderWrapper; import lgbt.greenhouse.cowponents.impl.util.ComponentCodecUtils; -import lgbt.greenhouse.cowponents.instances.api.v1.CowponentsInstancesDataComponentTypeBuilderWrapper; -import lgbt.greenhouse.cowponents.instances.api.v1.extension.CowponentsInstancesDataComponentType; +import lgbt.greenhouse.cowponents.entities.api.v1.CowponentsEntitiesDataComponentTypeBuilderWrapper; +import lgbt.greenhouse.cowponents.entities.api.v1.extension.CowponentsEntityDataComponentType; import lgbt.greenhouse.cowponents.test.world.item.component.DefaultAmmo; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; @@ -55,10 +55,10 @@ public class CowponentsTestDataComponents { /** * A component that changes an entity's tint color to use jeb_ Sheep logic. *

- * Tests {@link CowponentsInstancesDataComponentType#cowponents$transferOnDeath()} and entity component syncing. + * Tests {@link CowponentsEntityDataComponentType#cowponents$transferOnDeath()} and entity component syncing. */ public static final CowponentsTestDeferredValue, DataComponentType> RAINBOW = DEFERRED.register("rainbow", - () -> CowponentsInstancesDataComponentTypeBuilderWrapper.wrap( + () -> CowponentsEntitiesDataComponentTypeBuilderWrapper.wrap( DataComponentType.builder() .persistent(Unit.CODEC) .networkSynchronized(Unit.STREAM_CODEC) -- 2.54.0