IT COMPILES!!

This commit is contained in:
Ell 2024-09-26 14:38:19 +02:00
parent e50d3fc69a
commit 32baa1194b
23 changed files with 312 additions and 248 deletions

View file

@ -125,6 +125,7 @@ tasks.withType(ProcessResources).configureEach {
loader_version_range: loader_version_range, loader_version_range: loader_version_range,
mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, mod_id : mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version,
mod_authors : mod_authors, mod_description: mod_description, mod_authors : mod_authors, mod_description: mod_description,
patchouli_version : patchouli_version
] ]
inputs.properties replaceProperties inputs.properties replaceProperties

View file

@ -1,6 +1,8 @@
package de.ellpeck.naturesaura; package de.ellpeck.naturesaura;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge; import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge;
import de.ellpeck.naturesaura.api.misc.ILevelData; import de.ellpeck.naturesaura.api.misc.ILevelData;
@ -13,6 +15,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.IntArrayTag; import net.minecraft.nbt.IntArrayTag;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
@ -356,14 +359,13 @@ public final class Helper {
} }
public static boolean isToolEnabled(ItemStack stack) { public static boolean isToolEnabled(ItemStack stack) {
return stack.hasTag() && !stack.getTag().getBoolean(NaturesAura.MOD_ID + ":disabled"); return stack.has(DisableableToolData.TYPE) && !stack.get(DisableableToolData.TYPE).disabled;
} }
public static boolean toggleToolEnabled(Player player, ItemStack stack) { public static boolean toggleToolEnabled(Player player, ItemStack stack) {
if (!player.isShiftKeyDown()) if (!player.isShiftKeyDown())
return false; return false;
var disabled = !Helper.isToolEnabled(stack); stack.set(DisableableToolData.TYPE, new DisableableToolData(Helper.isToolEnabled(stack)));
stack.getOrCreateTag().putBoolean(NaturesAura.MOD_ID + ":disabled", !disabled);
player.level().playSound(null, player.getX() + 0.5, player.getY() + 0.5, player.getZ() + 0.5, SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.65F, 1F); player.level().playSound(null, player.getX() + 0.5, player.getY() + 0.5, player.getZ() + 0.5, SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.65F, 1F);
return true; return true;
} }
@ -377,4 +379,13 @@ public final class Helper {
return null; return null;
} }
public record DisableableToolData(boolean disabled) {
public static final Codec<DisableableToolData> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.BOOL.fieldOf("disabled").forGetter(d -> d.disabled)
).apply(i, DisableableToolData::new));
public static final DataComponentType<DisableableToolData> TYPE = DataComponentType.<DisableableToolData>builder().persistent(DisableableToolData.CODEC).cacheEncoding().build();
}
} }

View file

@ -1,7 +1,9 @@
package de.ellpeck.naturesaura.api.aura.container; package de.ellpeck.naturesaura.api.aura.container;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import net.minecraft.nbt.CompoundTag; import net.minecraft.core.component.DataComponentType;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
public class ItemAuraContainer implements IAuraContainer { public class ItemAuraContainer implements IAuraContainer {
@ -37,16 +39,13 @@ public class ItemAuraContainer implements IAuraContainer {
} }
private void setAura(int amount) { private void setAura(int amount) {
if (!this.stack.hasTag()) { this.stack.set(Data.TYPE, new Data(amount));
this.stack.setTag(new CompoundTag());
}
this.stack.getTag().putInt("aura", amount);
} }
@Override @Override
public int getStoredAura() { public int getStoredAura() {
if (this.stack.hasTag()) { if (this.stack.has(Data.TYPE)) {
return this.stack.getTag().getInt("aura"); return this.stack.get(Data.TYPE).auraAmount;
} else { } else {
return 0; return 0;
} }
@ -66,4 +65,14 @@ public class ItemAuraContainer implements IAuraContainer {
public boolean isAcceptableType(IAuraType type) { public boolean isAcceptableType(IAuraType type) {
return this.type == null || this.type == type; return this.type == null || this.type == type;
} }
public record Data(int auraAmount) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.INT.fieldOf("aura_amount").forGetter(d -> d.auraAmount)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -1,5 +1,7 @@
package de.ellpeck.naturesaura.blocks; package de.ellpeck.naturesaura.blocks;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.misc.ILevelData; import de.ellpeck.naturesaura.api.misc.ILevelData;
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate;
@ -13,29 +15,26 @@ import net.minecraft.ChatFormatting;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.language.I18n;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.AnvilUpdateEvent; import net.neoforged.neoforge.event.AnvilUpdateEvent;
import net.neoforged.bus.api.SubscribeEvent;
import javax.annotation.Nullable;
import java.util.List; import java.util.List;
public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider<BlockEntityEnderCrate>, ICustomBlockState { public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider<BlockEntityEnderCrate>, ICustomBlockState {
@ -47,9 +46,9 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
} }
public static String getEnderName(ItemStack stack) { public static String getEnderName(ItemStack stack) {
if (!stack.hasTag()) if (!stack.has(Data.TYPE))
return ""; return "";
return stack.getTag().getString(NaturesAura.MOD_ID + ":ender_name"); return stack.get(Data.TYPE).enderName;
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ -79,7 +78,7 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
if (ILevelData.getOverworldData(player.level()).isEnderStorageLocked(name)) if (ILevelData.getOverworldData(player.level()).isEnderStorageLocked(name))
return; return;
var output = stack.copy(); var output = stack.copy();
output.getOrCreateTag().putString(NaturesAura.MOD_ID + ":ender_name", name); output.set(Data.TYPE, new Data(name));
event.setOutput(output); event.setOutput(output);
event.setMaterialCost(stack.getCount()); event.setMaterialCost(stack.getCount());
event.setCost(1); event.setCost(1);
@ -131,4 +130,13 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
BlockEntityRenderers.register(ModBlockEntities.ENDER_CRATE, RenderEnderCrate::new); BlockEntityRenderers.register(ModBlockEntities.ENDER_CRATE, RenderEnderCrate::new);
} }
public record Data(String enderName) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.STRING.fieldOf("name").forGetter(d -> d.enderName)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -93,11 +93,8 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements MenuProvid
@Override @Override
public void modifyDrop(ItemStack regularItem) { public void modifyDrop(ItemStack regularItem) {
if (this.name != null) { if (this.name != null)
if (!regularItem.hasTag()) regularItem.set(BlockEnderCrate.Data.TYPE, new BlockEnderCrate.Data(this.name));
regularItem.setTag(new CompoundTag());
regularItem.getTag().putString(NaturesAura.MOD_ID + ":ender_name", this.name);
}
} }
@Override @Override

View file

@ -4,7 +4,7 @@ import com.google.common.primitives.Ints;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag; import net.minecraft.core.component.DataComponents;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
@ -57,35 +57,33 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
} }
if (this.trackedEntity != null && !this.trackedEntity.isAlive()) { if (this.trackedEntity != null && !this.trackedEntity.isAlive()) {
if (this.trackedItem.hasTag()) { if (this.trackedItem.has(DataComponents.FIREWORKS)) {
float generateFactor = 0; float generateFactor = 0;
Set<Integer> usedColors = new HashSet<>(); Set<Integer> usedColors = new HashSet<>();
var compound = this.trackedItem.getTag(); var fireworks = this.trackedItem.get(DataComponents.FIREWORKS);
var fireworks = compound.getCompound("Fireworks");
var flightTime = fireworks.getInt("Flight"); var flightTime = fireworks.flightDuration();
var explosions = fireworks.getList("Explosions", 10); var explosions = fireworks.explosions();
if (!explosions.isEmpty()) { if (!explosions.isEmpty()) {
generateFactor += flightTime; generateFactor += flightTime;
for (var base : explosions) { for (var explosion : explosions) {
var explosion = (CompoundTag) base;
generateFactor += 1.5F; generateFactor += 1.5F;
var flicker = explosion.getBoolean("Flicker"); var flicker = explosion.hasTwinkle();
if (flicker) if (flicker)
generateFactor += 1; generateFactor += 1;
var trail = explosion.getBoolean("Trail"); var trail = explosion.hasTrail();
if (trail) if (trail)
generateFactor += 8; generateFactor += 8;
var type = explosion.getByte("Type"); var type = explosion.shape();
generateFactor += new float[]{0, 1, 0.5F, 20, 0.5F}[type]; generateFactor += new float[]{0, 1, 0.5F, 20, 0.5F}[type.getId()];
Set<Integer> colors = new HashSet<>(); Set<Integer> colors = new HashSet<>();
for (var color : explosion.getIntArray("Colors")) { for (var color : explosion.colors()) {
usedColors.add(color); usedColors.add(color);
colors.add(color); colors.add(color);
} }
@ -132,4 +130,5 @@ public class BlockEntityFireworkGenerator extends BlockEntityImpl implements ITi
public boolean wantsLimitRemover() { public boolean wantsLimitRemover() {
return true; return true;
} }
} }

View file

@ -1,10 +1,13 @@
package de.ellpeck.naturesaura.blocks.tiles; package de.ellpeck.naturesaura.blocks.tiles;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.blocks.ModBlocks; import de.ellpeck.naturesaura.blocks.ModBlocks;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.Connection; import net.minecraft.network.Connection;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
@ -103,16 +106,13 @@ public class BlockEntityImpl extends BlockEntity {
public void modifyDrop(ItemStack regularItem) { public void modifyDrop(ItemStack regularItem) {
var compound = new CompoundTag(); var compound = new CompoundTag();
this.writeNBT(compound, SaveType.BLOCK, this.getLevel().registryAccess()); this.writeNBT(compound, SaveType.BLOCK, this.getLevel().registryAccess());
if (!compound.isEmpty()) { if (!compound.isEmpty())
if (!regularItem.hasTag()) regularItem.set(DroppedItemData.TYPE, new DroppedItemData(compound));
regularItem.setTag(new CompoundTag());
regularItem.getTag().put("data", compound);
}
} }
public void loadDataOnPlace(ItemStack stack) { public void loadDataOnPlace(ItemStack stack) {
if (stack.hasTag()) { if (stack.has(DroppedItemData.TYPE)) {
var compound = stack.getTag().getCompound("data"); var compound = stack.get(DroppedItemData.TYPE).data;
if (compound != null) if (compound != null)
this.readNBT(compound, SaveType.BLOCK, this.level.registryAccess()); this.readNBT(compound, SaveType.BLOCK, this.level.registryAccess());
} }
@ -161,4 +161,13 @@ public class BlockEntityImpl extends BlockEntity {
TILE, SYNC, BLOCK TILE, SYNC, BLOCK
} }
public record DroppedItemData(CompoundTag data) {
public static final Codec<DroppedItemData> CODEC = RecordCodecBuilder.create(i -> i.group(
CompoundTag.CODEC.fieldOf("data").forGetter(d -> d.data)
).apply(i, DroppedItemData::new));
public static final DataComponentType<DroppedItemData> TYPE = DataComponentType.<DroppedItemData>builder().persistent(DroppedItemData.CODEC).cacheEncoding().build();
}
} }

View file

@ -13,6 +13,7 @@ import de.ellpeck.naturesaura.misc.LevelData;
import de.ellpeck.naturesaura.packet.PacketAuraChunk; import de.ellpeck.naturesaura.packet.PacketAuraChunk;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -176,7 +177,7 @@ public class AuraChunk implements IAuraChunk {
public PacketAuraChunk makePacket() { public PacketAuraChunk makePacket() {
var pos = this.chunk.getPos(); var pos = this.chunk.getPos();
return new PacketAuraChunk(pos.x, pos.z, this.drainSpots.values()); return new PacketAuraChunk(pos.x, pos.z, this.drainSpots.values().stream().map(DrainSpot::serializeNBT).toList());
} }
public void getSpots(BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) { public void getSpots(BlockPos pos, int radius, BiConsumer<BlockPos, Integer> consumer) {
@ -249,7 +250,7 @@ public class AuraChunk implements IAuraChunk {
} }
@Override @Override
public CompoundTag serializeNBT() { public CompoundTag serializeNBT(HolderLookup.Provider registries) {
var list = new ListTag(); var list = new ListTag();
for (var spot : this.drainSpots.values()) for (var spot : this.drainSpots.values())
list.add(spot.serializeNBT()); list.add(spot.serializeNBT());
@ -259,7 +260,7 @@ public class AuraChunk implements IAuraChunk {
} }
@Override @Override
public void deserializeNBT(CompoundTag compound) { public void deserializeNBT(HolderLookup.Provider registries, CompoundTag compound) {
this.drainSpots.clear(); this.drainSpots.clear();
var list = compound.getList("drain_spots", 10); var list = compound.getList("drain_spots", 10);
for (var base : list) for (var base : list)

View file

@ -1,30 +0,0 @@
package de.ellpeck.naturesaura.enchant;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.Enchantments;
public class AuraMendingEnchantment extends ModEnchantment {
public AuraMendingEnchantment() {
super("aura_mending", Rarity.RARE, EnchantmentCategory.BREAKABLE, EquipmentSlot.values());
}
@Override
protected boolean checkCompatibility(Enchantment ench) {
return super.checkCompatibility(ench) && ench != Enchantments.MENDING;
}
@Override
public boolean canEnchant(ItemStack stack) {
return super.canEnchant(stack) && stack.getCapability(NaturesAuraAPI.AURA_RECHARGE_CAPABILITY) == null;
}
@Override
public boolean canApplyAtEnchantingTable(ItemStack stack) {
return super.canApplyAtEnchantingTable(stack) && stack.getCapability(NaturesAuraAPI.AURA_RECHARGE_CAPABILITY) == null;
}
}

View file

@ -1,23 +0,0 @@
package de.ellpeck.naturesaura.enchant;
import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentCategory;
public class ModEnchantment extends Enchantment implements IModItem {
private final String name;
protected ModEnchantment(String name, Rarity rarityIn, EnchantmentCategory typeIn, EquipmentSlot[] slots) {
super(rarityIn, typeIn, slots);
this.name = name;
ModRegistry.ALL_ITEMS.add(this);
}
@Override
public String getBaseName() {
return this.name;
}
}

View file

@ -1,10 +1,21 @@
package de.ellpeck.naturesaura.enchant; package de.ellpeck.naturesaura.enchant;
import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import net.minecraft.core.HolderSet;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EquipmentSlotGroup;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantment;
@SuppressWarnings("NonConstantFieldWithUpperCaseName")
public final class ModEnchantments { public final class ModEnchantments {
public static Enchantment AURA_MENDING; public static final Enchantment AURA_MENDING = Enchantment.enchantment(
Enchantment.definition(
HolderSet.direct(BuiltInRegistries.ITEM.holders().filter(i -> new ItemStack(i).getCapability(NaturesAuraAPI.AURA_RECHARGE_CAPABILITY) == null).toList()),
// same values as unbreaking, except for the max level
5, 1, Enchantment.dynamicCost(5, 8), Enchantment.dynamicCost(55, 8), 2, EquipmentSlotGroup.ANY)
).build(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_mending"));
} }

View file

@ -1,5 +1,7 @@
package de.ellpeck.naturesaura.items; package de.ellpeck.naturesaura.items;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.aura.type.IAuraType;
@ -9,6 +11,7 @@ import de.ellpeck.naturesaura.reg.ICustomCreativeTab;
import de.ellpeck.naturesaura.reg.ICustomItemModel; import de.ellpeck.naturesaura.reg.ICustomItemModel;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -23,9 +26,9 @@ import net.minecraft.world.level.block.DispenserBlock;
import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import net.neoforged.bus.api.SubscribeEvent;
import java.util.List; import java.util.List;
@ -77,16 +80,16 @@ public class ItemAuraBottle extends ItemImpl implements IColorProvidingItem, ICu
} }
public static IAuraType getType(ItemStack stack) { public static IAuraType getType(ItemStack stack) {
if (!stack.hasTag()) if (!stack.has(Data.TYPE))
return NaturesAuraAPI.TYPE_OTHER; return NaturesAuraAPI.TYPE_OTHER;
var type = stack.getTag().getString("stored_type"); var type = stack.get(Data.TYPE).auraType;
if (type.isEmpty()) if (type.isEmpty())
return NaturesAuraAPI.TYPE_OTHER; return NaturesAuraAPI.TYPE_OTHER;
return NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation(type)); return NaturesAuraAPI.AURA_TYPES.get(ResourceLocation.parse(type));
} }
public static ItemStack setType(ItemStack stack, IAuraType type) { public static ItemStack setType(ItemStack stack, IAuraType type) {
stack.getOrCreateTag().putString("stored_type", type.getName().toString()); stack.set(Data.TYPE, new Data(type.getName().toString()));
return stack; return stack;
} }
@ -131,4 +134,14 @@ public class ItemAuraBottle extends ItemImpl implements IColorProvidingItem, ICu
} }
} }
public record Data(String auraType) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.STRING.fieldOf("aura_type").forGetter(d -> d.auraType)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -1,7 +1,10 @@
package de.ellpeck.naturesaura.items; package de.ellpeck.naturesaura.items;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Style;
@ -32,7 +35,7 @@ public class ItemBreakPrevention extends ItemImpl {
if (second.getItem() != ModItems.BREAK_PREVENTION) if (second.getItem() != ModItems.BREAK_PREVENTION)
return; return;
var output = stack.copy(); var output = stack.copy();
output.getOrCreateTag().putBoolean(NaturesAura.MOD_ID + ":break_prevention", true); output.set(Data.TYPE, new Data(true));
event.setOutput(output); event.setOutput(output);
event.setMaterialCost(1); event.setMaterialCost(1);
event.setCost(1); event.setCost(1);
@ -44,7 +47,7 @@ public class ItemBreakPrevention extends ItemImpl {
if (player == null) if (player == null)
return; return;
var stack = player.getMainHandItem(); var stack = player.getMainHandItem();
if (!stack.hasTag() || !stack.getTag().getBoolean(NaturesAura.MOD_ID + ":break_prevention")) if (!stack.has(Data.TYPE) || !stack.get(Data.TYPE).enabled)
return; return;
if (ElytraItem.isFlyEnabled(stack)) if (ElytraItem.isFlyEnabled(stack))
return; return;
@ -55,17 +58,28 @@ public class ItemBreakPrevention extends ItemImpl {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void onTooltip(ItemTooltipEvent event) { public void onTooltip(ItemTooltipEvent event) {
var stack = event.getItemStack(); var stack = event.getItemStack();
if (!stack.hasTag() || !stack.getTag().getBoolean(NaturesAura.MOD_ID + ":break_prevention")) if (!stack.has(Data.TYPE) || !stack.get(Data.TYPE).enabled)
return; return;
var tooltip = event.getToolTip(); var tooltip = event.getToolTip();
tooltip.add(Component.translatable("info." + NaturesAura.MOD_ID + ".break_prevention").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GRAY))); tooltip.add(Component.translatable("info." + NaturesAura.MOD_ID + ".break_prevention").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GRAY)));
if (ElytraItem.isFlyEnabled(stack)) if (ElytraItem.isFlyEnabled(stack))
return; return;
if (tooltip.size() < 1) if (tooltip.isEmpty())
return; return;
var head = tooltip.get(0); var head = tooltip.getFirst();
if (head instanceof MutableComponent) if (head instanceof MutableComponent)
((MutableComponent) head).append(Component.translatable("info." + NaturesAura.MOD_ID + ".broken").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GRAY))); ((MutableComponent) head).append(Component.translatable("info." + NaturesAura.MOD_ID + ".broken").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GRAY)));
} }
} }
public record Data(boolean enabled) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.BOOL.fieldOf("enabled").forGetter(d -> d.enabled)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -1,5 +1,7 @@
package de.ellpeck.naturesaura.items; package de.ellpeck.naturesaura.items;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.data.ItemModelGenerator; import de.ellpeck.naturesaura.data.ItemModelGenerator;
import de.ellpeck.naturesaura.misc.ColoredBlockHelper; import de.ellpeck.naturesaura.misc.ColoredBlockHelper;
@ -8,6 +10,7 @@ import de.ellpeck.naturesaura.reg.ICustomItemModel;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
@ -68,28 +71,21 @@ public class ItemColorChanger extends ItemImpl implements IColorProvidingItem, I
} }
public static DyeColor getStoredColor(ItemStack stack) { public static DyeColor getStoredColor(ItemStack stack) {
if (!stack.hasTag()) { return stack.has(Data.TYPE) ? DyeColor.byId(stack.get(Data.TYPE).color) : null;
return null;
} else {
var color = stack.getTag().getInt("color");
return DyeColor.byId(color);
}
} }
private static void storeColor(ItemStack stack, DyeColor color) { private static void storeColor(ItemStack stack, DyeColor color) {
stack.getOrCreateTag().putInt("color", color.getId()); var previous = stack.getOrDefault(Data.TYPE, new Data(0, false));
stack.set(Data.TYPE, new Data(color.getId(), previous.fill));
} }
public static boolean isFillMode(ItemStack stack) { public static boolean isFillMode(ItemStack stack) {
if (!stack.hasTag()) { return stack.has(Data.TYPE) && stack.get(Data.TYPE).fill;
return false;
} else {
return stack.getTag().getBoolean("fill");
}
} }
private static void setFillMode(ItemStack stack, boolean fill) { private static void setFillMode(ItemStack stack, boolean fill) {
stack.getOrCreateTag().putBoolean("fill", fill); var previous = stack.getOrDefault(Data.TYPE, new Data(0, false));
stack.set(Data.TYPE, new Data(previous.color, fill));
} }
@Override @Override
@ -134,4 +130,15 @@ public class ItemColorChanger extends ItemImpl implements IColorProvidingItem, I
public void generateCustomItemModel(ItemModelGenerator generator) { public void generateCustomItemModel(ItemModelGenerator generator) {
// noop // noop
} }
public record Data(int color, boolean fill) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.INT.fieldOf("color").forGetter(d -> d.color),
Codec.BOOL.fieldOf("fill").forGetter(d -> d.fill)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -1,10 +1,13 @@
package de.ellpeck.naturesaura.items; package de.ellpeck.naturesaura.items;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.entities.EntityEffectInhibitor; import de.ellpeck.naturesaura.entities.EntityEffectInhibitor;
import de.ellpeck.naturesaura.reg.IColorProvidingItem; import de.ellpeck.naturesaura.reg.IColorProvidingItem;
import de.ellpeck.naturesaura.reg.ICustomCreativeTab; import de.ellpeck.naturesaura.reg.ICustomCreativeTab;
import net.minecraft.client.color.item.ItemColor; import net.minecraft.client.color.item.ItemColor;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
@ -22,16 +25,16 @@ public class ItemEffectPowder extends ItemImpl implements IColorProvidingItem, I
} }
public static ResourceLocation getEffect(ItemStack stack) { public static ResourceLocation getEffect(ItemStack stack) {
if (!stack.hasTag()) if (!stack.has(Data.TYPE))
return null; return null;
var effect = stack.getTag().getString("effect"); var effect = stack.get(Data.TYPE).effect;
if (effect.isEmpty()) if (effect.isEmpty())
return null; return null;
return new ResourceLocation(effect); return ResourceLocation.parse(effect);
} }
public static ItemStack setEffect(ItemStack stack, ResourceLocation effect) { public static ItemStack setEffect(ItemStack stack, ResourceLocation effect) {
stack.getOrCreateTag().putString("effect", effect != null ? effect.toString() : ""); stack.set(Data.TYPE, new Data(effect != null ? effect.toString() : ""));
return stack; return stack;
} }
@ -63,4 +66,13 @@ public class ItemEffectPowder extends ItemImpl implements IColorProvidingItem, I
return (stack, tintIndex) -> NaturesAuraAPI.EFFECT_POWDERS.getOrDefault(ItemEffectPowder.getEffect(stack), 0xFFFFFF); return (stack, tintIndex) -> NaturesAuraAPI.EFFECT_POWDERS.getOrDefault(ItemEffectPowder.getEffect(stack), 0xFFFFFF);
} }
public record Data(String effect) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.STRING.fieldOf("effect").forGetter(d -> d.effect)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -19,8 +19,6 @@ import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.IItemHandler;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -60,9 +58,8 @@ public class ItemEnderAccess extends ItemImpl {
} }
@Override @Override
@OnlyIn(Dist.CLIENT) public void appendHoverText(ItemStack stack, TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
public void appendHoverText(ItemStack stack, @Nullable Level levelIn, List<Component> tooltip, TooltipFlag flagIn) { BlockEnderCrate.addEnderNameInfo(stack, tooltipComponents);
BlockEnderCrate.addEnderNameInfo(stack, tooltip);
} }
} }

View file

@ -1,7 +1,10 @@
package de.ellpeck.naturesaura.items; package de.ellpeck.naturesaura.items;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.multiblock.IMultiblock; import de.ellpeck.naturesaura.api.multiblock.IMultiblock;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
@ -20,7 +23,7 @@ public class ItemMultiblockMaker extends ItemImpl {
private static List<IMultiblock> multiblocks; private static List<IMultiblock> multiblocks;
public ItemMultiblockMaker() { public ItemMultiblockMaker() {
super("multiblock_maker"); super("multiblock_maker", new Properties().component(Data.TYPE, new Data(0)));
} }
@Override @Override
@ -29,7 +32,7 @@ public class ItemMultiblockMaker extends ItemImpl {
if (!levelIn.isClientSide && playerIn.isCreative()) { if (!levelIn.isClientSide && playerIn.isCreative()) {
var curr = ItemMultiblockMaker.getMultiblockId(stack); var curr = ItemMultiblockMaker.getMultiblockId(stack);
var next = (curr + 1) % ItemMultiblockMaker.multiblocks().size(); var next = (curr + 1) % ItemMultiblockMaker.multiblocks().size();
stack.getOrCreateTag().putInt("multiblock", next); stack.set(Data.TYPE, new Data(next));
} }
return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack);
} }
@ -72,9 +75,7 @@ public class ItemMultiblockMaker extends ItemImpl {
} }
private static int getMultiblockId(ItemStack stack) { private static int getMultiblockId(ItemStack stack) {
if (!stack.hasTag()) return stack.get(Data.TYPE).multiblockId();
return -1;
return stack.getTag().getInt("multiblock");
} }
private static IMultiblock getMultiblock(ItemStack stack) { private static IMultiblock getMultiblock(ItemStack stack) {
@ -86,4 +87,14 @@ public class ItemMultiblockMaker extends ItemImpl {
return null; return null;
return multiblocks.get(id); return multiblocks.get(id);
} }
public record Data(int multiblockId) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.INT.fieldOf("multiblock_id").forGetter(d -> d.multiblockId)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -5,23 +5,30 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.TamableAnimal;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.RespawnAnchorBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.living.LivingDeathEvent;
import net.neoforged.neoforge.event.entity.living.LivingEvent;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.living.LivingDeathEvent;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import net.neoforged.neoforge.event.tick.EntityTickEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent;
import java.util.Optional;
public class ItemPetReviver extends ItemImpl { public class ItemPetReviver extends ItemImpl {
public ItemPetReviver() { public ItemPetReviver() {
@ -88,10 +95,10 @@ public class ItemPetReviver extends ItemImpl {
if (pos != null) { if (pos != null) {
var f = player.getRespawnAngle(); var f = player.getRespawnAngle();
var b = player.isRespawnForced(); var b = player.isRespawnForced();
var bed = Player.findRespawnPositionAndUseSpawnBlock((ServerLevel) player.level(), pos, f, b, false); var bed = ItemPetReviver.findRespawnAndUseSpawnBlock((ServerLevel) player.level(), pos, f, b, false);
if (bed.isPresent()) { if (bed.isPresent()) {
spawnLevel = (ServerLevel) player.level(); spawnLevel = (ServerLevel) player.level();
spawn = bed.get(); spawn = bed.get().position();
} }
} }
} }
@ -133,4 +140,38 @@ public class ItemPetReviver extends ItemImpl {
} }
// copy of private ServerPlayer.findRespawnAndUseSpawnBlock
private static Optional<ServerPlayer.RespawnPosAngle> findRespawnAndUseSpawnBlock(ServerLevel level, BlockPos pos, float angle, boolean forced, boolean keepInventory) {
BlockState blockstate = level.getBlockState(pos);
Block block = blockstate.getBlock();
if (block instanceof RespawnAnchorBlock
&& (forced || blockstate.getValue(RespawnAnchorBlock.CHARGE) > 0)
&& RespawnAnchorBlock.canSetSpawn(level)) {
Optional<Vec3> optional = RespawnAnchorBlock.findStandUpPosition(EntityType.PLAYER, level, pos);
if (!forced && !keepInventory && optional.isPresent()) {
level.setBlock(
pos, blockstate.setValue(RespawnAnchorBlock.CHARGE, Integer.valueOf(blockstate.getValue(RespawnAnchorBlock.CHARGE) - 1)), 3
);
}
return optional.map(p_348139_ -> ServerPlayer.RespawnPosAngle.of(p_348139_, pos));
} else if (block instanceof BedBlock && BedBlock.canSetSpawn(level)) {
return BedBlock.findStandUpPosition(EntityType.PLAYER, level, pos, blockstate.getValue(BedBlock.FACING), angle)
.map(p_348148_ -> ServerPlayer.RespawnPosAngle.of(p_348148_, pos));
} else if (!forced) {
return blockstate.getRespawnPosition(EntityType.PLAYER, level, pos, angle);
} else {
boolean flag = block.isPossibleToRespawnInThis(blockstate);
BlockState blockstate1 = level.getBlockState(pos.above());
boolean flag1 = blockstate1.getBlock().isPossibleToRespawnInThis(blockstate1);
return flag && flag1
? Optional.of(
new ServerPlayer.RespawnPosAngle(
new Vec3((double) pos.getX() + 0.5, (double) pos.getY() + 0.1, (double) pos.getZ() + 0.5), angle
)
)
: Optional.empty();
}
}
} }

View file

@ -2,6 +2,8 @@ package de.ellpeck.naturesaura.items;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Axis; import com.mojang.math.Axis;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.render.ITrinketItem; import de.ellpeck.naturesaura.api.render.ITrinketItem;
import de.ellpeck.naturesaura.items.tools.ItemArmor; import de.ellpeck.naturesaura.items.tools.ItemArmor;
@ -11,6 +13,7 @@ import de.ellpeck.naturesaura.reg.ModArmorMaterial;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
@ -37,31 +40,25 @@ public class ItemShockwaveCreator extends ItemImpl implements ITrinketItem {
if (levelIn.isClientSide || !(entityIn instanceof LivingEntity living)) if (levelIn.isClientSide || !(entityIn instanceof LivingEntity living))
return; return;
if (!living.onGround()) { if (!living.onGround()) {
var compound = stack.getOrCreateTag(); if (stack.has(Data.TYPE) && stack.get(Data.TYPE).air)
if (compound.getBoolean("air"))
return; return;
stack.set(Data.TYPE, new Data(true, living.getX(), living.getY(), living.getZ()));
compound.putBoolean("air", true);
compound.putDouble("x", living.getX());
compound.putDouble("y", living.getY());
compound.putDouble("z", living.getZ());
} else { } else {
if (!stack.hasTag()) if (!stack.has(Data.TYPE))
return; return;
var compound = stack.getTag(); var data = stack.get(Data.TYPE);
if (!compound.getBoolean("air")) if (!data.air)
return; return;
stack.remove(Data.TYPE);
compound.putBoolean("air", false);
if (!living.isShiftKeyDown()) if (!living.isShiftKeyDown())
return; return;
if (living.distanceToSqr(compound.getDouble("x"), compound.getDouble("y"), compound.getDouble("z")) > 0.75F) if (living.distanceToSqr(data.x, data.y, data.z) > 0.75F)
return; return;
if (living instanceof Player && !NaturesAuraAPI.instance().extractAuraFromPlayer((Player) living, 1000, false)) if (living instanceof Player && !NaturesAuraAPI.instance().extractAuraFromPlayer((Player) living, 1000, false))
return; return;
var infusedSet = ItemArmor.isFullSetEquipped(living, ModArmorMaterial.INFUSED); var infusedSet = ItemArmor.isFullSetEquipped(living, ModArmorMaterial.INFUSED.material.value());
var range = 5; var range = 5;
var mobs = levelIn.getEntitiesOfClass(LivingEntity.class, new AABB( var mobs = levelIn.getEntitiesOfClass(LivingEntity.class, new AABB(
living.getX() - range, living.getY() - 0.5, living.getZ() - range, living.getX() - range, living.getY() - 0.5, living.getZ() - range,
@ -109,4 +106,17 @@ public class ItemShockwaveCreator extends ItemImpl implements ITrinketItem {
Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, matrices, buffer, player.level(), 0); Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.GROUND, packedLight, OverlayTexture.NO_OVERLAY, matrices, buffer, player.level(), 0);
} }
} }
public record Data(boolean air, double x, double y, double z) {
public static final Codec<Data> CODEC = RecordCodecBuilder.create(i -> i.group(
Codec.BOOL.fieldOf("air").forGetter(d -> d.air),
Codec.DOUBLE.fieldOf("x").forGetter(d -> d.x),
Codec.DOUBLE.fieldOf("y").forGetter(d -> d.y),
Codec.DOUBLE.fieldOf("z").forGetter(d -> d.z)
).apply(i, Data::new));
public static final DataComponentType<Data> TYPE = DataComponentType.<Data>builder().persistent(Data.CODEC).cacheEncoding().build();
}
} }

View file

@ -4,7 +4,6 @@ import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModArmorMaterial; import de.ellpeck.naturesaura.reg.ModArmorMaterial;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
@ -35,8 +34,8 @@ public class ItemArmor extends ArmorItem implements IModItem {
private static final Map<ArmorMaterial, Item[]> SETS = new ConcurrentHashMap<>(); private static final Map<ArmorMaterial, Item[]> SETS = new ConcurrentHashMap<>();
private final String baseName; private final String baseName;
public ItemArmor(String baseName, Holder<ArmorMaterial> materialIn, ArmorItem.Type equipmentSlotIn) { public ItemArmor(String baseName, ModArmorMaterial materialIn, ArmorItem.Type equipmentSlotIn) {
super(materialIn, equipmentSlotIn, new Properties()); super(materialIn.material, equipmentSlotIn, new Properties());
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }
@ -67,11 +66,11 @@ public class ItemArmor extends ArmorItem implements IModItem {
public static void onAttack(LivingIncomingDamageEvent event) { public static void onAttack(LivingIncomingDamageEvent event) {
var entity = event.getEntity(); var entity = event.getEntity();
if (!entity.level().isClientSide) { if (!entity.level().isClientSide) {
if (ItemArmor.isFullSetEquipped(entity, ModArmorMaterial.INFUSED)) { if (ItemArmor.isFullSetEquipped(entity, ModArmorMaterial.INFUSED.material.value())) {
var source = event.getSource().getEntity(); var source = event.getSource().getEntity();
if (source instanceof LivingEntity) if (source instanceof LivingEntity)
((LivingEntity) source).addEffect(new MobEffectInstance(MobEffects.WITHER, 40)); ((LivingEntity) source).addEffect(new MobEffectInstance(MobEffects.WITHER, 40));
} else if (ItemArmor.isFullSetEquipped(entity, ModArmorMaterial.DEPTH)) { } else if (ItemArmor.isFullSetEquipped(entity, ModArmorMaterial.DEPTH.material.value())) {
for (var other : entity.level().getEntitiesOfClass(LivingEntity.class, new AABB(entity.position(), entity.position()).inflate(2))) { for (var other : entity.level().getEntitiesOfClass(LivingEntity.class, new AABB(entity.position(), entity.position()).inflate(2))) {
if (other != entity && (!(entity instanceof Player player) || !player.isAlliedTo(other))) if (other != entity && (!(entity instanceof Player player) || !player.isAlliedTo(other)))
other.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 255)); other.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 255));
@ -87,7 +86,7 @@ public class ItemArmor extends ArmorItem implements IModItem {
var step = player.getAttribute(Attributes.STEP_HEIGHT); var step = player.getAttribute(Attributes.STEP_HEIGHT);
var key = NaturesAura.MOD_ID + ":sky_equipped"; var key = NaturesAura.MOD_ID + ":sky_equipped";
var nbt = player.getPersistentData(); var nbt = player.getPersistentData();
var equipped = ItemArmor.isFullSetEquipped(player, ModArmorMaterial.SKY); var equipped = ItemArmor.isFullSetEquipped(player, ModArmorMaterial.SKY.material.value());
if (equipped && !nbt.getBoolean(key)) { if (equipped && !nbt.getBoolean(key)) {
// we just equipped it // we just equipped it
nbt.putBoolean(key, true); nbt.putBoolean(key, true);

View file

@ -5,6 +5,7 @@ import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.reg.ICustomItemModel; import de.ellpeck.naturesaura.reg.ICustomItemModel;
import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
@ -44,7 +45,7 @@ public class ItemSword extends SwordItem implements IModItem, ICustomItemModel {
// this is just a modified copy of Player.attack's sweeping damage code // this is just a modified copy of Player.attack's sweeping damage code
var damage = (float) player.getAttributeValue(Attributes.ATTACK_DAMAGE) * 0.75F; var damage = (float) player.getAttributeValue(Attributes.ATTACK_DAMAGE) * 0.75F;
for (var other : player.level().getEntitiesOfClass(LivingEntity.class, stack.getSweepHitBox(player, target))) { for (var other : player.level().getEntitiesOfClass(LivingEntity.class, stack.getSweepHitBox(player, target))) {
if (other != player && other != target && !player.isAlliedTo(other) && (!(other instanceof ArmorStand stand) || !stand.isMarker()) && player.distanceToSqr(other) < Mth.square(player.getEntityReach())) { if (other != player && other != target && !player.isAlliedTo(other) && (!(other instanceof ArmorStand stand) || !stand.isMarker()) && player.distanceToSqr(other) < Mth.square(player.entityInteractionRange())) {
other.knockback(0.4F, Mth.sin(player.getYRot() * (Mth.PI / 180)), -Mth.cos(player.getYRot() * (Mth.PI / 180))); other.knockback(0.4F, Mth.sin(player.getYRot() * (Mth.PI / 180)), -Mth.cos(player.getYRot() * (Mth.PI / 180)));
other.hurt(other.damageSources().playerAttack(player), damage); other.hurt(other.damageSources().playerAttack(player), damage);
} }

View file

@ -2,82 +2,37 @@ package de.ellpeck.naturesaura.reg;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.ModItems;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.neoforge.common.util.Lazy;
import java.util.EnumMap;
import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
public enum ModArmorMaterial implements ArmorMaterial { public enum ModArmorMaterial {
INFUSED(NaturesAura.MOD_ID + ":infused_iron", 19, new int[]{2, 5, 6, 2}, 16, SoundEvents.ARMOR_EQUIP_IRON, 0, 0, () -> Ingredient.of(ModItems.INFUSED_IRON)), INFUSED(NaturesAura.MOD_ID + ":infused_iron", new int[]{2, 5, 6, 2}, 16, SoundEvents.ARMOR_EQUIP_IRON, 0, 0, () -> Ingredient.of(ModItems.INFUSED_IRON)),
SKY(NaturesAura.MOD_ID + ":sky", 33, new int[]{3, 6, 8, 3}, 12, SoundEvents.ARMOR_EQUIP_DIAMOND, 2, 0, () -> Ingredient.of(ModItems.SKY_INGOT)), SKY(NaturesAura.MOD_ID + ":sky", new int[]{3, 6, 8, 3}, 12, SoundEvents.ARMOR_EQUIP_DIAMOND, 2, 0, () -> Ingredient.of(ModItems.SKY_INGOT)),
DEPTH(NaturesAura.MOD_ID + ":depth", 37, new int[]{3, 6, 8, 3}, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3, 1, () -> Ingredient.of(ModItems.DEPTH_INGOT)); DEPTH(NaturesAura.MOD_ID + ":depth", new int[]{3, 6, 8, 3}, 18, SoundEvents.ARMOR_EQUIP_NETHERITE, 3, 1, () -> Ingredient.of(ModItems.DEPTH_INGOT));
private static final int[] MAX_DAMAGE_ARRAY = {13, 15, 16, 11}; public final Holder<ArmorMaterial> material;
private final String name;
private final int maxDamageFactor;
private final int[] damageReductionAmountArray;
private final int enchantability;
private final SoundEvent soundEvent;
private final float toughness;
private final float knockbackResistance;
private final Lazy<Ingredient> repairMaterial;
ModArmorMaterial(String nameIn, int maxDamageFactorIn, int[] damageReductionAmountsIn, int enchantabilityIn, SoundEvent equipSoundIn, float toughness, float knockbackResistance, Supplier<Ingredient> repairMaterialSupplier) { ModArmorMaterial(String nameIn, int[] damageReductionAmountsIn, int enchantabilityIn, Holder<SoundEvent> equipSoundIn, float toughness, float knockbackResistance, Supplier<Ingredient> repairMaterialSupplier) {
this.name = nameIn; var res = ResourceLocation.parse(nameIn);
this.maxDamageFactor = maxDamageFactorIn; var defense = new EnumMap<ArmorItem.Type, Integer>(ArmorItem.Type.class);
this.damageReductionAmountArray = damageReductionAmountsIn; defense.put(ArmorItem.Type.BOOTS, damageReductionAmountsIn[0]);
this.enchantability = enchantabilityIn; defense.put(ArmorItem.Type.LEGGINGS, damageReductionAmountsIn[1]);
this.soundEvent = equipSoundIn; defense.put(ArmorItem.Type.CHESTPLATE, damageReductionAmountsIn[2]);
this.toughness = toughness; defense.put(ArmorItem.Type.HELMET, damageReductionAmountsIn[3]);
this.knockbackResistance = knockbackResistance; var layers = List.of(new ArmorMaterial.Layer(res));
this.repairMaterial = Lazy.of(repairMaterialSupplier); this.material = Registry.registerForHolder(BuiltInRegistries.ARMOR_MATERIAL, res, new ArmorMaterial(defense, enchantabilityIn, equipSoundIn, repairMaterialSupplier, layers, toughness, knockbackResistance));
} }
@Override
public int getDurabilityForType(ArmorItem.Type p_266807_) {
return ModArmorMaterial.MAX_DAMAGE_ARRAY[p_266807_.getSlot().getIndex()] * this.maxDamageFactor;
}
@Override
public int getDefenseForType(ArmorItem.Type p_266807_) {
return this.damageReductionAmountArray[p_266807_.getSlot().getIndex()];
}
@Override
public int getEnchantmentValue() {
return this.enchantability;
}
@Override
public SoundEvent getEquipSound() {
return this.soundEvent;
}
@Override
public Ingredient getRepairIngredient() {
return this.repairMaterial.get();
}
@Override
@OnlyIn(Dist.CLIENT)
public String getName() {
return this.name;
}
@Override
public float getToughness() {
return this.toughness;
}
@Override
public float getKnockbackResistance() {
return this.knockbackResistance;
}
} }

View file

@ -8,10 +8,10 @@ import de.ellpeck.naturesaura.api.misc.ILevelData;
import de.ellpeck.naturesaura.blocks.*; import de.ellpeck.naturesaura.blocks.*;
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraBloom; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityAuraBloom;
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityEnderCrate;
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl;
import de.ellpeck.naturesaura.blocks.tiles.ModBlockEntities; import de.ellpeck.naturesaura.blocks.tiles.ModBlockEntities;
import de.ellpeck.naturesaura.compat.Compat; import de.ellpeck.naturesaura.compat.Compat;
import de.ellpeck.naturesaura.compat.patchouli.PatchouliCompat; import de.ellpeck.naturesaura.compat.patchouli.PatchouliCompat;
import de.ellpeck.naturesaura.enchant.AuraMendingEnchantment;
import de.ellpeck.naturesaura.enchant.ModEnchantments; import de.ellpeck.naturesaura.enchant.ModEnchantments;
import de.ellpeck.naturesaura.entities.*; import de.ellpeck.naturesaura.entities.*;
import de.ellpeck.naturesaura.gen.LevelGenAncientTree; import de.ellpeck.naturesaura.gen.LevelGenAncientTree;
@ -41,7 +41,6 @@ import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.levelgen.structure.BuiltinStructures; import net.minecraft.world.level.levelgen.structure.BuiltinStructures;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.capabilities.Capabilities.EnergyStorage; import net.neoforged.neoforge.capabilities.Capabilities.EnergyStorage;
import net.neoforged.neoforge.capabilities.Capabilities.FluidHandler; import net.neoforged.neoforge.capabilities.Capabilities.FluidHandler;
import net.neoforged.neoforge.capabilities.Capabilities.ItemHandler; import net.neoforged.neoforge.capabilities.Capabilities.ItemHandler;
@ -265,8 +264,7 @@ public final class ModRegistry {
}); });
event.register(Registries.ENCHANTMENT, h -> { event.register(Registries.ENCHANTMENT, h -> {
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_mending"), new AuraMendingEnchantment()); h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_mending"), ModEnchantments.AURA_MENDING);
Helper.populateObjectHolders(ModEnchantments.class, BuiltInRegistries.ENCHANTMENT);
}); });
event.register(Registries.ENTITY_TYPE, h -> { event.register(Registries.ENTITY_TYPE, h -> {
@ -336,6 +334,19 @@ public final class ModRegistry {
event.register(NeoForgeRegistries.Keys.ATTACHMENT_TYPES, h -> { event.register(NeoForgeRegistries.Keys.ATTACHMENT_TYPES, h -> {
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_chunk"), NaturesAuraAPI.AURA_CHUNK_ATTACHMENT); h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_chunk"), NaturesAuraAPI.AURA_CHUNK_ATTACHMENT);
}); });
event.register(Registries.DATA_COMPONENT_TYPE, h -> {
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "multiblock_maker_data"), ItemMultiblockMaker.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_data"), ItemAuraContainer.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "dropped_item_data"), BlockEntityImpl.DroppedItemData.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "ender_crate_data"), BlockEnderCrate.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_bottle_data"), ItemAuraBottle.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "break_prevention_data"), ItemBreakPrevention.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "color_changer_data"), ItemColorChanger.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "effect_powder_data"), ItemEffectPowder.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "shockwave_creator_data"), ItemShockwaveCreator.Data.TYPE);
h.register(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "disableable_tool_data"), Helper.DisableableToolData.TYPE);
});
} }
@SubscribeEvent @SubscribeEvent