diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml index 38bc40a00..531359cd2 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml @@ -8,6 +8,6 @@ v0.15.0 - 20251228235752 + 20260101193312 diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5 index e79c9ed56..87ad1fc06 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.md5 @@ -1 +1 @@ -abd9cd51fe52b72dbd56914bc664d2f4 \ No newline at end of file +90ec5f615ee399f4c91a06101f43dcef \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1 index aa54d6067..9ef7d9baa 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha1 @@ -1 +1 @@ -8c237978a6c32e163b16ddaa13502a38caef65e9 \ No newline at end of file +2a787adaddfdecaa4ee4954d67fe69f45063bb11 \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256 index 6d245e42f..444902f54 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha256 @@ -1 +1 @@ -8377337c99473867a8059ee1148761acc4c0dff9c828432b77b82eaaafa17151 \ No newline at end of file +db0bc2b03dfc1956eb1e1524c9bb28f6c8a7932920e9f6c030f3eedfd6bd482a \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512 index 7b71cf423..1372d6cd5 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/maven-metadata.xml.sha512 @@ -1 +1 @@ -9fd1e0f602f5f1b58a8e265c3a3f23d5a74be0392923b99937000fe19d869803d58286e353fc844b9b36dd57358b424d2d1c7739befef40a1d253641cca9b747 \ No newline at end of file +a468b484c91692ca7378cc0ea9d30fd12750b70b7785e4029716d514b743882a550039e1932bcf61f5c4c0c6fb33f7682c3097a79e0e12a3cd95b9452f8d9f32 \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar index 208b6f070..58c20363a 100644 Binary files a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar and b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar differ diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5 index 8a330f9d2..f2b132a40 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.md5 @@ -1 +1 @@ -3f08e47aa1942490da96db24870d8673 \ No newline at end of file +3def6c33335baf99410958025ad96ab4 \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1 index fd32208a6..d93e98ecb 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha1 @@ -1 +1 @@ -729ce038b0abfa8fc0390434d65d67411a9d2312 \ No newline at end of file +28e7e65ab2b8dc69944a7dc97bdb1f7444931b55 \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256 index 08c3f4e21..7e0141466 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha256 @@ -1 +1 @@ -e9ee9ede4b7811b0f5a54d2687d41d3857a5bf2ba0e84dd6c25865cd6b10e29c \ No newline at end of file +ed95cdb61e9a2739881b2da62c38b876d323f89b4892abbf7b8280a3559e8d7d \ No newline at end of file diff --git a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512 b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512 index 3e050c95d..2637a423a 100644 --- a/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512 +++ b/mcmodsrepo/net/ltxprogrammer/changed/Changed-m1.20.1-f47.4.0/v0.15.0/Changed-m1.20.1-f47.4.0-v0.15.0.jar.sha512 @@ -1 +1 @@ -66a8220b0b2404339d2b8903b4958e8a872af7e8da0355dc2d9e1730535371927a3d54a9d41d6661672485b574c78fd84049499c37ee0d17d60b6b5202cc3ea4 \ No newline at end of file +3a104ff40445e43b7333a7436a6b688f949016691a31a2f4fd5f1c11a9b6d0ff17e86ff86b0454453f594d8e419d31ea61d883b8d72b5846c539d20d8d2c7a19 \ No newline at end of file diff --git a/src/main/java/net/ltxprogrammer/changed/item/AccessoryItem.java b/src/main/java/net/ltxprogrammer/changed/item/AccessoryItem.java index 82282c5d9..f8fa0dc9d 100644 --- a/src/main/java/net/ltxprogrammer/changed/item/AccessoryItem.java +++ b/src/main/java/net/ltxprogrammer/changed/item/AccessoryItem.java @@ -11,6 +11,7 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.phys.AABB; @@ -92,6 +93,36 @@ default boolean shouldDisableSlot(AccessorySlotContext slotContext, Accessory return false; } + + /** + * Allow the Accessory to be Considered by an Enchantment + * It Affects directly the Enchantment behavior where it will make the method considerate the item and it equivalentSlot from the slot type + * The main default value is false + * @param accessorySlotContext The Accessory Slot Context (Contains Wearer, ItemStack, etc.) + * @param enchantment The Enchantment to be considered + * @return false if the enchantment should not be considered + */ + default boolean isConsideredByEnchantment(AccessorySlotContext accessorySlotContext, Enchantment enchantment, ExecutionContext executionContext) { + return false; + } + + enum ExecutionContext { //TODO: a better name + IDLE, + POST_HURT, + POST_ATTACK + } + + /** + * It Affects directly the Entity$getAllSlots where it will make the method considerate the item and it equivalentSlot from the slot type + * This make the item be affected by Post Damage/Hurt Effects use with it caution + * The main default value is false + * @param context The Accessory context + * @return false if the enchantment should not be considered + */ + default boolean isAffectedByEnchantments(AccessorySlotContext context) { + return true; + } + default void accessoryEquipped(AccessorySlotContext slotContext) {} default void accessoryRemoved(AccessorySlotContext slotContext) {} diff --git a/src/main/java/net/ltxprogrammer/changed/item/ExoskeletonItem.java b/src/main/java/net/ltxprogrammer/changed/item/ExoskeletonItem.java index faf0c8eda..20de8c979 100644 --- a/src/main/java/net/ltxprogrammer/changed/item/ExoskeletonItem.java +++ b/src/main/java/net/ltxprogrammer/changed/item/ExoskeletonItem.java @@ -8,10 +8,7 @@ import net.ltxprogrammer.changed.data.AccessorySlots; import net.ltxprogrammer.changed.entity.robot.AbstractRobot; import net.ltxprogrammer.changed.entity.robot.ChargerType; -import net.ltxprogrammer.changed.init.ChangedAccessorySlots; -import net.ltxprogrammer.changed.init.ChangedDamageSources; -import net.ltxprogrammer.changed.init.ChangedSounds; -import net.ltxprogrammer.changed.init.ChangedTags; +import net.ltxprogrammer.changed.init.*; import net.ltxprogrammer.changed.process.ProcessTransfur; import net.ltxprogrammer.changed.util.Cacheable; import net.ltxprogrammer.changed.util.EntityUtil; @@ -79,9 +76,18 @@ public ExoskeletonItem(Properties builder, Supplier> entityType) { @Override public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment == Enchantments.THORNS) return true; + return enchantment != Enchantments.MENDING && super.canApplyAtEnchantingTable(stack, enchantment); } + @Override + public boolean isConsideredByEnchantment(AccessorySlotContext accessorySlotContext, Enchantment enchantment, ExecutionContext executionContext) { + if (enchantment == Enchantments.THORNS) return true; + + return AccessoryItem.super.isConsideredByEnchantment(accessorySlotContext, enchantment, executionContext); + } + @Override public boolean allowedInSlot(ItemStack itemStack, LivingEntity wearer, AccessorySlotType slot) { if (!canUse(itemStack)) { diff --git a/src/main/java/net/ltxprogrammer/changed/mixin/EnchantmentMixin.java b/src/main/java/net/ltxprogrammer/changed/mixin/EnchantmentMixin.java new file mode 100644 index 000000000..08335ab50 --- /dev/null +++ b/src/main/java/net/ltxprogrammer/changed/mixin/EnchantmentMixin.java @@ -0,0 +1,73 @@ +package net.ltxprogrammer.changed.mixin; + +import net.ltxprogrammer.changed.data.AccessorySlotContext; +import net.ltxprogrammer.changed.data.AccessorySlots; +import net.ltxprogrammer.changed.item.AccessoryItem; +import net.ltxprogrammer.changed.item.AccessoryItem.ExecutionContext; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.HashMap; +import java.util.Map; + +@Mixin(Enchantment.class) +public class EnchantmentMixin { + + @Inject(method = "getSlotItems", at = @At("RETURN"), cancellable = true) + private void accessoriesEnchantmentDetectionIdle(LivingEntity pEntity, CallbackInfoReturnable> cir) { + AccessorySlots.getForEntity(pEntity).ifPresent((slots) -> + slots.forEachSlot((slotType, itemStack) -> { + if (itemStack.isEmpty()) return; + if (!(itemStack.getItem() instanceof AccessoryItem accessoryItem)) return; + if (accessoryItem.isConsideredByEnchantment(AccessorySlotContext.of(pEntity, slotType), self(), ExecutionContext.IDLE)) { + Map returnValue = cir.getReturnValue(); + Map newReturnValue = new HashMap<>(); + if (returnValue != null) { + newReturnValue.put(slotType.getEquivalentSlot(), itemStack); + cir.setReturnValue(newReturnValue); + } + } + }) + ); + } + + @Inject(method = "doPostAttack", at = @At("HEAD"), cancellable = true) + private void accessoriesEnchantmentDetectionPostAttack(LivingEntity attacker, Entity target, int pLevel, CallbackInfo ci) { + AccessorySlots.getForEntity(attacker).ifPresent((slots) -> + slots.forEachSlot((slotType, itemStack) -> { + if (itemStack.isEmpty()) return; + if (!(itemStack.getItem() instanceof AccessoryItem accessoryItem)) return; + if (!accessoryItem.isConsideredByEnchantment(AccessorySlotContext.of(attacker, slotType), self(), ExecutionContext.POST_ATTACK)) { + ci.cancel(); //Cancel behavior if the accessory item don't support it + } + }) + ); + } + + @Inject(method = "doPostHurt", at = @At("HEAD"), cancellable = true) + private void accessoriesEnchantmentDetectionPostHurt(LivingEntity attacker, Entity target, int pLevel, CallbackInfo ci) { + AccessorySlots.getForEntity(attacker).ifPresent((slots) -> + slots.forEachSlot((slotType, itemStack) -> { + if (itemStack.isEmpty()) return; + if (!(itemStack.getItem() instanceof AccessoryItem accessoryItem)) return; + if (!accessoryItem.isConsideredByEnchantment(AccessorySlotContext.of(attacker, slotType), self(), ExecutionContext.POST_HURT)) { + ci.cancel(); //Cancel behavior if the accessory item don't support it + } + }) + ); + } + + @Unique + private Enchantment self() { + return (Enchantment) (Object) this; + } +} diff --git a/src/main/java/net/ltxprogrammer/changed/mixin/entity/EntityMixin.java b/src/main/java/net/ltxprogrammer/changed/mixin/entity/EntityMixin.java index 1faf877ef..246970cf6 100644 --- a/src/main/java/net/ltxprogrammer/changed/mixin/entity/EntityMixin.java +++ b/src/main/java/net/ltxprogrammer/changed/mixin/entity/EntityMixin.java @@ -7,6 +7,8 @@ import net.ltxprogrammer.changed.ability.GrabEntityAbility; import net.ltxprogrammer.changed.ability.IAbstractChangedEntity; import net.ltxprogrammer.changed.block.StasisChamber; +import net.ltxprogrammer.changed.data.AccessorySlotContext; +import net.ltxprogrammer.changed.data.AccessorySlots; import net.ltxprogrammer.changed.entity.ChangedEntity; import net.ltxprogrammer.changed.entity.LivingEntityDataExtension; import net.ltxprogrammer.changed.entity.SeatEntity; @@ -15,6 +17,7 @@ import net.ltxprogrammer.changed.entity.variant.TransfurVariantInstance; import net.ltxprogrammer.changed.init.ChangedAbilities; import net.ltxprogrammer.changed.init.ChangedTags; +import net.ltxprogrammer.changed.item.AccessoryItem; import net.ltxprogrammer.changed.process.ProcessTransfur; import net.ltxprogrammer.changed.util.EntityUtil; import net.ltxprogrammer.changed.world.LatexCoverGetter; @@ -32,6 +35,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; @@ -51,6 +55,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; @Mixin(Entity.class) @@ -289,4 +295,31 @@ protected SoundType maybeGetLatexCoverSoundRemapped(BlockState instance, LevelRe final SoundType coveredSound = coverState.getSoundType(reader, blockPos.above(), entity); return coveredSound != null ? coveredSound : original.call(instance, reader, blockPos, entity); } + + @Inject(method = "getAllSlots", at = @At("RETURN"), cancellable = true) + private void hookAccessoriesSlots(CallbackInfoReturnable> cir) { + Entity self = (Entity) (Object) this; + if (!(self instanceof LivingEntity livingEntity)) return; + List defaultStacks = new ArrayList<>(); + List stacks = new ArrayList<>(); + + AccessorySlots.getForEntity(livingEntity).ifPresent((slots) -> + slots.forEachSlot((slotType, itemStack) -> { + if (itemStack.isEmpty()) return; + if (!(itemStack.getItem() instanceof AccessoryItem accessoryItem)) return; + if (accessoryItem.isAffectedByEnchantments(AccessorySlotContext.of(livingEntity, slotType))) { + stacks.add(itemStack); + } + }) + ); + + if (!stacks.isEmpty()) { + Iterable returnValue = cir.getReturnValue(); + if (returnValue != null) { + returnValue.forEach(defaultStacks::add); + stacks.addAll(defaultStacks); + cir.setReturnValue(stacks); + } + } + } } \ No newline at end of file diff --git a/src/main/java/net/ltxprogrammer/changed/world/data/ChangedGameData.java b/src/main/java/net/ltxprogrammer/changed/world/data/ChangedGameData.java index c5b1f6725..0ebf90806 100644 --- a/src/main/java/net/ltxprogrammer/changed/world/data/ChangedGameData.java +++ b/src/main/java/net/ltxprogrammer/changed/world/data/ChangedGameData.java @@ -14,6 +14,7 @@ public class ChangedGameData { private final ServerLevel attachedLevel; + private int loggedFacilityTimes = 0; public final List facilities = new ObjectArrayList<>(2); @@ -116,7 +117,10 @@ public void loadFeatures() { facility.setHeader(pair.getSecond()); return facility; } catch (Exception e) { - Changed.LOGGER.error("Failed to load facility from disk ", e); + if (loggedFacilityTimes < 20) { + Changed.LOGGER.error("Failed to load facility from disk ", e); + loggedFacilityTimes++; + } } return null; }).filter(Objects::nonNull).forEach(facilities::add); diff --git a/src/main/resources/changed.mixins.json b/src/main/resources/changed.mixins.json index e4cebc1f3..46058fdb3 100644 --- a/src/main/resources/changed.mixins.json +++ b/src/main/resources/changed.mixins.json @@ -7,6 +7,7 @@ "mixins": [ "DataFixTypesMixin", "EnchantmentHelperMixin", + "EnchantmentMixin", "InventoryMenuMixin", "LevelMixin", "NbtUtilsMixin",