this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: port to 26.1-snapshot-11

+78 -67
+5
common/src/main/java/dev/potota/itemstats/interfaces/MaxStackSize.java
··· 1 + package dev.potota.itemstats.interfaces; 2 + 3 + public interface MaxStackSize { 4 + int itemstats$getMaxStackSize(); 5 + }
+24 -5
common/src/main/java/dev/potota/itemstats/mixin/ItemMixin.java
··· 2 2 3 3 import dev.potota.itemstats.api.ItemStats; 4 4 import dev.potota.itemstats.api.StatsComponent; 5 - import net.minecraft.core.component.DataComponentMap; 5 + import dev.potota.itemstats.interfaces.MaxStackSize; 6 + import net.minecraft.core.component.DataComponentType; 6 7 import net.minecraft.core.component.DataComponents; 7 8 import net.minecraft.world.item.Item; 8 9 import org.spongepowered.asm.mixin.Mixin; 10 + import org.spongepowered.asm.mixin.Unique; 9 11 import org.spongepowered.asm.mixin.injection.At; 12 + import org.spongepowered.asm.mixin.injection.Inject; 10 13 import org.spongepowered.asm.mixin.injection.ModifyVariable; 11 - 12 - // TODO figure out TooltipProvider 14 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 15 14 16 @Mixin(Item.class) 15 17 public abstract class ItemMixin { 16 18 // Add our custom component to all unstackable items 17 19 @ModifyVariable(method = "<init>", at = @At("HEAD"), argsOnly = true) 18 20 private static Item.Properties itemstats$injectStatsComponent(Item.Properties properties) { 19 - DataComponentMap defaultComponents = ((ItemPropertiesComponentAccess)properties).itemstats$getComponents().build(); 20 - if (defaultComponents.getOrDefault(DataComponents.MAX_STACK_SIZE, 0) == 1) { 21 + if (((MaxStackSize)properties).itemstats$getMaxStackSize() == 1) { 21 22 return properties.component(ItemStats.STATS_COMPONENT, StatsComponent.empty()); 22 23 } 23 24 return properties; 25 + } 26 + 27 + @Mixin(Item.Properties.class) 28 + public abstract static class PropertiesMixin implements MaxStackSize { 29 + @Unique 30 + public int itemstats$maxStackSize = 0; 31 + 32 + @Inject(method = "component", at = @At("HEAD")) 33 + private <T> void itemstats$trackMaxStackSize(DataComponentType<T> type, T value, CallbackInfoReturnable<Item.Properties> cir) { 34 + if (type == DataComponents.MAX_STACK_SIZE) { 35 + this.itemstats$maxStackSize = (int) value; 36 + } 37 + } 38 + 39 + @Override 40 + public int itemstats$getMaxStackSize() { 41 + return this.itemstats$maxStackSize; 42 + } 24 43 } 25 44 }
-11
common/src/main/java/dev/potota/itemstats/mixin/ItemPropertiesComponentAccess.java
··· 1 - package dev.potota.itemstats.mixin; 2 - 3 - import net.minecraft.core.component.DataComponentMap; 4 - import net.minecraft.world.item.Item; 5 - import org.spongepowered.asm.mixin.Mixin; 6 - import org.spongepowered.asm.mixin.gen.Accessor; 7 - 8 - @Mixin(Item.Properties.class) 9 - public interface ItemPropertiesComponentAccess { 10 - @Accessor("components") DataComponentMap.Builder itemstats$getComponents(); 11 - }
+5 -5
common/src/main/java/dev/potota/itemstats/mixin/ItemStackMixin.java
··· 6 6 import dev.potota.itemstats.api.StatsComponent; 7 7 import dev.potota.itemstats.impl.ItemStatsImpl; 8 8 import net.minecraft.core.BlockPos; 9 + import net.minecraft.core.Holder; 9 10 import net.minecraft.core.component.PatchedDataComponentMap; 10 11 import net.minecraft.core.registries.BuiltInRegistries; 11 12 import net.minecraft.resources.Identifier; 12 13 import net.minecraft.world.entity.player.Player; 13 14 import net.minecraft.world.item.Item; 14 15 import net.minecraft.world.item.ItemStack; 15 - import net.minecraft.world.level.ItemLike; 16 16 import net.minecraft.world.level.Level; 17 17 import net.minecraft.world.level.block.state.BlockState; 18 18 import org.spongepowered.asm.mixin.Final; ··· 33 33 34 34 @Final 35 35 @Shadow 36 - PatchedDataComponentMap components; 36 + private PatchedDataComponentMap components; 37 37 38 - @Inject(method = "<init>(Lnet/minecraft/world/level/ItemLike;ILnet/minecraft/core/component/PatchedDataComponentMap;)V", at = @At("RETURN")) 39 - private void itemstats$addDefaultStats(ItemLike itemLike, int count, PatchedDataComponentMap components, CallbackInfo ci) { 38 + @Inject(method = "<init>(Lnet/minecraft/core/Holder;ILnet/minecraft/core/component/PatchedDataComponentMap;)V", at = @At("RETURN")) 39 + private void itemstats$addDefaultStats(Holder<Item> itemHolder, int count, PatchedDataComponentMap components, CallbackInfo ci) { 40 40 StatsComponent currentStats = components.get(ItemStats.STATS_COMPONENT); 41 41 if (currentStats == null) { 42 42 return; 43 43 } 44 44 45 45 StatsComponent newStats = new StatsComponent(currentStats); 46 - Item item = itemLike.asItem(); 46 + Item item = itemHolder.value(); 47 47 48 48 try { 49 49 for (var entry : ItemStats.Registries.STAT.entrySet()) {
+2 -3
common/src/main/java/dev/potota/itemstats/mixin/ServerPlayerMixin.java
··· 22 22 23 23 @Inject( 24 24 method = "checkMovementStatistics", 25 - at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;awardStat(Lnet/minecraft/resources/Identifier;I)V"), 25 + at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;awardStat(Lnet/minecraft/resources/Identifier;I)V", ordinal = 0), 26 26 slice = @Slice( 27 - from = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;isFallFlying()Z"), 28 - to = @At(value = "CONSTANT", args = "intValue=25") 27 + from = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;isFallFlying()Z") 29 28 ) 30 29 ) 31 30 private void itemstats$distanceFlown(double dx, double dy, double dz, CallbackInfo ci) {
+21 -21
common/src/main/resources/itemstats.mixins.json
··· 1 1 { 2 - "required": true, 3 - "minVersion": "0.8", 4 - "package": "dev.potota.itemstats.mixin", 5 - "refmap": "${mod_id}.refmap.json", 6 - "compatibilityLevel": "JAVA_18", 7 - "mixins": [ 8 - "AbstractArrowMixin", 9 - "ItemMixin", 10 - "ItemPropertiesComponentAccess", 11 - "ItemStackMixin", 12 - "LivingEntityMixin", 13 - "ProjectileWeaponItemMixin", 14 - "ServerPlayerMixin", 15 - "ThrownTridentMixin" 16 - ], 17 - "client": [ 18 - "client.KeyAccess" 19 - ], 20 - "server": [], 21 - "injectors": { 22 - "defaultRequire": 1 2 + "required": true, 3 + "minVersion": "0.8", 4 + "package": "dev.potota.itemstats.mixin", 5 + "refmap": "${mod_id}.refmap.json", 6 + "compatibilityLevel": "JAVA_18", 7 + "mixins": [ 8 + "AbstractArrowMixin", 9 + "ItemMixin", 10 + "ItemMixin\$PropertiesMixin", 11 + "ItemStackMixin", 12 + "LivingEntityMixin", 13 + "ProjectileWeaponItemMixin", 14 + "ServerPlayerMixin", 15 + "ThrownTridentMixin" 16 + ], 17 + "client": [ 18 + "client.KeyAccess" 19 + ], 20 + "server": [], 21 + "injectors": { 22 + "defaultRequire": 1 23 23 } 24 24 }
+7 -5
common/src/test/java/dev/potota/itemstats/gametest/ItemStatsGameTests.java
··· 12 12 import net.minecraft.resources.Identifier; 13 13 import net.minecraft.server.level.ServerPlayer; 14 14 import net.minecraft.stats.Stats; 15 + import net.minecraft.util.Unit; 15 16 import net.minecraft.world.InteractionHand; 16 17 import net.minecraft.world.entity.EntityType; 17 18 import net.minecraft.world.entity.EquipmentSlot; ··· 56 57 test.assertMainHandStat(player, BuiltInStats.MOBS_SHEARED, "minecraft:sheep", 0); 57 58 58 59 Sheep sheep = test.spawnWithNoFreeWill(EntityType.SHEEP, 0, 1, 0); 59 - player.interactOn(sheep, InteractionHand.MAIN_HAND); 60 + player.interactOn(sheep, InteractionHand.MAIN_HAND, new Vec3(0, 0, 0)); 60 61 61 62 test.assertMainHandStat(player, BuiltInStats.MOBS_SHEARED, "minecraft:sheep", 1); 62 63 ··· 432 433 return functions; 433 434 } 434 435 435 - public static Map<Identifier, TestData<Holder<TestEnvironmentDefinition>>> collectTestData(Registry<TestEnvironmentDefinition> testEnvironmentDefinitions) { 436 - Map<Identifier, TestData<Holder<TestEnvironmentDefinition>>> data = new HashMap<>(); 436 + public static Map<Identifier, TestData<Holder<TestEnvironmentDefinition<?>>>> collectTestData(Registry<TestEnvironmentDefinition<?>> testEnvironmentDefinitions) { 437 + Map<Identifier, TestData<Holder<TestEnvironmentDefinition<?>>>> data = new HashMap<>(); 437 438 for (Method method : ItemStatsGameTests.class.getDeclaredMethods()) { 438 439 Test testOptions = method.getAnnotation(Test.class); 439 440 if (testOptions == null) continue; 440 441 441 - Optional<Holder.Reference<TestEnvironmentDefinition>> environment = testEnvironmentDefinitions.get(ResourceKey.create(Registries.TEST_ENVIRONMENT, Identifier.parse(testOptions.environment()))); 442 + Optional<Holder.Reference<TestEnvironmentDefinition<?>>> environment = testEnvironmentDefinitions.get(Identifier.parse(testOptions.environment())); 442 443 if (environment.isEmpty()) { 443 444 LOGGER.error("Could not find test environment " + testOptions.environment()); 444 445 continue; ··· 455 456 testOptions.manualOnly(), 456 457 testOptions.maxAttempts(), 457 458 testOptions.requiredSuccesses(), 458 - testOptions.skyAccess() 459 + testOptions.skyAccess(), 460 + 0 459 461 )); 460 462 } 461 463
+1 -1
common/src/test/resources/itemstats_test.accesswidener
··· 1 1 accessWidener v1 official 2 2 3 3 # Only used 4 - accessible class net/minecraft/resources/RegistryDataLoader$Loader 4 + #accessible class net/minecraft/resources/RegistryDataLoader$Loader
+2 -2
fabric/src/main/java/dev/potota/itemstats/impl/client/ItemStatsClientFabric.java
··· 2 2 3 3 import net.fabricmc.api.ClientModInitializer; 4 4 import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; 5 - import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; 5 + import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; 6 6 7 7 public class ItemStatsClientFabric implements ClientModInitializer { 8 8 @Override 9 9 public void onInitializeClient() { 10 - ItemStatsClientImpl.registerKeys(KeyBindingHelper::registerKeyBinding); 10 + ItemStatsClientImpl.registerKeys(KeyMappingHelper::registerKeyMapping); 11 11 ItemTooltipCallback.EVENT.register((stack, tooltipContext, tooltipFlag, lines) -> ItemStatsClientImpl.onTooltipRender(stack)); 12 12 } 13 13 }
+1 -1
fabric/src/main/java/dev/potota/itemstats/platform/FabricPlatformHelper.java
··· 10 10 public class FabricPlatformHelper implements IPlatformHelper { 11 11 @Override 12 12 public <T> Registry<T> createRegistry(ResourceKey<Registry<T>> key) { 13 - return FabricRegistryBuilder.createSimple(key).attribute(RegistryAttribute.SYNCED).buildAndRegister(); 13 + return FabricRegistryBuilder.create(key).attribute(RegistryAttribute.SYNCED).buildAndRegister(); 14 14 } 15 15 16 16 @Override
+3 -6
fabric/src/test/java/dev/potota/itemstats/mixin/FabricGameTestModInitializerMixin.java
··· 10 10 import net.minecraft.gametest.framework.GameTestInstance; 11 11 import net.minecraft.gametest.framework.TestData; 12 12 import net.minecraft.gametest.framework.TestEnvironmentDefinition; 13 - import net.minecraft.resources.RegistryDataLoader; 13 + import net.minecraft.resources.RegistryLoadTask; 14 14 import net.minecraft.resources.ResourceKey; 15 15 import net.minecraft.resources.Identifier; 16 16 import org.spongepowered.asm.mixin.Mixin; ··· 20 20 21 21 import java.util.List; 22 22 import java.util.Map; 23 - import java.util.Objects; 24 23 25 24 @Mixin(FabricGameTestModInitializer.class) 26 25 public class FabricGameTestModInitializerMixin { 27 26 @Inject(method = "registerDynamicEntries", at = @At("TAIL")) 28 - private static void itemstats$addTests(List<RegistryDataLoader.Loader<?>> registriesList, CallbackInfo ci, @Local(name = "registries") Map<ResourceKey<? extends Registry<?>>, Registry<?>> registries) { 29 - Registry<GameTestInstance> testInstances = (Registry<GameTestInstance>) registries.get(Registries.TEST_INSTANCE); 30 - Registry<TestEnvironmentDefinition> testEnvironmentDefinitions = (Registry<TestEnvironmentDefinition>) Objects.requireNonNull(registries.get(Registries.TEST_ENVIRONMENT)); 31 - for (Map.Entry<Identifier, TestData<Holder<TestEnvironmentDefinition>>> entry : ItemStatsGameTests.collectTestData(testEnvironmentDefinitions).entrySet()) { 27 + private static void itemstats$addTests(List<RegistryLoadTask<?>> registriesList, CallbackInfo ci, @Local(name = "testInstances") Registry<GameTestInstance> testInstances, @Local(name = "testEnvironmentDefinitionRegistry") Registry<TestEnvironmentDefinition<?>> testEnvironmentDefinitionRegistry) { 28 + for (Map.Entry<Identifier, TestData<Holder<TestEnvironmentDefinition<?>>>> entry : ItemStatsGameTests.collectTestData(testEnvironmentDefinitionRegistry).entrySet()) { 32 29 Registry.register( 33 30 testInstances, entry.getKey(), 34 31 new FunctionGameTestInstance(ResourceKey.create(Registries.TEST_FUNCTION, entry.getKey()), entry.getValue())
+3 -3
gradle.properties
··· 14 14 license=All Rights Reserved 15 15 credits= 16 16 description=Tracks usage stats on all of your gear! 17 - minecraft_version_range_fabric=26.1-snapshot-11 18 - minecraft_version_range_neoforge=[26.1-snapshot-11] 17 + minecraft_version_range_fabric=* 18 + minecraft_version_range_neoforge=[1.21.11,) 19 19 20 20 # NeoForm - https://projects.neoforged.net/neoforged/neoform 21 21 neo_form_version=26.1-snapshot-11-1 ··· 27 27 # Fabric - https://fabricmc.net/develop/ 28 28 fabric_api_version=0.143.10 29 29 fabric_api_minecraft=26.1 30 - fabric_loader_version=0.18.1 30 + fabric_loader_version=0.18.4 31 31 32 32 # NeoForge - https://projects.neoforged.net/neoforged/neoforge 33 33 neoforge_version=26.1.0.0-alpha.10+snapshot-6
+1 -1
neoforge/src/main/java/dev/potota/itemstats/mixin/neoforge/LivingEntityMixin.java
··· 32 32 } 33 33 34 34 @Inject(method = "applyItemBlocking", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/component/BlocksAttacks;hurtBlockingItem(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/InteractionHand;FI)V")) 35 - private void itemstats$trackShieldDamage(ServerLevel level, DamageSource damageSource, float damageAmount, CallbackInfoReturnable<Float> cir, @Local(name = "f") float damageAfterShield, @Local ItemStack shield) { 35 + private void itemstats$trackShieldDamage(ServerLevel level, DamageSource damageSource, float damageAmount, CallbackInfoReturnable<Float> cir, @Local(name = "damageBlocked") float damageAfterShield, @Local ItemStack shield) { 36 36 Identifier damageType = this.registryAccess().lookup(Registries.DAMAGE_TYPE).get().getKey(damageSource.type()); 37 37 BuiltInStats.DAMAGE_ABSORBED.increment(shield, damageType, damageAfterShield); 38 38 }
+2 -2
neoforge/src/test/java/dev/potota/itemstats_test/ItemStatsTestNeoForge.java
··· 41 41 42 42 @SubscribeEvent 43 43 public static void registerTestInstances(RegisterGameTestsEvent event) { 44 - Registry<TestEnvironmentDefinition> environments = ((RegisterGameTestsEventAccessor)event).itemstats$getEnvironmentsRegistry(); 45 - Map<Identifier, TestData<Holder<TestEnvironmentDefinition>>> testData = ItemStatsGameTests.collectTestData(environments); 44 + Registry<TestEnvironmentDefinition<?>> environments = ((RegisterGameTestsEventAccessor)event).itemstats$getEnvironmentsRegistry(); 45 + Map<Identifier, TestData<Holder<TestEnvironmentDefinition<?>>>> testData = ItemStatsGameTests.collectTestData(environments); 46 46 for (var entry : testData.entrySet()) { 47 47 event.registerTest(entry.getKey(), new FunctionGameTestInstance( 48 48 ResourceKey.create(BuiltInRegistries.TEST_FUNCTION.key(), entry.getKey()),
+1 -1
neoforge/src/test/java/dev/potota/itemstats_test/mixin/RegisterGameTestsEventAccessor.java
··· 8 8 9 9 @Mixin(RegisterGameTestsEvent.class) 10 10 public interface RegisterGameTestsEventAccessor { 11 - @Accessor("environmentsRegistry") WritableRegistry<TestEnvironmentDefinition> itemstats$getEnvironmentsRegistry(); 11 + @Accessor("environmentsRegistry") WritableRegistry<TestEnvironmentDefinition<?>> itemstats$getEnvironmentsRegistry(); 12 12 }