From 27387a5bb49c4b6d92a16708c4695f2e4df34b3e Mon Sep 17 00:00:00 2001 From: Electro_593 Date: Tue, 21 Jan 2025 10:28:29 -0500 Subject: [PATCH] More item components --- .../spectrum/api/item/ActivatableItem.java | 14 +--- .../api/item/ExperienceStorageItem.java | 79 ++++++------------- .../chests/BlackHoleChestBlockEntity.java | 8 +- .../cinderhearth/CinderhearthBlockEntity.java | 7 +- .../deeper_down/flora/DoomBloomBlock.java | 19 ++++- .../helpers/SpectrumEnchantmentHelper.java | 1 + .../items/magic_items/KnowledgeGemItem.java | 53 ++++++------- .../spectrum/items/tools/DreamflayerItem.java | 45 ++++++----- .../items/tools/FerociousBidentItem.java | 8 +- .../items/tools/MalachiteBidentItem.java | 9 ++- .../spectrum/mixin/PlayerEntityMixin.java | 2 +- .../BlackHoleChestStatusUpdatePayload.java | 19 +++-- .../SpectrumDataComponentTypes.java | 3 + .../registries/SpectrumItemGroups.java | 8 +- .../SpectrumItemProjectileBehaviors.java | 4 +- .../SpectrumModelPredicateProviders.java | 2 +- 16 files changed, 135 insertions(+), 146 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/api/item/ActivatableItem.java b/src/main/java/de/dafuqs/spectrum/api/item/ActivatableItem.java index 2cbfdab16d..b4a5cf65be 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/ActivatableItem.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/ActivatableItem.java @@ -1,24 +1,16 @@ package de.dafuqs.spectrum.api.item; +import de.dafuqs.spectrum.registries.*; import net.minecraft.item.*; -import net.minecraft.nbt.*; public interface ActivatableItem { - String NBT_STRING = "activated"; - static void setActivated(ItemStack stack, boolean activated) { - NbtCompound compound = stack.getOrCreateNbt(); - compound.putBoolean(NBT_STRING, activated); - stack.setNbt(compound); + stack.set(SpectrumDataComponentTypes.ACTIVATED, activated); } static boolean isActivated(ItemStack stack) { - NbtCompound compound = stack.getNbt(); - if (compound != null && compound.contains(NBT_STRING)) { - return compound.getBoolean(NBT_STRING); - } - return false; + return stack.getOrDefault(SpectrumDataComponentTypes.ACTIVATED, false); } } diff --git a/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java b/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java index 0728b8a0e7..07c00f9b4b 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/ExperienceStorageItem.java @@ -1,9 +1,9 @@ package de.dafuqs.spectrum.api.item; -import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.helpers.*; +import de.dafuqs.spectrum.registries.*; import net.minecraft.item.*; -import net.minecraft.nbt.*; +import net.minecraft.registry.*; import net.minecraft.util.math.random.*; public interface ExperienceStorageItem { @@ -15,12 +15,7 @@ public interface ExperienceStorageItem { * @return The amount of stored experience */ static int getStoredExperience(ItemStack itemStack) { - NbtCompound nbtCompound = itemStack.getNbt(); - if (nbtCompound == null || !nbtCompound.contains("stored_experience", NbtElement.NUMBER_TYPE)) { - return 0; - } else { - return nbtCompound.getInt("stored_experience"); - } + return itemStack.getOrDefault(SpectrumDataComponentTypes.STORED_EXPERIENCE, 0); } /** @@ -32,10 +27,10 @@ static int getStoredExperience(ItemStack itemStack) { * @param random A random * @return The overflow amount that could not be stored */ - static int addStoredExperience(ItemStack itemStack, float amount, Random random) { + static int addStoredExperience(RegistryWrapper.WrapperLookup lookup, ItemStack itemStack, float amount, Random random) { if (amount > 0) { int intAmount = Support.getIntFromDecimalWithChance(amount, random); - return addStoredExperience(itemStack, intAmount); + return addStoredExperience(lookup, itemStack, intAmount); } return 0; } @@ -48,38 +43,23 @@ static int addStoredExperience(ItemStack itemStack, float amount, Random random) * @param amount The amount of experience to store * @return The overflow amount that could not be stored */ - static int addStoredExperience(ItemStack itemStack, int amount) { - if (amount <= 0) { + static int addStoredExperience(RegistryWrapper.WrapperLookup lookup, ItemStack itemStack, int amount) { + if (amount <= 0 || itemStack.isEmpty()) return 0; - } if (itemStack.getItem() instanceof ExperienceStorageItem experienceStorageItem) { - int maxStorage = experienceStorageItem.getMaxStoredExperience(itemStack); - - NbtCompound nbtCompound = itemStack.getOrCreateNbt(); - if (!nbtCompound.contains("stored_experience", NbtElement.NUMBER_TYPE)) { - nbtCompound.putInt("stored_experience", amount); - itemStack.setNbt(nbtCompound); - return 0; - } else { - int existingStoredExperience = nbtCompound.getInt("stored_experience"); - int experienceOverflow = maxStorage - amount - existingStoredExperience; - - if (experienceOverflow < 0) { - nbtCompound.putInt("stored_experience", maxStorage); - itemStack.setNbt(nbtCompound); - return -experienceOverflow; - } else { - nbtCompound.putInt("stored_experience", existingStoredExperience + amount); - itemStack.setNbt(nbtCompound); - return 0; - } - } - } else if (!itemStack.isEmpty()) { - SpectrumCommon.logError("Tried to add stored Experience to a non-ExperienceStorageItem item: " + itemStack.getItem().getName().getString()); + int maxStorage = experienceStorageItem.getMaxStoredExperience(lookup, itemStack); + int existing = itemStack.getOrDefault(SpectrumDataComponentTypes.STORED_EXPERIENCE, 0); + int toAdd = amount + existing; + int overflow = Math.max(toAdd - maxStorage, 0); + toAdd = Math.min(toAdd, maxStorage); + itemStack.set(SpectrumDataComponentTypes.STORED_EXPERIENCE, toAdd); + return overflow; + } else { + itemStack.apply(SpectrumDataComponentTypes.STORED_EXPERIENCE, 0, existing -> existing + amount); + return 0; } - return 0; } /** @@ -91,26 +71,17 @@ static int addStoredExperience(ItemStack itemStack, int amount) { * @return If there was enough experience that could be removed */ static boolean removeStoredExperience(ItemStack itemStack, int amount) { - if (itemStack.getItem() instanceof ExperienceStorageItem) { - NbtCompound nbtCompound = itemStack.getNbt(); - if (nbtCompound == null || !nbtCompound.contains("stored_experience", NbtElement.NUMBER_TYPE)) { - return false; - } else { - int existingStoredExperience = nbtCompound.getInt("stored_experience"); - if (existingStoredExperience < amount) { - return false; - } else { - nbtCompound.putInt("stored_experience", existingStoredExperience - amount); - itemStack.setNbt(nbtCompound); - return true; - } + if (itemStack.contains(SpectrumDataComponentTypes.STORED_EXPERIENCE)) { + var existing = itemStack.getOrDefault(SpectrumDataComponentTypes.STORED_EXPERIENCE, 0); + var newAmount = existing - amount; + if (newAmount >= 0) { + itemStack.set(SpectrumDataComponentTypes.STORED_EXPERIENCE, newAmount); + return true; } - } else { - SpectrumCommon.logError("Tried to remove stored Experience from a non-ExperienceStorageItem: " + itemStack.getItem().getName().getString()); - return false; } + return false; } - int getMaxStoredExperience(ItemStack itemStack); + int getMaxStoredExperience(RegistryWrapper.WrapperLookup lookup, ItemStack itemStack); } diff --git a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java index 47d98e4132..4e43e8f698 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/chests/BlackHoleChestBlockEntity.java @@ -34,7 +34,7 @@ import java.util.*; import java.util.stream.*; -public class BlackHoleChestBlockEntity extends SpectrumChestBlockEntity implements ExtendedScreenHandlerFactory, SidedInventory, EventQueue.Callback { +public class BlackHoleChestBlockEntity extends SpectrumChestBlockEntity implements FilterConfigurable, ExtendedScreenHandlerFactory, SidedInventory, EventQueue.Callback { public static final int INVENTORY_SIZE = 28; public static final int ITEM_FILTER_SLOT_COUNT = 5; @@ -141,10 +141,10 @@ public boolean isFull() { } } - if (canStoreExperience()) { + if (canStoreExperience() && world != null) { var experienceStack = inventory.get(EXPERIENCE_STORAGE_PROVIDER_ITEM_SLOT); var experienceStorage = (ExperienceStorageItem) experienceStack.getItem(); - return ExperienceStorageItem.getStoredExperience(experienceStack) >= experienceStorage.getMaxStoredExperience(experienceStack); + return ExperienceStorageItem.getStoredExperience(experienceStack) >= experienceStorage.getMaxStoredExperience(world.getRegistryManager(), experienceStack); } return true; @@ -257,7 +257,7 @@ public void triggerEvent(World world, GameEventListener listener, Object entry) if (entry instanceof ExperienceOrbEventQueue.EventEntry experienceEntry) { ExperienceOrbEntity experienceOrbEntity = experienceEntry.experienceOrbEntity; if (experienceOrbEntity != null && experienceOrbEntity.isAlive() && hasExperienceStorageItem()) { - ExperienceStorageItem.addStoredExperience(this.inventory.get(EXPERIENCE_STORAGE_PROVIDER_ITEM_SLOT), experienceOrbEntity.getExperienceAmount()); // overflow experience is void, to not lag the world on large farms + ExperienceStorageItem.addStoredExperience(world.getRegistryManager(), this.inventory.get(EXPERIENCE_STORAGE_PROVIDER_ITEM_SLOT), experienceOrbEntity.getExperienceAmount()); // overflow experience is void, to not lag the world on large farms sendPlayExperienceOrbEntityAbsorbedParticle((ServerWorld) world, experienceOrbEntity); world.playSound(null, experienceOrbEntity.getBlockPos(), SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.BLOCKS, 0.9F + world.random.nextFloat() * 0.2F, 0.9F + world.random.nextFloat() * 0.2F); diff --git a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java index 6fe8a3131d..a89955f4ee 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/cinderhearth/CinderhearthBlockEntity.java @@ -437,6 +437,9 @@ public static void craftCinderhearthRecipe(World world, @NotNull CinderhearthBlo } private static void craftRecipe(@NotNull CinderhearthBlockEntity cinderhearth, ItemStack inputStack, List outputs, float experience) { + var world = cinderhearth.world; + if (world == null) return; + DefaultedList backupInventory = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); for (int i = 0; i < cinderhearth.inventory.size(); i++) { backupInventory.set(i, cinderhearth.inventory.get(i)); @@ -467,8 +470,8 @@ private static void craftRecipe(@NotNull CinderhearthBlockEntity cinderhearth, I // grant experience & advancements float experienceMod = cinderhearth.drainInkForUpgrades(cinderhearth, UpgradeType.EXPERIENCE, InkColors.PURPLE, cinderhearth.usesEfficiency); - int finalExperience = Support.getIntFromDecimalWithChance(experience * experienceMod, cinderhearth.world.random); - ExperienceStorageItem.addStoredExperience(cinderhearth.getStack(EXPERIENCE_STORAGE_ITEM_SLOT_ID), finalExperience); + int finalExperience = Support.getIntFromDecimalWithChance(experience * experienceMod, world.random); + ExperienceStorageItem.addStoredExperience(world.getRegistryManager(), cinderhearth.getStack(EXPERIENCE_STORAGE_ITEM_SLOT_ID), finalExperience); cinderhearth.grantPlayerCinderhearthSmeltingAdvancement(inputStackCopy, outputs, finalExperience); } else { cinderhearth.inventory = backupInventory; diff --git a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java index 2b22d085fe..c8de8bfcc8 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/deeper_down/flora/DoomBloomBlock.java @@ -1,11 +1,14 @@ package de.dafuqs.spectrum.blocks.deeper_down.flora; import com.mojang.serialization.*; +import com.mojang.serialization.codecs.*; import de.dafuqs.spectrum.api.block.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.fabricmc.fabric.api.tag.convention.v2.*; import net.minecraft.block.*; import net.minecraft.block.entity.*; +import net.minecraft.component.type.*; import net.minecraft.enchantment.*; import net.minecraft.entity.*; import net.minecraft.entity.effect.*; @@ -29,19 +32,27 @@ public class DoomBloomBlock extends FlowerBlock implements Fertilizable, ExplosionAware { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec((i) -> i.group( + STEW_EFFECT_CODEC.forGetter(FlowerBlock::getStewEffects), + createSettingsCodec() + ).apply(i, DoomBloomBlock::new)); + public static final IntProperty AGE = Properties.AGE_4; public static final int AGE_MAX = Properties.AGE_4_MAX; protected static final VoxelShape SHAPE = Block.createCuboidShape(4.0, 0.0, 4.0, 12.0, 9.0, 12.0); protected static final double GROW_CHANCE = 0.2; public DoomBloomBlock(RegistryEntry suspiciousStewEffect, int effectDuration, Settings settings) { - super(suspiciousStewEffect, effectDuration, settings); + this(createStewEffectList(suspiciousStewEffect, effectDuration), settings); + } + + public DoomBloomBlock(SuspiciousStewEffectsComponent stewEffects, Settings settings) { + super(stewEffects, settings); } @Override public MapCodec getCodec() { - //TODO: Make the codec - return null; + return CODEC; } @Override @@ -151,7 +162,7 @@ public void neighborUpdate(BlockState state, World world, BlockPos pos, Block bl @Override public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, ItemStack stack) { super.afterBreak(world, player, pos, state, blockEntity, stack); - if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, stack) == 0 && !stack.isIn(ConventionalItemTags.SHEAR_TOOLS)) { + if (SpectrumEnchantmentHelper.getLevel(world.getRegistryManager(), Enchantments.SILK_TOUCH, stack) == 0 && !stack.isIn(ConventionalItemTags.SHEAR_TOOLS)) { explode(world, pos, state); } } diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java index b2a89ec9c5..326d9a3d46 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java @@ -16,6 +16,7 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.*; +import net.minecraft.world.*; import org.jetbrains.annotations.*; import java.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java b/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java index 759c55dece..e197eaa9cc 100644 --- a/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/magic_items/KnowledgeGemItem.java @@ -1,6 +1,8 @@ package de.dafuqs.spectrum.items.magic_items; +import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.block.entity.*; import net.minecraft.enchantment.*; @@ -8,7 +10,6 @@ import net.minecraft.entity.player.*; import net.minecraft.item.*; import net.minecraft.item.tooltip.*; -import net.minecraft.nbt.*; import net.minecraft.registry.*; import net.minecraft.server.network.*; import net.minecraft.sound.*; @@ -34,18 +35,14 @@ public KnowledgeGemItem(Settings settings, int maxStorageBase) { public static ItemStack getKnowledgeDropStackWithXP(int experience, boolean noStoreTooltip) { ItemStack stack = new ItemStack(SpectrumItems.KNOWLEDGE_GEM); - NbtCompound compound = new NbtCompound(); - compound.putInt("stored_experience", experience); - if (noStoreTooltip) { - compound.putBoolean("do_not_display_store_tooltip", true); - } - stack.setNbt(compound); + stack.set(SpectrumDataComponentTypes.STORED_EXPERIENCE, experience); + stack.set(SpectrumDataComponentTypes.HIDE_USAGE_TOOLTIP, noStoreTooltip); return stack; } @Override - public int getMaxStoredExperience(ItemStack itemStack) { - int efficiencyLevel = EnchantmentHelper.getLevel(Enchantments.EFFICIENCY, itemStack); + public int getMaxStoredExperience(RegistryWrapper.WrapperLookup lookup, ItemStack itemStack) { + int efficiencyLevel = SpectrumEnchantmentHelper.getLevel(lookup, Enchantments.EFFICIENCY, itemStack); return maxStorageBase * (int) Math.pow(10, Math.min(5, efficiencyLevel)); // to not exceed int max } @@ -54,8 +51,8 @@ public UseAction getUseAction(ItemStack stack) { return UseAction.BOW; } - public int getTransferableExperiencePerTick(ItemStack itemStack) { - int quickChargeLevel = EnchantmentHelper.getLevel(Enchantments.QUICK_CHARGE, itemStack); + public int getTransferableExperiencePerTick(RegistryWrapper.WrapperLookup lookup, ItemStack itemStack) { + int quickChargeLevel = SpectrumEnchantmentHelper.getLevel(lookup, Enchantments.QUICK_CHARGE, itemStack); return (int) (2 * Math.pow(2, Math.min(10, quickChargeLevel))); } @@ -76,15 +73,15 @@ public void usageTick(World world, LivingEntity user, ItemStack stack, int remai int playerExperience = serverPlayerEntity.totalExperience; int itemExperience = ExperienceStorageItem.getStoredExperience(stack); - int transferableExperience = getTransferableExperiencePerTick(stack); + int transferableExperience = getTransferableExperiencePerTick(world.getRegistryManager(), stack); if (serverPlayerEntity.isSneaking()) { - int maxStorage = getMaxStoredExperience(stack); + int maxStorage = getMaxStoredExperience(world.getRegistryManager(), stack); int experienceToTransfer = serverPlayerEntity.isCreative() ? Math.min(transferableExperience, maxStorage - itemExperience) : Math.min(Math.min(transferableExperience, playerExperience), maxStorage - itemExperience); // store experience in gem; drain from player if (experienceToTransfer > 0 && itemExperience < maxStorage && removePlayerExperience(serverPlayerEntity, experienceToTransfer)) { - ExperienceStorageItem.addStoredExperience(stack, experienceToTransfer); + ExperienceStorageItem.addStoredExperience(world.getRegistryManager(), stack, experienceToTransfer); if (remainingUseTicks % 4 == 0) { world.playSound(null, user.getBlockPos(), SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, SoundCategory.PLAYERS, 0.3F, 0.8F + world.getRandom().nextFloat() * 0.4F); @@ -114,22 +111,24 @@ public void usageTick(World world, LivingEntity user, ItemStack stack, int remai public void appendTooltip(ItemStack stack, TooltipContext context, List tooltip, TooltipType type) { super.appendTooltip(stack, context, tooltip, type); - int maxExperience = getMaxStoredExperience(stack); - int storedExperience = ExperienceStorageItem.getStoredExperience(stack); - if (storedExperience == 0) { - tooltip.add(Text.literal("0 ").formatted(Formatting.DARK_GRAY).append(Text.translatable("item.spectrum.knowledge_gem.tooltip.stored_experience", maxExperience).formatted(Formatting.GRAY))); - } else { - tooltip.add(Text.literal(storedExperience + " ").formatted(Formatting.GREEN).append(Text.translatable("item.spectrum.knowledge_gem.tooltip.stored_experience", maxExperience).formatted(Formatting.GRAY))); - } - if (shouldDisplayUsageTooltip(stack)) { - tooltip.add(Text.translatable("item.spectrum.knowledge_gem.tooltip.use", getTransferableExperiencePerTick(stack)).formatted(Formatting.GRAY)); - addBannerPatternProviderTooltip(tooltip); - } + SpectrumCommon.getRegistryLookup().ifPresent(lookup -> { + int maxExperience = getMaxStoredExperience(lookup, stack); + int storedExperience = ExperienceStorageItem.getStoredExperience(stack); + if (storedExperience == 0) { + tooltip.add(Text.literal("0 ").formatted(Formatting.DARK_GRAY).append(Text.translatable("item.spectrum.knowledge_gem.tooltip.stored_experience", maxExperience).formatted(Formatting.GRAY))); + } else { + tooltip.add(Text.literal(storedExperience + " ").formatted(Formatting.GREEN).append(Text.translatable("item.spectrum.knowledge_gem.tooltip.stored_experience", maxExperience).formatted(Formatting.GRAY))); + } + if (shouldDisplayUsageTooltip(stack)) { + tooltip.add(Text.translatable("item.spectrum.knowledge_gem.tooltip.use", getTransferableExperiencePerTick(lookup, stack)).formatted(Formatting.GRAY)); + addBannerPatternProviderTooltip(tooltip); + } + }); + } public boolean shouldDisplayUsageTooltip(ItemStack itemStack) { - NbtCompound nbtCompound = itemStack.getNbt(); - return nbtCompound == null || !nbtCompound.getBoolean("do_not_display_store_tooltip"); + return itemStack.getOrDefault(SpectrumDataComponentTypes.HIDE_USAGE_TOOLTIP, false); } public boolean removePlayerExperience(@NotNull PlayerEntity playerEntity, int experience) { diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java index b69703cbe1..6067968a69 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/DreamflayerItem.java @@ -1,6 +1,5 @@ package de.dafuqs.spectrum.items.tools; -import com.google.common.collect.*; import de.dafuqs.spectrum.api.energy.*; import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.item.*; @@ -8,6 +7,7 @@ import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; import net.fabricmc.api.*; +import net.minecraft.component.*; import net.minecraft.component.type.*; import net.minecraft.entity.*; import net.minecraft.entity.attribute.*; @@ -38,13 +38,13 @@ public class DreamflayerItem extends SwordItem implements InkPowered, Activatabl */ public static final float ARMOR_DIFFERENCE_DAMAGE_MULTIPLIER = 2.5F; - public final float attackDamage; - public final float attackSpeed; + private final float baseAttackDamage; + private final float baseAttackSpeed; public DreamflayerItem(ToolMaterial toolMaterial, int attackDamage, float attackSpeed, Settings settings) { super(toolMaterial, settings.attributeModifiers(SwordItem.createAttributeModifiers(toolMaterial, attackDamage, attackSpeed))); - this.attackDamage = attackDamage; - this.attackSpeed = attackSpeed; + this.baseAttackDamage = attackDamage; + this.baseAttackSpeed = attackSpeed; } public static float getDamageAfterModifier(float amount, LivingEntity attacker, LivingEntity target) { @@ -63,13 +63,13 @@ public TypedActionResult use(World world, PlayerEntity user, Hand han if (hand == Hand.MAIN_HAND && user.isSneaking()) { boolean isActivated = ActivatableItem.isActivated(stack); if (isActivated) { - ActivatableItem.setActivated(stack, false); + setActivated(stack, false); if (!world.isClient) { world.playSound(null, user.getX(), user.getY(), user.getZ(), SpectrumSoundEvents.DREAMFLAYER_DEACTIVATE, SoundCategory.PLAYERS, 1.0F, 1F); } } else { if (InkPowered.tryDrainEnergy(user, USED_COLOR, INK_COST_FOR_ACTIVATION)) { - ActivatableItem.setActivated(stack, true); + setActivated(stack, true); if (!world.isClient) { world.playSound(null, user.getX(), user.getY(), user.getZ(), SpectrumSoundEvents.DREAMFLAYER_ACTIVATE, SoundCategory.PLAYERS, 1.0F, 1F); } @@ -98,7 +98,7 @@ public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, } else { if (world.getTime() % 20 == 0 && ActivatableItem.isActivated(stack)) { if (entity instanceof ServerPlayerEntity player && !InkPowered.tryDrainEnergy(player, USED_COLOR, INK_COST_PER_SECOND)) { - ActivatableItem.setActivated(stack, false); + setActivated(stack, false); world.playSound(null, entity.getX(), entity.getY(), entity.getZ(), SpectrumSoundEvents.DREAMFLAYER_DEACTIVATE, SoundCategory.PLAYERS, 0.8F, 1F); } } @@ -126,19 +126,24 @@ private boolean reequipAnimation(ItemStack before, ItemStack after) { return !after.isOf(this) || ActivatableItem.isActivated(before) != ActivatableItem.isActivated(after); } - @Override - public Multimap getAttributeModifiers(ItemStack stack, EquipmentSlot slot) { - ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - if (slot == EquipmentSlot.MAINHAND) { - if (ActivatableItem.isActivated(stack)) { - builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", this.attackDamage * 1.5, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); - builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", this.attackSpeed * 0.75, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); - } else { - builder.put(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(ATTACK_DAMAGE_MODIFIER_ID, "Weapon modifier", this.attackDamage, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); - builder.put(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(ATTACK_SPEED_MODIFIER_ID, "Weapon modifier", this.attackSpeed, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); - } + public void setActivated(ItemStack stack, boolean active) { + if (ActivatableItem.isActivated(stack) != active) { + float damage = baseAttackDamage * (active ? 1.5f : 1f); + float speed = baseAttackSpeed * (active ? 0.75f : 1f); + stack.apply(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT, comp -> { + var builder = AttributeModifiersComponent.builder(); + for (var entry : comp.modifiers()) { + if (entry.modifier().idMatches(BASE_ATTACK_DAMAGE_MODIFIER_ID)) + builder.add(EntityAttributes.GENERIC_ATTACK_DAMAGE, new EntityAttributeModifier(BASE_ATTACK_DAMAGE_MODIFIER_ID, damage, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); + if (entry.modifier().idMatches(BASE_ATTACK_SPEED_MODIFIER_ID)) + builder.add(EntityAttributes.GENERIC_ATTACK_SPEED, new EntityAttributeModifier(BASE_ATTACK_SPEED_MODIFIER_ID, speed, EntityAttributeModifier.Operation.ADD_VALUE), AttributeModifierSlot.MAINHAND); + else + builder.add(entry.attribute(), entry.modifier(), entry.slot()); + } + return builder.build(); + }); + ActivatableItem.setActivated(stack, active); } - return builder.build(); } @Override diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java index 8400badd51..f96f3943d9 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/FerociousBidentItem.java @@ -3,11 +3,13 @@ import de.dafuqs.spectrum.api.energy.*; import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.render.*; +import de.dafuqs.spectrum.helpers.*; import net.minecraft.enchantment.*; import net.minecraft.entity.*; import net.minecraft.entity.player.*; import net.minecraft.item.*; import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.registry.*; import net.minecraft.text.*; import net.minecraft.util.*; import net.minecraft.world.*; @@ -31,8 +33,8 @@ public List getUsedColors() { } @Override - public int getRiptideLevel(ItemStack stack) { - return Math.max(EnchantmentHelper.getRiptide(stack), BUILTIN_RIPTIDE_LEVEL); + public int getRiptideLevel(RegistryWrapper.WrapperLookup lookup, ItemStack stack) { + return Math.max(SpectrumEnchantmentHelper.getLevel(lookup, Enchantments.RIPTIDE, stack), BUILTIN_RIPTIDE_LEVEL); } @Override @@ -55,7 +57,7 @@ public void usageTick(World world, LivingEntity user, ItemStack stack, int remai } } - yeetPlayer(player, getRiptideLevel(stack) / 128F - 0.75F); + yeetPlayer(player, getRiptideLevel(world.getRegistryManager(), stack) / 128F - 0.75F); player.useRiptide(20); for (LivingEntity entityAround : world.getEntitiesByType(TypeFilter.instanceOf(LivingEntity.class), player.getBoundingBox().expand(2), LivingEntity::isAlive)) { diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java index 4d735c26b5..13f33b73b2 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/MalachiteBidentItem.java @@ -3,6 +3,7 @@ import com.google.common.collect.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.entity.entity.*; +import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.networking.s2c_payloads.*; import de.dafuqs.spectrum.particle.*; import de.dafuqs.spectrum.registries.*; @@ -78,7 +79,7 @@ public void onStoppedUsing(ItemStack stack, World world, LivingEntity user, int player.incrementStat(Stats.USED.getOrCreateStat(this)); if (canStartRiptide(player, stack)) { - riptide(world, player, getRiptideLevel(stack)); + riptide(world, player, getRiptideLevel(world.getRegistryManager(), stack)); } else if (!world.isClient) { stack.damage(1, player, LivingEntity.getSlotForHand(user.getActiveHand())); throwBident(stack, (ServerWorld) world, player); @@ -92,8 +93,8 @@ public boolean canRepair(ItemStack stack, ItemStack ingredient) { return SpectrumToolMaterials.Material.MALACHITE.getRepairIngredient().test(ingredient) || super.canRepair(stack, ingredient); } - public int getRiptideLevel(ItemStack stack) { - return EnchantmentHelper.getRiptide(stack); + public int getRiptideLevel(RegistryWrapper.WrapperLookup lookup, ItemStack stack) { + return SpectrumEnchantmentHelper.getLevel(lookup, Enchantments.RIPTIDE, stack); } protected void riptide(World world, PlayerEntity playerEntity, int riptideLevel) { @@ -190,7 +191,7 @@ public float getThrowSpeed(ItemStack stack) { } public boolean canStartRiptide(PlayerEntity player, ItemStack stack) { - return getRiptideLevel(stack) > 0 && player.isTouchingWaterOrRain(); + return getRiptideLevel(player.getWorld().getRegistryManager(), stack) > 0 && player.isTouchingWaterOrRain(); } public boolean isThrownAsMirrorImage(ItemStack stack, ServerWorld world, PlayerEntity player) { diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java index d90ef73fec..de4482753f 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java @@ -247,7 +247,7 @@ public int addExperience(int experience) { PlayerEntity player = (PlayerEntity) (Object) this; for (ItemStack stack : getHandItems()) { if (!player.isUsingItem() && stack.getItem() instanceof ExperienceStorageItem) { - experience = ExperienceStorageItem.addStoredExperience(stack, experience); + experience = ExperienceStorageItem.addStoredExperience(getWorld().getRegistryManager(), stack, experience); player.experiencePickUpDelay = 0; if (experience == 0) { break; diff --git a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java index ce61dd4bca..d92b1f4073 100644 --- a/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java +++ b/src/main/java/de/dafuqs/spectrum/networking/s2c_payloads/BlackHoleChestStatusUpdatePayload.java @@ -35,9 +35,9 @@ public static void sendBlackHoleChestUpdate(BlackHoleChestBlockEntity chest) { long storedXP = 0; long maxStoredXP = 0; - if (xpStack.getItem() instanceof ExperienceStorageItem experienceStorageItem) { + if (xpStack.getItem() instanceof ExperienceStorageItem experienceStorageItem && chest.getWorld() != null) { storedXP = ExperienceStorageItem.getStoredExperience(xpStack); - maxStoredXP = experienceStorageItem.getMaxStoredExperience(xpStack); + maxStoredXP = experienceStorageItem.getMaxStoredExperience(chest.getWorld().getRegistryManager(), xpStack); } for (ServerPlayerEntity player : PlayerLookup.tracking(chest)) { @@ -45,17 +45,20 @@ public static void sendBlackHoleChestUpdate(BlackHoleChestBlockEntity chest) { } } + @SuppressWarnings("resource") @Environment(EnvType.CLIENT) public static ClientPlayNetworking.@NotNull PlayPayloadHandler getPayloadHandler() { return (payload, context) -> { MinecraftClient client = context.client(); client.execute(() -> { - Optional entity = client.world.getBlockEntity(payload.pos, SpectrumBlockEntities.BLACK_HOLE_CHEST); - entity.ifPresent(chest -> { - chest.setFull(payload.isFull); - chest.setHasXPStorage(payload.canStoreExperience); - chest.setXPData(payload.storedExperience, payload.maxStoredExperience); - }); + if (client.world != null) { + Optional entity = client.world.getBlockEntity(payload.pos, SpectrumBlockEntities.BLACK_HOLE_CHEST); + entity.ifPresent(chest -> { + chest.setFull(payload.isFull); + chest.setHasXPStorage(payload.canStoreExperience); + chest.setXPData(payload.storedExperience, payload.maxStoredExperience); + }); + } }); }; } diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumDataComponentTypes.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumDataComponentTypes.java index ec24b4c36e..dd3ce4328d 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumDataComponentTypes.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumDataComponentTypes.java @@ -17,10 +17,13 @@ public class SpectrumDataComponentTypes { static { DeferredRegistrar.setClass(SpectrumDataComponentTypes.class); } + public static ComponentType ACTIVATED = register("activated", builder -> builder.codec(Codec.BOOL).packetCodec(PacketCodecs.BOOL)); public static ComponentType BOTTOMLESS_STACK = register("bottomless_stack", builder -> builder.codec(BottomlessBundleItem.BottomlessStack.CODEC).packetCodec(BottomlessBundleItem.BottomlessStack.PACKET_CODEC)); public static ComponentType BOUND_ITEM = register("bound_item", builder -> builder.codec(Identifier.CODEC).packetCodec(Identifier.PACKET_CODEC)); + public static ComponentType HIDE_USAGE_TOOLTIP = register("hide_usage_tooltip", builder -> builder.codec(Codec.BOOL).packetCodec(PacketCodecs.BOOL)); public static ComponentType INK_STORAGE = register("ink_storage", builder -> builder.codec(InkStorageComponent.CODEC).packetCodec(InkStorageComponent.PACKET_CODEC)); public static ComponentType SOCKETED = register("socketed", builder -> builder.codec(Codec.BOOL).packetCodec(PacketCodecs.BOOL)); + public static ComponentType STORED_EXPERIENCE = register("stored_experiene", builder -> builder.codec(Codec.INT).packetCodec(PacketCodecs.VAR_INT)); public static ComponentType PIPE_BOMB = register("pipe_bomb", builder -> builder.codec(PipeBombComponent.CODEC).packetCodec(PipeBombComponent.PACKET_CODEC)); public static ComponentType WRAPPED_PRESENT = register("wrapped_present", builder -> builder.codec(WrappedPresentComponent.CODEC).packetCodec(WrappedPresentComponent.PACKET_CODEC)); public static ComponentType SHOOTING_STAR = register("shooting_star", builder -> builder.codec(ShootingStarComponent.CODEC).packetCodec(ShootingStarComponent.PACKET_CODEC)); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java index 209aa5d7eb..8bdeb60107 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemGroups.java @@ -1,7 +1,6 @@ package de.dafuqs.spectrum.registries; import de.dafuqs.fractal.api.*; -import de.dafuqs.fractal.interfaces.*; import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.energy.color.*; import de.dafuqs.spectrum.api.item.*; @@ -30,8 +29,7 @@ public class SpectrumItemGroups { .icon(() -> new ItemStack(SpectrumBlocks.PEDESTAL_ALL_BASIC)) .entries((displayContext, entries) -> { entries.add(SpectrumBlocks.PEDESTAL_ALL_BASIC, ItemGroup.StackVisibility.PARENT_TAB_ONLY); - ItemGroupParent parent = (ItemGroupParent) SpectrumItemGroups.MAIN; - for (ItemSubGroup subGroup : parent.fractal$getChildren()) { + for (ItemSubGroup subGroup : SpectrumItemGroups.MAIN.fractal$getChildren()) { entries.addAll(subGroup.getSearchTabStacks(), ItemGroup.StackVisibility.SEARCH_TAB_ONLY); } }) @@ -155,11 +153,11 @@ public static void register() { entries.add(SpectrumEnchantmentHelper.getMaxEnchantedStack(SpectrumItems.KNOWLEDGE_GEM)); ItemStack knowledgeGemStack = SpectrumItems.KNOWLEDGE_GEM.getDefaultStack(); - ExperienceStorageItem.addStoredExperience(knowledgeGemStack, SpectrumItems.KNOWLEDGE_GEM.getMaxStoredExperience(knowledgeGemStack)); + ExperienceStorageItem.addStoredExperience(displayContext.lookup(), knowledgeGemStack, SpectrumItems.KNOWLEDGE_GEM.getMaxStoredExperience(displayContext.lookup(), knowledgeGemStack)); entries.add(knowledgeGemStack); ItemStack enchantedKnowledgeGemStack = SpectrumEnchantmentHelper.getMaxEnchantedStack(SpectrumItems.KNOWLEDGE_GEM); - ExperienceStorageItem.addStoredExperience(enchantedKnowledgeGemStack, SpectrumItems.KNOWLEDGE_GEM.getMaxStoredExperience(enchantedKnowledgeGemStack)); + ExperienceStorageItem.addStoredExperience(displayContext.lookup(), enchantedKnowledgeGemStack, SpectrumItems.KNOWLEDGE_GEM.getMaxStoredExperience(displayContext.lookup(), enchantedKnowledgeGemStack)); entries.add(enchantedKnowledgeGemStack); entries.add(SpectrumItems.CELESTIAL_POCKETWATCH); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemProjectileBehaviors.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemProjectileBehaviors.java index 95c50516a0..5d338ad88c 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemProjectileBehaviors.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemProjectileBehaviors.java @@ -231,9 +231,9 @@ public ItemStack onEntityHit(ItemProjectileEntity projectile, ItemStack stack, @ int playerExperience = target.totalExperience; if (playerExperience > 0) { KnowledgeGemItem item = (KnowledgeGemItem) stack.getItem(); - long transferableExperiencePerTick = item.getTransferableExperiencePerTick(stack); + long transferableExperiencePerTick = item.getTransferableExperiencePerTick(target.getWorld().getRegistryManager(), stack); int xpToTransfer = (int) Math.min(target.totalExperience, transferableExperiencePerTick * 100); - int experienceOverflow = ExperienceStorageItem.addStoredExperience(stack, xpToTransfer); + int experienceOverflow = ExperienceStorageItem.addStoredExperience(target.getWorld().getRegistryManager(), stack, xpToTransfer); target.addExperience(-xpToTransfer + experienceOverflow); target.playSound(SoundEvents.ENTITY_EXPERIENCE_ORB_PICKUP, 0.3F, 0.8F + target.getWorld().getRandom().nextFloat() * 0.4F); diff --git a/src/main/java/de/dafuqs/spectrum/registries/client/SpectrumModelPredicateProviders.java b/src/main/java/de/dafuqs/spectrum/registries/client/SpectrumModelPredicateProviders.java index 4dacd7a81e..eba5585356 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/client/SpectrumModelPredicateProviders.java +++ b/src/main/java/de/dafuqs/spectrum/registries/client/SpectrumModelPredicateProviders.java @@ -203,7 +203,7 @@ private static void registerMoonPhasePredicates(Item item) { } private static void registerActivatableItemPredicate(Item item) { - ModelPredicateProviderRegistry.register(item, Identifier.of(ActivatableItem.NBT_STRING), (stack, world, entity, i) -> { + ModelPredicateProviderRegistry.register(item, Identifier.of("activated"), (stack, world, entity, i) -> { if (ActivatableItem.isActivated(stack)) { return 1.0F; } else {