Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Made items with InnateEnchantments be enchantable in the enchanting table #230

Merged
merged 1 commit into from
Jul 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import chronosacaria.mcdw.Mcdw;
import chronosacaria.mcdw.enums.SettingsID;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -41,4 +41,30 @@ public interface IInnateEnchantment {
}
return itemStack;
}

/**
* Checks a stack if it only has enchantments that are lower or equal its InnateEnchantments,
* meaning enchantments had been added on top of the innate ones.
*
* Copyright 2023 DaFuqs
* <br/><br/>
* Used with Permission, modifications made to allow for checking whether innate enchantments are enabled or not.
* <br/><br/>
* The following code is from Spectrum and can be found here:<br/>
* <a href = "https://github.com/DaFuqs/Spectrum/blob/1.19-deeper-down/src/main/java/de/dafuqs/spectrum/items/Preenchanted.java#L13">Preenchanted#onlyHasPreEnchantments</a>
*/
default boolean onlyHasInnateEnchantments(ItemStack stack) {
Map<Enchantment, Integer> innateEnchantments = getInnateEnchantments();
Map<Enchantment, Integer> stackEnchantments = EnchantmentHelper.get(stack);

for(Map.Entry<Enchantment, Integer> stackEnchantment : stackEnchantments.entrySet()) {
int innateLevel = innateEnchantments.getOrDefault(stackEnchantment.getKey(), 0);
if(stackEnchantment.getValue() > innateLevel) {
return false;
}
}

return true;
}

}
18 changes: 15 additions & 3 deletions src/main/java/chronosacaria/mcdw/mixin/mcdw/ItemStackMixin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package chronosacaria.mcdw.mixin.mcdw;

import chronosacaria.mcdw.api.interfaces.*;
import chronosacaria.mcdw.api.util.CleanlinessHelper;
import chronosacaria.mcdw.enums.SwordsID;
import chronosacaria.mcdw.registries.ItemsRegistry;
Expand All @@ -14,7 +15,7 @@
import org.spongepowered.asm.mixin.Shadow;
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.*;

import java.util.Map;
import java.util.function.Consumer;
Expand All @@ -25,19 +26,30 @@ public abstract class ItemStackMixin {
@Shadow public abstract int getDamage();
@Shadow public abstract int getMaxDamage();
@Shadow public abstract NbtList getEnchantments();

// When the Mechanised Sawblade breaks, it "becomes" the Broken Sawblade
@Inject(at = @At("HEAD"), method = "damage(ILnet/minecraft/entity/LivingEntity;Ljava/util/function/Consumer;)V")
public <T extends LivingEntity> void mcdw$damage(int amount, T entity, Consumer<T> breakCallback, CallbackInfo ci) {
ItemStack itemStack = this.getItem().getDefaultStack();
if (itemStack.getItem() == ItemsRegistry.SWORD_ITEMS.get(SwordsID.SWORD_MECHANIZED_SAWBLADE) && getDamage() + amount >= getMaxDamage()) {
NbtList oldEnchantments = this.getEnchantments().copy();
ItemStack brokenSawblade = new ItemStack(ItemsRegistry.SWORD_ITEMS.get(SwordsID.SWORD_BROKEN_SAWBLADE));
brokenSawblade.setSubNbt("Enchantments", oldEnchantments);
brokenSawblade.setSubNbt(ItemStack.ENCHANTMENTS_KEY, oldEnchantments);
CleanlinessHelper.mcdw$dropItem(entity, brokenSawblade);
Map<Enchantment, Integer> brokenSawbladeEnchantments = EnchantmentHelper.get(brokenSawblade);
brokenSawbladeEnchantments.remove(Enchantments.FIRE_ASPECT);
EnchantmentHelper.set(brokenSawbladeEnchantments, brokenSawblade);
}
}

// The enchantment table does not allow enchanting items that already have enchantments applied
// This mixin changes items, that only got their IInnateEnchantments to still be enchantable
@Inject(method = "isEnchantable()Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;hasEnchantments()Z"), cancellable = true)
public void mcdw$isEnchantable(CallbackInfoReturnable<Boolean> cir) {
if (this.getItem() instanceof IInnateEnchantment iInnateEnchantment && iInnateEnchantment.onlyHasInnateEnchantments((ItemStack)(Object) this)) {
cir.setReturnValue(true);
}
}


}