a bunch more work on the port

This commit is contained in:
Ell 2024-09-25 18:29:38 +02:00
parent 6525ff5d25
commit e50d3fc69a
107 changed files with 1322 additions and 1269 deletions

View file

@ -6,7 +6,6 @@ import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge;
import de.ellpeck.naturesaura.api.misc.ILevelData; import de.ellpeck.naturesaura.api.misc.ILevelData;
import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl; import de.ellpeck.naturesaura.blocks.tiles.BlockEntityImpl;
import de.ellpeck.naturesaura.chunk.AuraChunk; import de.ellpeck.naturesaura.chunk.AuraChunk;
import de.ellpeck.naturesaura.compat.Compat;
import de.ellpeck.naturesaura.misc.LevelData; import de.ellpeck.naturesaura.misc.LevelData;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
@ -15,6 +14,8 @@ 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.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.IntArrayTag;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
@ -367,4 +368,13 @@ public final class Helper {
return true; return true;
} }
public static BlockPos readBlockPos(Tag tag) {
if (tag instanceof IntArrayTag i) {
var arr = i.getAsIntArray();
if (arr.length == 3)
return new BlockPos(arr[0], arr[1], arr[2]);
}
return null;
}
} }

View file

@ -54,135 +54,135 @@ public final class ModConfig {
public ModConfig(ModConfigSpec.Builder builder) { public ModConfig(ModConfigSpec.Builder builder) {
builder.push("general"); builder.push("general");
this.additionalBotanistPickaxeConversions = builder this.additionalBotanistPickaxeConversions = builder
.comment("Additional conversion recipes for the Botanist's Pickaxe right click function. Each entry needs to be formatted as modid:input_block[prop1=value1,...]->modid:output_block[prop1=value1,...] where block state properties are optional, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Additional conversion recipes for the Botanist's Pickaxe right click function. Each entry needs to be formatted as modid:input_block[prop1=value1,...]->modid:output_block[prop1=value1,...] where block state properties are optional, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".additionalBotanistPickaxeConversions") .translation("config." + NaturesAura.MOD_ID + ".additionalBotanistPickaxeConversions")
.defineList("additionalBotanistPickaxeConversions", Collections.emptyList(), s -> true); .defineList("additionalBotanistPickaxeConversions", Collections.emptyList(), () -> "", s -> true);
this.auraTypeOverrides = builder this.auraTypeOverrides = builder
.comment("Additional dimensions that map to Aura types that should be present in them. This is useful if you have a modpack with custom dimensions that should have Aura act similarly to an existing dimension in them. Each entry needs to be formatted as dimension_name->aura_type, where aura_type can be any of naturesaura:overworld, naturesaura:nether and naturesaura:end, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Additional dimensions that map to Aura types that should be present in them. This is useful if you have a modpack with custom dimensions that should have Aura act similarly to an existing dimension in them. Each entry needs to be formatted as dimension_name->aura_type, where aura_type can be any of naturesaura:overworld, naturesaura:nether and naturesaura:end, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".auraTypeOverrides") .translation("config." + NaturesAura.MOD_ID + ".auraTypeOverrides")
.defineList("auraTypeOverrides", Collections.emptyList(), s -> true); .defineList("auraTypeOverrides", Collections.emptyList(), () -> "", s -> true);
this.additionalOres = builder this.additionalOres = builder
.comment("Additional blocks that are recognized as generatable ores for the passive ore generation effect. Each entry needs to be formatted as tag_name->oreWeight->dimension where a higher weight makes the ore more likely to spawn with 5000 being the weight of coal, the default ore with the highest weight, and dimension being any of overworld and nether, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Additional blocks that are recognized as generatable ores for the passive ore generation effect. Each entry needs to be formatted as tag_name->oreWeight->dimension where a higher weight makes the ore more likely to spawn with 5000 being the weight of coal, the default ore with the highest weight, and dimension being any of overworld and nether, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".additionalOres") .translation("config." + NaturesAura.MOD_ID + ".additionalOres")
.defineList("additionalOres", Collections.emptyList(), s -> true); .defineList("additionalOres", Collections.emptyList(), () -> "", s -> true);
this.oreExceptions = builder this.oreExceptions = builder
.comment("Blocks that are exempt from being recognized as generatable ores for the passive ore generation effect. Each entry needs to be formatted as modid:block[prop1=value1,...] where block state properties are optional, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Blocks that are exempt from being recognized as generatable ores for the passive ore generation effect. Each entry needs to be formatted as modid:block[prop1=value1,...] where block state properties are optional, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".oreExceptions") .translation("config." + NaturesAura.MOD_ID + ".oreExceptions")
.defineList("oreExceptions", Collections.emptyList(), s -> true); .defineList("oreExceptions", Collections.emptyList(), () -> "", s -> true);
this.plantBoostExceptions = builder this.plantBoostExceptions = builder
.comment("Blocks that are exept from being fertilized by the plant boost effect. Each entry needs to be formatted as modid:block, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Blocks that are exept from being fertilized by the plant boost effect. Each entry needs to be formatted as modid:block, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".plantBoostExceptions") .translation("config." + NaturesAura.MOD_ID + ".plantBoostExceptions")
.defineList("plantBoostExceptions", Collections.emptyList(), s -> true); .defineList("plantBoostExceptions", Collections.emptyList(), () -> "", s -> true);
this.additionalProjectiles = builder this.additionalProjectiles = builder
.comment("Additional projectile types that are allowed to be consumed by the projectile generator. Each entry needs to be formatted as entity_registry_name->aura_amount, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).") .comment("Additional projectile types that are allowed to be consumed by the projectile generator. Each entry needs to be formatted as entity_registry_name->aura_amount, and entries follow standard TOML array formatting (https://toml.io/en/v1.0.0#array).")
.translation("config." + NaturesAura.MOD_ID + ".additionalProjectiles") .translation("config." + NaturesAura.MOD_ID + ".additionalProjectiles")
.defineList("additionalProjectiles", Collections.emptyList(), s -> true); .defineList("additionalProjectiles", Collections.emptyList(), () -> "", s -> true);
this.fieldCreatorRange = builder this.fieldCreatorRange = builder
.comment("The amount of blocks that can be between two Aura Field Creators for them to be connectable and work together") .comment("The amount of blocks that can be between two Aura Field Creators for them to be connectable and work together")
.translation("config." + NaturesAura.MOD_ID + ".fieldCreatorRange") .translation("config." + NaturesAura.MOD_ID + ".fieldCreatorRange")
.define("fieldCreatorRange", 24); .define("fieldCreatorRange", 24);
this.auraToRFRatio = builder this.auraToRFRatio = builder
.comment("The Aura to RF ratio used by the RF converter, read as aura*ratio = rf") .comment("The Aura to RF ratio used by the RF converter, read as aura*ratio = rf")
.translation("config." + NaturesAura.MOD_ID + ".auraToRFRatio") .translation("config." + NaturesAura.MOD_ID + ".auraToRFRatio")
.define("auraToRFRatio", 0.05); .define("auraToRFRatio", 0.05);
this.maxAnimalsAroundPowder = builder this.maxAnimalsAroundPowder = builder
.comment("The maximum amount of animals that can be around the powder of fertility before it stops working") .comment("The maximum amount of animals that can be around the powder of fertility before it stops working")
.translation("config." + NaturesAura.MOD_ID + ".maxAnimalsAroundPowder") .translation("config." + NaturesAura.MOD_ID + ".maxAnimalsAroundPowder")
.define("maxAnimalsAroundPowder", 200); .define("maxAnimalsAroundPowder", 200);
this.maxAuraSpreadRange = builder this.maxAuraSpreadRange = builder
.comment("The maximum amount of blocks that aura can spread from an initial position before it starts fizzling out. It's recommended to lower this value on a large server to avoid lag caused by players chunk-loading their bases for extended amounts of time without an Aura Detector present.") .comment("The maximum amount of blocks that aura can spread from an initial position before it starts fizzling out. It's recommended to lower this value on a large server to avoid lag caused by players chunk-loading their bases for extended amounts of time without an Aura Detector present.")
.translation("config." + NaturesAura.MOD_ID + ".maxAuraSpreadRange") .translation("config." + NaturesAura.MOD_ID + ".maxAuraSpreadRange")
.define("maxAuraSpreadRange", 150); .define("maxAuraSpreadRange", 150);
builder.pop(); builder.pop();
builder.push("features"); builder.push("features");
this.rfConverter = builder this.rfConverter = builder
.comment("If the RF converter block should be enabled") .comment("If the RF converter block should be enabled")
.translation("config." + NaturesAura.MOD_ID + ".rfConverter") .translation("config." + NaturesAura.MOD_ID + ".rfConverter")
.define("rfConverter", true); .define("rfConverter", true);
this.chunkLoader = builder this.chunkLoader = builder
.comment("If the chunk loader block should be enabled") .comment("If the chunk loader block should be enabled")
.translation("config." + NaturesAura.MOD_ID + ".chunkLoader") .translation("config." + NaturesAura.MOD_ID + ".chunkLoader")
.define("chunkLoader", true); .define("chunkLoader", true);
this.grassDieEffect = builder this.grassDieEffect = builder
.comment("If the Aura Imbalance effect of grass and trees dying in the area if the Aura levels are too low should occur") .comment("If the Aura Imbalance effect of grass and trees dying in the area if the Aura levels are too low should occur")
.translation("config." + NaturesAura.MOD_ID + ".grassDieEffect") .translation("config." + NaturesAura.MOD_ID + ".grassDieEffect")
.define("grassDieEffect", true); .define("grassDieEffect", true);
this.netherDecayEffect = builder this.netherDecayEffect = builder
.comment("If the Aura Imbalance effect of nether blocks degrading in the area if the Aura levels are too low should occur") .comment("If the Aura Imbalance effect of nether blocks degrading in the area if the Aura levels are too low should occur")
.translation("config." + NaturesAura.MOD_ID + ".netherDecayEffect") .translation("config." + NaturesAura.MOD_ID + ".netherDecayEffect")
.define("netherDecayEffect", true); .define("netherDecayEffect", true);
this.plantBoostEffect = builder this.plantBoostEffect = builder
.comment("If the Aura Imbalance effect of plant growth being boosted if the Aura levels are high enough should occur") .comment("If the Aura Imbalance effect of plant growth being boosted if the Aura levels are high enough should occur")
.translation("config." + NaturesAura.MOD_ID + ".plantBoostEffect") .translation("config." + NaturesAura.MOD_ID + ".plantBoostEffect")
.define("plantBoostEffect", true); .define("plantBoostEffect", true);
this.cacheRechargeEffect = builder this.cacheRechargeEffect = builder
.comment("If the Aura Imbalance effect of aura containers in players' inventories being filled if the Aura levels are high enough should occur") .comment("If the Aura Imbalance effect of aura containers in players' inventories being filled if the Aura levels are high enough should occur")
.translation("config." + NaturesAura.MOD_ID + ".cacheRechargeEffect") .translation("config." + NaturesAura.MOD_ID + ".cacheRechargeEffect")
.define("cacheRechargeEffect", true); .define("cacheRechargeEffect", true);
this.explosionEffect = builder this.explosionEffect = builder
.comment("If the Aura Imbalance effect of explosions happening randomly if Aura levels are too low should occur") .comment("If the Aura Imbalance effect of explosions happening randomly if Aura levels are too low should occur")
.translation("config." + NaturesAura.MOD_ID + ".explosionEffect") .translation("config." + NaturesAura.MOD_ID + ".explosionEffect")
.define("explosionEffect", true); .define("explosionEffect", true);
this.breathlessEffect = builder this.breathlessEffect = builder
.comment("If the Aura Imbalance effect of breathlessness if Aura levels are too low should occur") .comment("If the Aura Imbalance effect of breathlessness if Aura levels are too low should occur")
.translation("config." + NaturesAura.MOD_ID + ".breathlessEffect") .translation("config." + NaturesAura.MOD_ID + ".breathlessEffect")
.define("breathlessEffect", true); .define("breathlessEffect", true);
this.angerEffect = builder this.angerEffect = builder
.comment("If the Aura Imbalance effect of passive mobs being angered if Aura levels are too low should occur") .comment("If the Aura Imbalance effect of passive mobs being angered if Aura levels are too low should occur")
.translation("config." + NaturesAura.MOD_ID + ".angerEffect") .translation("config." + NaturesAura.MOD_ID + ".angerEffect")
.define("angerEffect", true); .define("angerEffect", true);
this.animalEffect = builder this.animalEffect = builder
.comment("If the Aura Imbalance effect of farm animals being affected in positive ways if Aura levels are too high should occur") .comment("If the Aura Imbalance effect of farm animals being affected in positive ways if Aura levels are too high should occur")
.translation("config." + NaturesAura.MOD_ID + ".animalEffect") .translation("config." + NaturesAura.MOD_ID + ".animalEffect")
.define("animalEffect", true); .define("animalEffect", true);
this.oreEffect = builder this.oreEffect = builder
.comment("If the Aura Imbalance effect of ores spawning in the area if Aura levels are too high should occur") .comment("If the Aura Imbalance effect of ores spawning in the area if Aura levels are too high should occur")
.translation("config." + NaturesAura.MOD_ID + ".oreEffect") .translation("config." + NaturesAura.MOD_ID + ".oreEffect")
.define("oreEffect", true); .define("oreEffect", true);
this.auraBlooms = builder this.auraBlooms = builder
.comment("If Aura Blooms and Aura Cacti should generate in the level") .comment("If Aura Blooms and Aura Cacti should generate in the level")
.translation("config." + NaturesAura.MOD_ID + ".auraBlooms") .translation("config." + NaturesAura.MOD_ID + ".auraBlooms")
.define("auraBlooms", true); .define("auraBlooms", true);
this.netherGrassEffect = builder this.netherGrassEffect = builder
.comment("If the Aura Imbalance effect of grass growing on netherrack if the Aura levels are high enough should occur") .comment("If the Aura Imbalance effect of grass growing on netherrack if the Aura levels are high enough should occur")
.translation("config." + NaturesAura.MOD_ID + ".netherGrassEffect") .translation("config." + NaturesAura.MOD_ID + ".netherGrassEffect")
.define("netherGrassEffect", true); .define("netherGrassEffect", true);
builder.pop(); builder.pop();
builder.push("client"); builder.push("client");
this.particleAmount = builder this.particleAmount = builder
.comment("The percentage of particles that should be displayed, where 1 is 100% and 0 is 0%") .comment("The percentage of particles that should be displayed, where 1 is 100% and 0 is 0%")
.translation("config." + NaturesAura.MOD_ID + ".particleAmount") .translation("config." + NaturesAura.MOD_ID + ".particleAmount")
.defineInRange("particleAmount", 1D, 0, 1); .defineInRange("particleAmount", 1D, 0, 1);
this.respectVanillaParticleSettings = builder this.respectVanillaParticleSettings = builder
.comment("If particle spawning should respect the particle setting in Minecraft's video settings screen") .comment("If particle spawning should respect the particle setting in Minecraft's video settings screen")
.translation("config." + NaturesAura.MOD_ID + ".respectVanillaParticleSettings") .translation("config." + NaturesAura.MOD_ID + ".respectVanillaParticleSettings")
.define("respectVanillaParticleSettings", false); .define("respectVanillaParticleSettings", false);
this.excessParticleAmount = builder this.excessParticleAmount = builder
.comment("The percentage of particles that should spawn when there is an excess amount of Aura in the environment, where 1 is 100% and 0 is 0%") .comment("The percentage of particles that should spawn when there is an excess amount of Aura in the environment, where 1 is 100% and 0 is 0%")
.translation("config." + NaturesAura.MOD_ID + ".excessParticleAmount") .translation("config." + NaturesAura.MOD_ID + ".excessParticleAmount")
.define("excessParticleAmount", 1D); .define("excessParticleAmount", 1D);
this.auraBarLocation = builder this.auraBarLocation = builder
.comment("The location of the aura bar, where 0 is top left, 1 is top right, 2 is bottom left and 3 is bottom right") .comment("The location of the aura bar, where 0 is top left, 1 is top right, 2 is bottom left and 3 is bottom right")
.translation("config." + NaturesAura.MOD_ID + ".auraBarLocation") .translation("config." + NaturesAura.MOD_ID + ".auraBarLocation")
.defineInRange("auraBarLocation", 0, 0, 3); .defineInRange("auraBarLocation", 0, 0, 3);
this.cacheBarLocation = builder this.cacheBarLocation = builder
.comment("The location of the aura cache bar, where 0 is to the left of the hotbar and 1 is to the right of the hotbar") .comment("The location of the aura cache bar, where 0 is to the left of the hotbar and 1 is to the right of the hotbar")
.translation("config." + NaturesAura.MOD_ID + ".cacheBarLocation") .translation("config." + NaturesAura.MOD_ID + ".cacheBarLocation")
.defineInRange("cacheBarLocation", 0, 0, 1); .defineInRange("cacheBarLocation", 0, 0, 1);
this.debugText = builder this.debugText = builder
.comment("If debug information about Aura around the player should be displayed in the F3 debug menu if the player is in creative mode") .comment("If debug information about Aura around the player should be displayed in the F3 debug menu if the player is in creative mode")
.translation("config." + NaturesAura.MOD_ID + ".debugText") .translation("config." + NaturesAura.MOD_ID + ".debugText")
.define("debugText", true); .define("debugText", true);
this.debugLevel = builder this.debugLevel = builder
.comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the level for debug purposes") .comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the level for debug purposes")
.translation("config." + NaturesAura.MOD_ID + ".debugLevel") .translation("config." + NaturesAura.MOD_ID + ".debugLevel")
.define("debugLevel", false); .define("debugLevel", false);
this.renderItemsOnPlayer = builder this.renderItemsOnPlayer = builder
.comment("If certain equippable items, like the Environmental Eye, should be rendered on the player") .comment("If certain equippable items, like the Environmental Eye, should be rendered on the player")
.translation("config." + NaturesAura.MOD_ID + ".renderItemsOnPlayer") .translation("config." + NaturesAura.MOD_ID + ".renderItemsOnPlayer")
.define("renderItemsOnPlayer", true); .define("renderItemsOnPlayer", true);
builder.pop(); builder.pop();
} }
@ -191,21 +191,21 @@ public final class ModConfig {
throw new IllegalStateException("Nature's Aura has detected that all negative Aura Imbalance effects are disabled in the config file. This is disallowed behavior. Please enable at least one negative effect."); throw new IllegalStateException("Nature's Aura has detected that all negative Aura Imbalance effects are disabled in the config file. This is disallowed behavior. Please enable at least one negative effect.");
try { try {
for (String s : this.additionalBotanistPickaxeConversions.get()) { for (var s : this.additionalBotanistPickaxeConversions.get()) {
var split = s.split("->"); var split = s.split("->");
NaturesAuraAPI.BOTANIST_PICKAXE_CONVERSIONS.put( NaturesAuraAPI.BOTANIST_PICKAXE_CONVERSIONS.put(
Objects.requireNonNull(Helper.getStateFromString(split[0]), "state1"), Objects.requireNonNull(Helper.getStateFromString(split[0]), "state1"),
Objects.requireNonNull(Helper.getStateFromString(split[1]), "state2")); Objects.requireNonNull(Helper.getStateFromString(split[1]), "state2"));
} }
} catch (Exception e) { } catch (Exception e) {
NaturesAura.LOGGER.warn("Error parsing additionalBotanistPickaxeConversions", e); NaturesAura.LOGGER.warn("Error parsing additionalBotanistPickaxeConversions", e);
} }
try { try {
for (String s : this.auraTypeOverrides.get()) { for (var s : this.auraTypeOverrides.get()) {
var split = s.split("->"); var split = s.split("->");
var dim = new ResourceLocation(split[0]); var dim = ResourceLocation.parse(split[0]);
var type = Objects.requireNonNull((BasicAuraType) NaturesAuraAPI.AURA_TYPES.get(new ResourceLocation(split[1])), "type"); var type = Objects.requireNonNull((BasicAuraType) NaturesAuraAPI.AURA_TYPES.get(ResourceLocation.parse(split[1])), "type");
type.addDimensionType(dim); type.addDimensionType(dim);
} }
} catch (Exception e) { } catch (Exception e) {
@ -213,9 +213,9 @@ public final class ModConfig {
} }
try { try {
for (String s : this.additionalOres.get()) { for (var s : this.additionalOres.get()) {
var split = s.split("->"); var split = s.split("->");
var ore = new WeightedOre(new ResourceLocation(split[0]), Integer.parseInt(split[1])); var ore = new WeightedOre(ResourceLocation.parse(split[0]), Integer.parseInt(split[1]));
var dimension = split[2]; var dimension = split[2];
if ("nether".equalsIgnoreCase(dimension)) { if ("nether".equalsIgnoreCase(dimension)) {
NaturesAuraAPI.NETHER_ORES.removeIf(o -> o.tag.equals(ore.tag)); NaturesAuraAPI.NETHER_ORES.removeIf(o -> o.tag.equals(ore.tag));
@ -232,7 +232,7 @@ public final class ModConfig {
} }
try { try {
for (String s : this.oreExceptions.get()) for (var s : this.oreExceptions.get())
OreSpawnEffect.SPAWN_EXCEPTIONS.add(Objects.requireNonNull(Helper.getStateFromString(s))); OreSpawnEffect.SPAWN_EXCEPTIONS.add(Objects.requireNonNull(Helper.getStateFromString(s)));
} catch (Exception e) { } catch (Exception e) {
NaturesAura.LOGGER.warn("Error parsing oreExceptions", e); NaturesAura.LOGGER.warn("Error parsing oreExceptions", e);
@ -240,7 +240,7 @@ public final class ModConfig {
try { try {
for (var s : this.plantBoostExceptions.get()) for (var s : this.plantBoostExceptions.get())
PlantBoostEffect.EXCEPTIONS.add(Objects.requireNonNull(BuiltInRegistries.BLOCK.get(new ResourceLocation(s)))); PlantBoostEffect.EXCEPTIONS.add(Objects.requireNonNull(BuiltInRegistries.BLOCK.get(ResourceLocation.parse(s))));
} catch (Exception e) { } catch (Exception e) {
NaturesAura.LOGGER.warn("Error parsing plantBoostExceptions", e); NaturesAura.LOGGER.warn("Error parsing plantBoostExceptions", e);
@ -249,7 +249,7 @@ public final class ModConfig {
try { try {
for (var s : this.additionalProjectiles.get()) { for (var s : this.additionalProjectiles.get()) {
var split = s.split("->"); var split = s.split("->");
var name = new ResourceLocation(split[0]); var name = ResourceLocation.parse(split[0]);
var type = Objects.requireNonNull(BuiltInRegistries.ENTITY_TYPE.get(name)); var type = Objects.requireNonNull(BuiltInRegistries.ENTITY_TYPE.get(name));
var amount = Integer.parseInt(split[1]); var amount = Integer.parseInt(split[1]);
NaturesAuraAPI.PROJECTILE_GENERATIONS.put(type, amount); NaturesAuraAPI.PROJECTILE_GENERATIONS.put(type, amount);

View file

@ -10,8 +10,7 @@ import de.ellpeck.naturesaura.proxy.ClientProxy;
import de.ellpeck.naturesaura.proxy.IProxy; import de.ellpeck.naturesaura.proxy.IProxy;
import de.ellpeck.naturesaura.proxy.ServerProxy; import de.ellpeck.naturesaura.proxy.ServerProxy;
import de.ellpeck.naturesaura.recipes.ModRecipes; import de.ellpeck.naturesaura.recipes.ModRecipes;
import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModContainer;
import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.common.Mod; import net.neoforged.fml.common.Mod;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLEnvironment;
@ -30,15 +29,16 @@ public final class NaturesAura {
public static NaturesAura instance; public static NaturesAura instance;
public static IProxy proxy; public static IProxy proxy;
public NaturesAura(IEventBus eventBus) { public NaturesAura(ModContainer container) {
NaturesAura.instance = this; NaturesAura.instance = this;
NaturesAura.proxy = FMLEnvironment.dist.isClient() ? new ClientProxy() : new ServerProxy(); NaturesAura.proxy = FMLEnvironment.dist.isClient() ? new ClientProxy() : new ServerProxy();
eventBus.addListener(this::setup); container.getEventBus().addListener(this::setup);
container.getEventBus().register(NaturesAura.proxy);
var builder = new ModConfigSpec.Builder(); var builder = new ModConfigSpec.Builder();
ModConfig.instance = new ModConfig(builder); ModConfig.instance = new ModConfig(builder);
ModLoadingContext.get().registerConfig(net.neoforged.fml.config.ModConfig.Type.COMMON, builder.build()); container.registerConfig(net.neoforged.fml.config.ModConfig.Type.COMMON, builder.build());
} }
public void setup(FMLCommonSetupEvent event) { public void setup(FMLCommonSetupEvent event) {

View file

@ -9,7 +9,6 @@ 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.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@ -19,11 +18,9 @@ import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.neoforged.neoforge.event.EventHooks; import net.neoforged.neoforge.event.EventHooks;
import net.neoforged.bus.api.Event;
public class BlockAncientSapling extends BushBlock implements BonemealableBlock, IModItem, ICustomBlockState, ICustomItemModel { public class BlockAncientSapling extends BushBlock implements BonemealableBlock, IModItem, ICustomBlockState, ICustomItemModel {
@ -75,9 +72,12 @@ public class BlockAncientSapling extends BushBlock implements BonemealableBlock,
public void performBonemeal(ServerLevel level, RandomSource rand, BlockPos pos, BlockState state) { public void performBonemeal(ServerLevel level, RandomSource rand, BlockPos pos, BlockState state) {
if (state.getValue(SaplingBlock.STAGE) == 0) { if (state.getValue(SaplingBlock.STAGE) == 0) {
level.setBlock(pos, state.cycle(SaplingBlock.STAGE), 4); level.setBlock(pos, state.cycle(SaplingBlock.STAGE), 4);
} else if (!EventHooks.blockGrowFeature(level, rand, pos, null).getResult().equals(Event.Result.DENY)) { } else {
Registry<ConfiguredFeature<?, ?>> registry = level.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE); var event = EventHooks.fireBlockGrowFeature(level, rand, pos, null);
registry.getHolderOrThrow(ModFeatures.Configured.ANCIENT_TREE).value().place(level, level.getChunkSource().getGenerator(), rand, pos); if (!event.isCanceled()) {
var registry = level.registryAccess().registryOrThrow(Registries.CONFIGURED_FEATURE);
registry.getHolderOrThrow(ModFeatures.Configured.ANCIENT_TREE).value().place(level, level.getChunkSource().getGenerator(), rand, pos);
}
} }
} }

View file

@ -17,11 +17,12 @@ import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
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.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.living.*;
import net.neoforged.neoforge.event.entity.living.LivingExperienceDropEvent;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.event.entity.living.LivingEvent; import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.event.entity.living.LivingDeathEvent;
import net.neoforged.neoforge.event.entity.living.LivingDropsEvent;
import net.neoforged.neoforge.event.entity.living.LivingExperienceDropEvent;
import net.neoforged.neoforge.event.tick.EntityTickEvent;
public class BlockAnimalGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState { public class BlockAnimalGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
@ -32,7 +33,7 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
} }
@SubscribeEvent @SubscribeEvent
public void onLivingUpdate(LivingEvent.LivingTickEvent event) { public void onLivingUpdate(EntityTickEvent event) {
var entity = event.getEntity(); var entity = event.getEntity();
if (entity.level().isClientSide || entity.level().getGameTime() % 40 != 0 || !(entity instanceof Animal) || entity instanceof Npc) if (entity.level().isClientSide || entity.level().getGameTime() % 40 != 0 || !(entity instanceof Animal) || entity instanceof Npc)
return; return;
@ -70,10 +71,10 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
var genPos = gen.getBlockPos(); var genPos = gen.getBlockPos();
PacketHandler.sendToAllAround(entity.level(), pos, 32, new PacketParticles( PacketHandler.sendToAllAround(entity.level(), pos, 32, new PacketParticles(
(float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), PacketParticles.Type.ANIMAL_GEN_CONSUME, (float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), PacketParticles.Type.ANIMAL_GEN_CONSUME,
child ? 1 : 0, child ? 1 : 0,
(int) (entity.getEyeHeight() * 10F), (int) (entity.getEyeHeight() * 10F),
genPos.getX(), genPos.getY(), genPos.getZ())); genPos.getX(), genPos.getY(), genPos.getZ()));
return true; return true;
}); });
@ -108,8 +109,9 @@ public class BlockAnimalGenerator extends BlockContainerImpl implements IVisuali
@Override @Override
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(),
generator.modLoc("block/" + this.getBaseName()), generator.modLoc("block/" + this.getBaseName()),
generator.modLoc("block/" + this.getBaseName() + "_bottom"), generator.modLoc("block/" + this.getBaseName() + "_bottom"),
generator.modLoc("block/" + this.getBaseName() + "_top"))); generator.modLoc("block/" + this.getBaseName() + "_top")));
} }
} }

View file

@ -13,8 +13,9 @@ import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@ -52,9 +53,8 @@ public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockSt
} }
@Override @Override
@SuppressWarnings("deprecation") protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult p_225533_6_) { return Helper.putStackOnTile(player, hand, pos, 0, true);
return Helper.putStackOnTile(player, handIn, pos, 0, true);
} }
@Override @Override
@ -80,4 +80,5 @@ public class BlockAuraTimer extends BlockContainerImpl implements ICustomBlockSt
public void registerTESR() { public void registerTESR() {
BlockEntityRenderers.register(ModBlockEntities.AURA_TIMER, RenderAuraTimer::new); BlockEntityRenderers.register(ModBlockEntities.AURA_TIMER, RenderAuraTimer::new);
} }
} }

View file

@ -20,6 +20,7 @@ import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand; 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.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;
@ -85,10 +86,9 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
} }
@Override @Override
@SuppressWarnings("deprecation") protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { if (!level.isClientSide) {
if (!levelIn.isClientSide) { var tile = level.getBlockEntity(pos);
var tile = levelIn.getBlockEntity(pos);
if (tile instanceof BlockEntityEnderCrate crate && crate.canOpen() && crate.canUseRightNow(2500)) { if (tile instanceof BlockEntityEnderCrate crate && crate.canOpen() && crate.canUseRightNow(2500)) {
crate.drainAura(2500); crate.drainAura(2500);
player.openMenu(crate, pos); player.openMenu(crate, pos);
@ -98,9 +98,8 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
} }
@Override @Override
@OnlyIn(Dist.CLIENT) public void appendHoverText(ItemStack stack, Item.TooltipContext context, List<Component> tooltipComponents, TooltipFlag tooltipFlag) {
public void appendHoverText(ItemStack stack, @Nullable BlockGetter levelIn, List<Component> tooltip, TooltipFlag flagIn) { BlockEnderCrate.addEnderNameInfo(stack, tooltipComponents);
BlockEnderCrate.addEnderNameInfo(stack, tooltip);
} }
@Override @Override
@ -122,9 +121,9 @@ public class BlockEnderCrate extends BlockContainerImpl implements ITESRProvider
@Override @Override
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(),
generator.modLoc("block/" + this.getBaseName()), generator.modLoc("block/" + this.getBaseName()),
generator.modLoc("block/" + this.getBaseName() + "_bottom"), generator.modLoc("block/" + this.getBaseName() + "_bottom"),
generator.modLoc("block/" + this.getBaseName() + "_top"))); generator.modLoc("block/" + this.getBaseName() + "_top")));
} }
@Override @Override

View file

@ -9,8 +9,9 @@ import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
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;
@ -25,11 +26,10 @@ public class BlockFieldCreator extends BlockContainerImpl implements ICustomBloc
} }
@Override @Override
@SuppressWarnings("deprecation") protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult result) { var tile = level.getBlockEntity(pos);
var tile = levelIn.getBlockEntity(pos);
if (tile instanceof BlockEntityFieldCreator) { if (tile instanceof BlockEntityFieldCreator) {
if (!levelIn.isClientSide) { if (!level.isClientSide) {
var key = NaturesAura.MOD_ID + ":field_creator_pos"; var key = NaturesAura.MOD_ID + ":field_creator_pos";
var compound = player.getPersistentData(); var compound = player.getPersistentData();
if (!player.isShiftKeyDown() && compound.contains(key)) { if (!player.isShiftKeyDown() && compound.contains(key)) {
@ -37,7 +37,7 @@ public class BlockFieldCreator extends BlockContainerImpl implements ICustomBloc
var creator = (BlockEntityFieldCreator) tile; var creator = (BlockEntityFieldCreator) tile;
if (!pos.equals(stored)) { if (!pos.equals(stored)) {
if (creator.isCloseEnough(stored)) { if (creator.isCloseEnough(stored)) {
var otherTile = levelIn.getBlockEntity(stored); var otherTile = level.getBlockEntity(stored);
if (otherTile instanceof BlockEntityFieldCreator otherCreator) { if (otherTile instanceof BlockEntityFieldCreator otherCreator) {
creator.connectionOffset = stored.subtract(pos); creator.connectionOffset = stored.subtract(pos);
creator.isMain = true; creator.isMain = true;
@ -60,9 +60,9 @@ public class BlockFieldCreator extends BlockContainerImpl implements ICustomBloc
player.displayClientMessage(Component.translatable("info." + NaturesAura.MOD_ID + ".stored_pos"), true); player.displayClientMessage(Component.translatable("info." + NaturesAura.MOD_ID + ".stored_pos"), true);
} }
} }
return InteractionResult.SUCCESS; return ItemInteractionResult.SUCCESS;
} else } else
return InteractionResult.FAIL; return ItemInteractionResult.FAIL;
} }
@Override @Override
@ -73,13 +73,13 @@ public class BlockFieldCreator extends BlockContainerImpl implements ICustomBloc
var connected = creator.getConnectedPos(); var connected = creator.getConnectedPos();
if (connected != null) if (connected != null)
NaturesAuraAPI.instance().spawnParticleStream( NaturesAuraAPI.instance().spawnParticleStream(
pos.getX() + 0.25F + rand.nextFloat() * 0.5F, pos.getX() + 0.25F + rand.nextFloat() * 0.5F,
pos.getY() + 0.25F + rand.nextFloat() * 0.5F, pos.getY() + 0.25F + rand.nextFloat() * 0.5F,
pos.getZ() + 0.25F + rand.nextFloat() * 0.5F, pos.getZ() + 0.25F + rand.nextFloat() * 0.5F,
connected.getX() + 0.25F + rand.nextFloat() * 0.5F, connected.getX() + 0.25F + rand.nextFloat() * 0.5F,
connected.getY() + 0.25F + rand.nextFloat() * 0.5F, connected.getY() + 0.25F + rand.nextFloat() * 0.5F,
connected.getZ() + 0.25F + rand.nextFloat() * 0.5F, connected.getZ() + 0.25F + rand.nextFloat() * 0.5F,
0.65F, 0x4245f4, 1F 0.65F, 0x4245f4, 1F
); );
} }
} }

View file

@ -8,7 +8,6 @@ import de.ellpeck.naturesaura.reg.ICustomItemModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
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.context.BlockPlaceContext; import net.minecraft.world.item.context.BlockPlaceContext;
@ -18,7 +17,6 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.HopperBlock; import net.minecraft.world.level.block.HopperBlock;
import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.Hopper;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.DirectionProperty; import net.minecraft.world.level.block.state.properties.DirectionProperty;
@ -28,27 +26,27 @@ import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.items.IItemHandler;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class BlockGratedChute extends BlockContainerImpl implements ICustomBlockState, ICustomItemModel { public class BlockGratedChute extends BlockContainerImpl implements ICustomBlockState, ICustomItemModel {
public static final DirectionProperty FACING = HopperBlock.FACING; public static final DirectionProperty FACING = HopperBlock.FACING;
private static final VoxelShape INSIDE = Block.box(2.0, 11.0, 2.0, 14.0, 16.0, 14.0);
private static final VoxelShape INPUT_SHAPE = Block.box(0.0D, 10.0D, 0.0D, 16.0D, 16.0D, 16.0D); private static final VoxelShape INPUT_SHAPE = Block.box(0.0D, 10.0D, 0.0D, 16.0D, 16.0D, 16.0D);
private static final VoxelShape MIDDLE_SHAPE = Block.box(4.0D, 4.0D, 4.0D, 12.0D, 10.0D, 12.0D); private static final VoxelShape MIDDLE_SHAPE = Block.box(4.0D, 4.0D, 4.0D, 12.0D, 10.0D, 12.0D);
private static final VoxelShape INPUT_MIDDLE_SHAPE = Shapes.or(BlockGratedChute.MIDDLE_SHAPE, BlockGratedChute.INPUT_SHAPE); private static final VoxelShape INPUT_MIDDLE_SHAPE = Shapes.or(BlockGratedChute.MIDDLE_SHAPE, BlockGratedChute.INPUT_SHAPE);
private static final VoxelShape COMBINED_SHAPE = Shapes.join(BlockGratedChute.INPUT_MIDDLE_SHAPE, Hopper.INSIDE, BooleanOp.ONLY_FIRST); private static final VoxelShape COMBINED_SHAPE = Shapes.join(BlockGratedChute.INPUT_MIDDLE_SHAPE, BlockGratedChute.INSIDE, BooleanOp.ONLY_FIRST);
private static final VoxelShape DOWN_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 0.0D, 6.0D, 10.0D, 4.0D, 10.0D)); private static final VoxelShape DOWN_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 0.0D, 6.0D, 10.0D, 4.0D, 10.0D));
private static final VoxelShape EAST_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(12.0D, 4.0D, 6.0D, 16.0D, 8.0D, 10.0D)); private static final VoxelShape EAST_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(12.0D, 4.0D, 6.0D, 16.0D, 8.0D, 10.0D));
private static final VoxelShape NORTH_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 4.0D, 0.0D, 10.0D, 8.0D, 4.0D)); private static final VoxelShape NORTH_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 4.0D, 0.0D, 10.0D, 8.0D, 4.0D));
private static final VoxelShape SOUTH_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 4.0D, 12.0D, 10.0D, 8.0D, 16.0D)); private static final VoxelShape SOUTH_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(6.0D, 4.0D, 12.0D, 10.0D, 8.0D, 16.0D));
private static final VoxelShape WEST_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(0.0D, 4.0D, 6.0D, 4.0D, 8.0D, 10.0D)); private static final VoxelShape WEST_SHAPE = Shapes.or(BlockGratedChute.COMBINED_SHAPE, Block.box(0.0D, 4.0D, 6.0D, 4.0D, 8.0D, 10.0D));
private static final VoxelShape DOWN_RAYTRACE_SHAPE = Hopper.INSIDE; private static final VoxelShape DOWN_RAYTRACE_SHAPE = BlockGratedChute.INSIDE;
private static final VoxelShape EAST_RAYTRACE_SHAPE = Shapes.or(Hopper.INSIDE, Block.box(12.0D, 8.0D, 6.0D, 16.0D, 10.0D, 10.0D)); private static final VoxelShape EAST_RAYTRACE_SHAPE = Shapes.or(BlockGratedChute.INSIDE, Block.box(12.0D, 8.0D, 6.0D, 16.0D, 10.0D, 10.0D));
private static final VoxelShape NORTH_RAYTRACE_SHAPE = Shapes.or(Hopper.INSIDE, Block.box(6.0D, 8.0D, 0.0D, 10.0D, 10.0D, 4.0D)); private static final VoxelShape NORTH_RAYTRACE_SHAPE = Shapes.or(BlockGratedChute.INSIDE, Block.box(6.0D, 8.0D, 0.0D, 10.0D, 10.0D, 4.0D));
private static final VoxelShape SOUTH_RAYTRACE_SHAPE = Shapes.or(Hopper.INSIDE, Block.box(6.0D, 8.0D, 12.0D, 10.0D, 10.0D, 16.0D)); private static final VoxelShape SOUTH_RAYTRACE_SHAPE = Shapes.or(BlockGratedChute.INSIDE, Block.box(6.0D, 8.0D, 12.0D, 10.0D, 10.0D, 16.0D));
private static final VoxelShape WEST_RAYTRACE_SHAPE = Shapes.or(Hopper.INSIDE, Block.box(0.0D, 8.0D, 6.0D, 4.0D, 10.0D, 10.0D)); private static final VoxelShape WEST_RAYTRACE_SHAPE = Shapes.or(BlockGratedChute.INSIDE, Block.box(0.0D, 8.0D, 6.0D, 4.0D, 10.0D, 10.0D));
public BlockGratedChute() { public BlockGratedChute() {
super("grated_chute", BlockEntityGratedChute.class, Properties.of().strength(3.0F, 8.0F).sound(SoundType.METAL)); super("grated_chute", BlockEntityGratedChute.class, Properties.of().strength(3.0F, 8.0F).sound(SoundType.METAL));
@ -81,17 +79,16 @@ public class BlockGratedChute extends BlockContainerImpl implements ICustomBlock
case SOUTH -> BlockGratedChute.SOUTH_RAYTRACE_SHAPE; case SOUTH -> BlockGratedChute.SOUTH_RAYTRACE_SHAPE;
case WEST -> BlockGratedChute.WEST_RAYTRACE_SHAPE; case WEST -> BlockGratedChute.WEST_RAYTRACE_SHAPE;
case EAST -> BlockGratedChute.EAST_RAYTRACE_SHAPE; case EAST -> BlockGratedChute.EAST_RAYTRACE_SHAPE;
default -> Hopper.INSIDE; default -> BlockGratedChute.INSIDE;
}; };
} }
@Override @Override
@SuppressWarnings("deprecation") protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { var tile = level.getBlockEntity(pos);
var tile = levelIn.getBlockEntity(pos);
if (!(tile instanceof BlockEntityGratedChute chute)) if (!(tile instanceof BlockEntityGratedChute chute))
return InteractionResult.FAIL; return InteractionResult.FAIL;
if (!levelIn.isClientSide) { if (!level.isClientSide) {
chute.isBlacklist = !chute.isBlacklist; chute.isBlacklist = !chute.isBlacklist;
chute.sendToClients(); chute.sendToClients();
} }

View file

@ -4,7 +4,6 @@ import de.ellpeck.naturesaura.blocks.tiles.BlockEntityItemDistributor;
import de.ellpeck.naturesaura.data.BlockStateGenerator; import de.ellpeck.naturesaura.data.BlockStateGenerator;
import de.ellpeck.naturesaura.reg.ICustomBlockState; import de.ellpeck.naturesaura.reg.ICustomBlockState;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
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.level.Level; import net.minecraft.world.level.Level;
@ -19,14 +18,13 @@ public class BlockItemDistributor extends BlockContainerImpl implements ICustomB
} }
@Override @Override
@SuppressWarnings("deprecation") protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) {
if (!player.isShiftKeyDown()) if (!player.isShiftKeyDown())
return InteractionResult.FAIL; return InteractionResult.FAIL;
var tile = levelIn.getBlockEntity(pos); var tile = level.getBlockEntity(pos);
if (!(tile instanceof BlockEntityItemDistributor)) if (!(tile instanceof BlockEntityItemDistributor))
return InteractionResult.FAIL; return InteractionResult.FAIL;
if (!levelIn.isClientSide) { if (!level.isClientSide) {
var distributor = (BlockEntityItemDistributor) tile; var distributor = (BlockEntityItemDistributor) tile;
distributor.isRandomMode = !distributor.isRandomMode; distributor.isRandomMode = !distributor.isRandomMode;
distributor.sendToClients(); distributor.sendToClients();
@ -37,8 +35,9 @@ public class BlockItemDistributor extends BlockContainerImpl implements ICustomB
@Override @Override
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(),
generator.modLoc("block/" + this.getBaseName()), generator.modLoc("block/" + this.getBaseName()),
generator.modLoc("block/" + this.getBaseName() + "_bottom"), generator.modLoc("block/" + this.getBaseName() + "_bottom"),
generator.modLoc("block/" + this.getBaseName() + "_top"))); generator.modLoc("block/" + this.getBaseName() + "_top")));
} }
} }

View file

@ -10,8 +10,9 @@ import de.ellpeck.naturesaura.reg.ITESRProvider;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@ -41,9 +42,8 @@ public class BlockNatureAltar extends BlockContainerImpl implements ITESRProvide
} }
@Override @Override
@SuppressWarnings("deprecation") protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { return Helper.putStackOnTile(player, hand, pos, 0, true);
return Helper.putStackOnTile(player, handIn, pos, 0, true);
} }
@Override @Override

View file

@ -10,8 +10,9 @@ import de.ellpeck.naturesaura.reg.ITESRProvider;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter; 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;
@ -35,9 +36,8 @@ public class BlockOfferingTable extends BlockContainerImpl implements ITESRProvi
} }
@Override @Override
@SuppressWarnings("deprecation") protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { return Helper.putStackOnTile(player, hand, pos, 0, true);
return Helper.putStackOnTile(player, handIn, pos, 0, true);
} }
@Override @Override
@ -55,4 +55,5 @@ public class BlockOfferingTable extends BlockContainerImpl implements ITESRProvi
public void registerTESR() { public void registerTESR() {
BlockEntityRenderers.register(ModBlockEntities.OFFERING_TABLE, RenderOfferingTable::new); BlockEntityRenderers.register(ModBlockEntities.OFFERING_TABLE, RenderOfferingTable::new);
} }
} }

View file

@ -22,10 +22,9 @@ import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShape;
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.living.MobSpawnEvent; import net.neoforged.neoforge.event.entity.living.MobSpawnEvent;
import net.neoforged.bus.api.Event;
import net.neoforged.bus.api.SubscribeEvent;
public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable, ICustomBlockState { public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable, ICustomBlockState {
@ -69,10 +68,10 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
IAuraChunk.getAuraChunk(level, spot).drainAura(spot, amountToUse); IAuraChunk.getAuraChunk(level, spot).drainAura(spot, amountToUse);
PacketHandler.sendToAllAround(level, lampPos, 32, PacketHandler.sendToAllAround(level, lampPos, 32,
new PacketParticles(lampPos.getX(), lampPos.getY(), lampPos.getZ(), PacketParticles.Type.SPAWN_LAMP)); new PacketParticles(lampPos.getX(), lampPos.getY(), lampPos.getZ(), PacketParticles.Type.SPAWN_LAMP));
} }
event.setResult(Event.Result.DENY); event.setResult(MobSpawnEvent.PositionCheck.Result.FAIL);
break; break;
} }
} }
@ -105,4 +104,5 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable,
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
generator.simpleBlock(this, generator.models().getExistingFile(generator.modLoc(this.getBaseName()))); generator.simpleBlock(this, generator.models().getExistingFile(generator.modLoc(this.getBaseName())));
} }
} }

View file

@ -8,14 +8,12 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.StairBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import java.util.function.Supplier;
public class BlockStairsNA extends StairBlock implements IModItem, ICustomBlockState { public class BlockStairsNA extends StairBlock implements IModItem, ICustomBlockState {
public final String textureName; public final String textureName;
private final String baseName; private final String baseName;
public BlockStairsNA(String baseName, String textureName, Supplier<BlockState> modelState, Block.Properties properties) { public BlockStairsNA(String baseName, String textureName, BlockState modelState, Block.Properties properties) {
super(modelState, properties.dynamicShape()); super(modelState, properties.dynamicShape());
this.baseName = baseName; this.baseName = baseName;
this.textureName = textureName; this.textureName = textureName;
@ -31,4 +29,5 @@ public class BlockStairsNA extends StairBlock implements IModItem, ICustomBlockS
public void generateCustomBlockState(BlockStateGenerator generator) { public void generateCustomBlockState(BlockStateGenerator generator) {
generator.stairsBlock(this, generator.modLoc("block/" + this.textureName)); generator.stairsBlock(this, generator.modLoc("block/" + this.textureName));
} }
} }

View file

@ -16,88 +16,88 @@ import net.minecraft.world.level.block.SaplingBlock;
public final class Multiblocks { public final class Multiblocks {
public static final IMultiblock ALTAR = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock ALTAR = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "altar"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "altar"),
new String[][]{ new String[][]{
{" M ", " ", " ", " ", "M M", " ", " ", " ", " M "}, {" M ", " ", " ", " ", "M M", " ", " ", " ", " M "},
{" B ", " ", " ", " ", "B B", " ", " ", " ", " B "}, {" B ", " ", " ", " ", "B B", " ", " ", " ", " B "},
{" B ", " ", " M M ", " ", "B 0 B", " ", " M M ", " ", " B "}, {" B ", " ", " M M ", " ", "B 0 B", " ", " M M ", " ", " B "},
{" ", " WBW ", " WBW ", " WWCWCWW ", " BBW WBB ", " WWCWCWW ", " WBW ", " WBW ", " "}}, {" ", " WBW ", " WBW ", " WWCWCWW ", " BBW WBB ", " WWCWCWW ", " WBW ", " WBW ", " "}},
'C', Matcher.tag(Blocks.CHISELED_STONE_BRICKS, BlockTagProvider.ALTAR_FANCY_BRICK), 'C', Matcher.tag(Blocks.CHISELED_STONE_BRICKS, BlockTagProvider.ALTAR_FANCY_BRICK),
'B', Matcher.tag(Blocks.STONE_BRICKS, BlockTagProvider.ALTAR_STONE), 'B', Matcher.tag(Blocks.STONE_BRICKS, BlockTagProvider.ALTAR_STONE),
'W', Matcher.tag(Blocks.OAK_PLANKS, BlockTagProvider.ALTAR_WOOD), 'W', Matcher.tag(Blocks.OAK_PLANKS, BlockTagProvider.ALTAR_WOOD),
'M', Matcher.tag(ModBlocks.GOLD_BRICK, BlockTagProvider.ALTAR_GOLD_BRICK), 'M', Matcher.tag(ModBlocks.GOLD_BRICK, BlockTagProvider.ALTAR_GOLD_BRICK),
'0', ModBlocks.NATURE_ALTAR, '0', ModBlocks.NATURE_ALTAR,
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock TREE_RITUAL = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock TREE_RITUAL = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "tree_ritual"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "tree_ritual"),
new String[][]{ new String[][]{
{" W ", " W W ", " GGG ", " GG GG ", "W G 0 G W", " GG GG ", " GGG ", " W W ", " W "}}, {" W ", " W W ", " GGG ", " GG GG ", "W G 0 G W", " GG GG ", " GGG ", " W W ", " W "}},
'W', new Matcher(ModBlocks.WOOD_STAND.defaultBlockState(), 'W', new Matcher(ModBlocks.WOOD_STAND.defaultBlockState(),
(level, start, offset, pos, state, c) -> level != null || state.getBlock() == ModBlocks.WOOD_STAND), (level, start, offset, pos, state, c) -> level != null || state.getBlock() == ModBlocks.WOOD_STAND),
'G', ModBlocks.GOLD_POWDER, 'G', ModBlocks.GOLD_POWDER,
'0', new Matcher(Blocks.OAK_SAPLING.defaultBlockState(), '0', new Matcher(Blocks.OAK_SAPLING.defaultBlockState(),
(level, start, offset, pos, state, c) -> { (level, start, offset, pos, state, c) -> {
if (state.getBlock() instanceof SaplingBlock || state.is(BlockTags.LOGS)) if (state.getBlock() instanceof SaplingBlock || state.is(BlockTags.LOGS))
return true; return true;
// try-catch to prevent blocks that need to have been placed crashing here // try-catch to prevent blocks that need to have been placed crashing here
try { try {
var stack = new ItemStack(state.getBlock()); var stack = new ItemStack(state.getBlock());
return !stack.isEmpty() && level.getRecipeManager().getRecipesFor(ModRecipes.TREE_RITUAL_TYPE, null, level).stream().anyMatch(r -> r.value().saplingType.test(stack)); return !stack.isEmpty() && level.getRecipeManager().getRecipesFor(ModRecipes.TREE_RITUAL_TYPE, null, level).stream().anyMatch(r -> r.value().saplingType.test(stack));
} catch (Exception e) { } catch (Exception e) {
return false; return false;
} }
} }
), ),
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock POTION_GENERATOR = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock POTION_GENERATOR = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "potion_generator"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "potion_generator"),
new String[][]{ new String[][]{
{"R R", " ", " ", " ", " ", " ", "R R"}, {"R R", " ", " ", " ", " ", " ", "R R"},
{"N N", " ", " ", " ", " ", " ", "N N"}, {"N N", " ", " ", " ", " ", " ", "N N"},
{"N N", " ", " ", " 0 ", " ", " ", "N N"}, {"N N", " ", " ", " 0 ", " ", " ", "N N"},
{" N N ", "NNN NNN", " NRRRN ", " R R ", " NRRRN ", "NNN NNN", " N N "}}, {" N N ", "NNN NNN", " NRRRN ", " R R ", " NRRRN ", "NNN NNN", " N N "}},
'N', Blocks.NETHER_BRICKS, 'N', Blocks.NETHER_BRICKS,
'R', Blocks.RED_NETHER_BRICKS, 'R', Blocks.RED_NETHER_BRICKS,
'0', ModBlocks.POTION_GENERATOR, '0', ModBlocks.POTION_GENERATOR,
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock OFFERING_TABLE = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock OFFERING_TABLE = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "offering_table"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "offering_table"),
new String[][]{ new String[][]{
{" RRRRR ", " R R ", "R RRR R", "R R R R", "R R 0 R R", "R R R R", "R RRR R", " R R ", " RRRRR "}}, {" RRRRR ", " R R ", "R RRR R", "R R R R", "R R 0 R R", "R R R R", "R RRR R", " R R ", " RRRRR "}},
'R', new Matcher(Blocks.POPPY.defaultBlockState(), 'R', new Matcher(Blocks.POPPY.defaultBlockState(),
(level, start, offset, pos, state, c) -> state.is(BlockTags.SMALL_FLOWERS)), (level, start, offset, pos, state, c) -> state.is(BlockTags.SMALL_FLOWERS)),
'0', ModBlocks.OFFERING_TABLE, '0', ModBlocks.OFFERING_TABLE,
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock ANIMAL_SPAWNER = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock ANIMAL_SPAWNER = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "animal_spawner"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "animal_spawner"),
new String[][]{ new String[][]{
{" ", " ", " ", " 0 ", " ", " ", " "}, {" ", " ", " ", " 0 ", " ", " ", " "},
{" HHH ", " HRRRH ", "HRWRWRH", "HRR RRH", "HRWRWRH", " HRRRH ", " HHH "}}, {" HHH ", " HRRRH ", "HRWRWRH", "HRR RRH", "HRWRWRH", " HRRRH ", " HHH "}},
'H', Blocks.HAY_BLOCK, 'H', Blocks.HAY_BLOCK,
'R', ModBlocks.INFUSED_BRICK, 'R', ModBlocks.INFUSED_BRICK,
'W', ModBlocks.ANCIENT_PLANKS, 'W', ModBlocks.ANCIENT_PLANKS,
'0', ModBlocks.ANIMAL_SPAWNER, '0', ModBlocks.ANIMAL_SPAWNER,
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock AUTO_CRAFTER = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock AUTO_CRAFTER = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "auto_crafter"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "auto_crafter"),
new String[][]{ new String[][]{
{"PPPPPPP", "PLPLPLP", "PPPPPPP", "PLP0PLP", "PPPPPPP", "PLPLPLP", "PPPPPPP"}}, {"PPPPPPP", "PLPLPLP", "PPPPPPP", "PLP0PLP", "PPPPPPP", "PLPLPLP", "PPPPPPP"}},
'P', ModBlocks.ANCIENT_PLANKS, 'P', ModBlocks.ANCIENT_PLANKS,
'L', ModBlocks.ANCIENT_LOG, 'L', ModBlocks.ANCIENT_LOG,
'0', ModBlocks.AUTO_CRAFTER, '0', ModBlocks.AUTO_CRAFTER,
' ', Matcher.any()); ' ', Matcher.any());
public static final IMultiblock RF_CONVERTER = NaturesAuraAPI.instance().createMultiblock( public static final IMultiblock RF_CONVERTER = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "rf_converter"), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "rf_converter"),
new String[][]{ new String[][]{
{" ", " ", " ", " R ", " ", " ", " "}, {" ", " ", " ", " R ", " ", " ", " "},
{" ", " R ", " ", " R R ", " ", " R ", " "}, {" ", " R ", " ", " R R ", " ", " R ", " "},
{" ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " "},
{" R ", " R R ", " ", "R 0 R", " ", " R R ", " R "}, {" R ", " R R ", " ", "R 0 R", " ", " R R ", " R "},
{" ", " ", " ", " ", " ", " ", " "}, {" ", " ", " ", " ", " ", " ", " "},
{" ", " R ", " ", " R R ", " ", " R ", " "}, {" ", " R ", " ", " R R ", " ", " R ", " "},
{" ", " ", " ", " R ", " ", " ", " "}}, {" ", " ", " ", " R ", " ", " ", " "}},
'R', Blocks.REDSTONE_BLOCK, 'R', Blocks.REDSTONE_BLOCK,
'0', ModBlocks.RF_CONVERTER, '0', ModBlocks.RF_CONVERTER,
' ', Matcher.any()); ' ', Matcher.any());
} }

View file

@ -3,6 +3,7 @@ package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.aura.container.NaturalAuraContainer; import de.ellpeck.naturesaura.api.aura.container.NaturalAuraContainer;
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.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -29,15 +30,15 @@ public class BlockEntityAncientLeaves extends BlockEntityImpl {
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
this.container.writeNBT(compound); this.container.writeNBT(compound);
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
this.container.readNBT(compound); this.container.readNBT(compound);
} }

View file

@ -10,6 +10,7 @@ import de.ellpeck.naturesaura.packet.PacketParticles;
import de.ellpeck.naturesaura.recipes.AnimalSpawnerRecipe; import de.ellpeck.naturesaura.recipes.AnimalSpawnerRecipe;
import de.ellpeck.naturesaura.recipes.ModRecipes; import de.ellpeck.naturesaura.recipes.ModRecipes;
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.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -21,7 +22,6 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickableBlockEntity { public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickableBlockEntity {
@ -69,7 +69,7 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
} }
} else { } else {
var items = this.level.getEntitiesOfClass(ItemEntity.class, var items = this.level.getEntitiesOfClass(ItemEntity.class,
new AABB(this.worldPosition).inflate(2)); new AABB(this.worldPosition).inflate(2));
for (var recipe : this.level.getRecipeManager().getRecipesFor(ModRecipes.ANIMAL_SPAWNER_TYPE, null, this.level)) { for (var recipe : this.level.getRecipeManager().getRecipesFor(ModRecipes.ANIMAL_SPAWNER_TYPE, null, this.level)) {
if (recipe.value().ingredients.size() != items.size()) if (recipe.value().ingredients.size() != items.size())
@ -94,7 +94,7 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
for (var item : items) { for (var item : items) {
item.remove(Entity.RemovalReason.KILLED); item.remove(Entity.RemovalReason.KILLED);
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER)); new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER));
} }
this.currentRecipe = recipe; this.currentRecipe = recipe;
@ -113,15 +113,15 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
} }
NaturesAuraAPI.instance().spawnParticleStream( NaturesAuraAPI.instance().spawnParticleStream(
this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F, this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F,
this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F, this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F,
this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F, this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F,
this.worldPosition.getX() + this.level.random.nextFloat(), this.worldPosition.getX() + this.level.random.nextFloat(),
this.worldPosition.getY() + this.level.random.nextFloat(), this.worldPosition.getY() + this.level.random.nextFloat(),
this.worldPosition.getZ() + this.level.random.nextFloat(), this.worldPosition.getZ() + this.level.random.nextFloat(),
this.level.random.nextFloat() * 0.07F + 0.07F, this.level.random.nextFloat() * 0.07F + 0.07F,
IAuraType.forLevel(this.level).getColor(), IAuraType.forLevel(this.level).getColor(),
this.level.random.nextFloat() + 0.5F); this.level.random.nextFloat() + 0.5F);
if (this.entityClient == null) { if (this.entityClient == null) {
this.entityClient = this.currentRecipe.value().makeEntity(this.level, BlockPos.ZERO); this.entityClient = this.currentRecipe.value().makeEntity(this.level, BlockPos.ZERO);
@ -130,16 +130,16 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
var bounds = this.entityClient.getBoundingBox(); var bounds = this.entityClient.getBoundingBox();
for (var i = this.level.random.nextInt(5) + 5; i >= 0; i--) for (var i = this.level.random.nextInt(5) + 5; i >= 0; i--)
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
bounds.minX + this.level.random.nextFloat() * (bounds.maxX - bounds.minX), bounds.minX + this.level.random.nextFloat() * (bounds.maxX - bounds.minX),
bounds.minY + this.level.random.nextFloat() * (bounds.maxY - bounds.minY), bounds.minY + this.level.random.nextFloat() * (bounds.maxY - bounds.minY),
bounds.minZ + this.level.random.nextFloat() * (bounds.maxZ - bounds.minZ), bounds.minZ + this.level.random.nextFloat() * (bounds.maxZ - bounds.minZ),
0F, 0F, 0F, 0x2fd8d3, 2F, 60, 0F, false, true); 0F, 0F, 0F, 0x2fd8d3, 2F, 60, 0F, false, true);
} }
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (this.currentRecipe != null) { if (this.currentRecipe != null) {
compound.putString("recipe", this.currentRecipe.id().toString()); compound.putString("recipe", this.currentRecipe.id().toString());
@ -152,12 +152,12 @@ public class BlockEntityAnimalSpawner extends BlockEntityImpl implements ITickab
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (compound.contains("recipe")) { if (compound.contains("recipe")) {
if (this.hasLevel()) { if (this.hasLevel()) {
var name = new ResourceLocation(compound.getString("recipe")); var name = ResourceLocation.parse(compound.getString("recipe"));
this.currentRecipe = (RecipeHolder<AnimalSpawnerRecipe>) this.level.getRecipeManager().byKey(name).orElse(null); this.currentRecipe = (RecipeHolder<AnimalSpawnerRecipe>) this.level.getRecipeManager().byKey(name).orElse(null);
} }
this.spawnX = compound.getDouble("spawn_x"); this.spawnX = compound.getDouble("spawn_x");

View file

@ -1,6 +1,7 @@
package de.ellpeck.naturesaura.blocks.tiles; package de.ellpeck.naturesaura.blocks.tiles;
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.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -27,15 +28,15 @@ public class BlockEntityAuraBloom extends BlockEntityImpl implements ITickableBl
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) if (type == SaveType.TILE)
compound.putBoolean("just_generated", this.justGenerated); compound.putBoolean("just_generated", this.justGenerated);
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) if (type == SaveType.TILE)
this.justGenerated = compound.getBoolean("just_generated"); this.justGenerated = compound.getBoolean("just_generated");
} }

View file

@ -8,6 +8,7 @@ import de.ellpeck.naturesaura.items.ModItems;
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.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -18,9 +19,9 @@ import java.util.Map;
public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBlockEntity { public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBlockEntity {
private static final Map<IAuraType, Integer> TIMES = ImmutableMap.<IAuraType, Integer>builder() private static final Map<IAuraType, Integer> TIMES = ImmutableMap.<IAuraType, Integer>builder()
.put(NaturesAuraAPI.TYPE_OVERWORLD, 20) .put(NaturesAuraAPI.TYPE_OVERWORLD, 20)
.put(NaturesAuraAPI.TYPE_NETHER, 20 * 60) .put(NaturesAuraAPI.TYPE_NETHER, 20 * 60)
.put(NaturesAuraAPI.TYPE_END, 20 * 60 * 60).build(); .put(NaturesAuraAPI.TYPE_END, 20 * 60 * 60).build();
public final ItemStackHandlerNA itemHandler = new ItemStackHandlerNA(1, this, true) { public final ItemStackHandlerNA itemHandler = new ItemStackHandlerNA(1, this, true) {
@Override @Override
protected boolean canInsert(ItemStack stack, int slot) { protected boolean canInsert(ItemStack stack, int slot) {
@ -56,10 +57,10 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
if (this.level.getGameTime() % 8 == 0) { if (this.level.getGameTime() % 8 == 0) {
var color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor(); var color = ItemAuraBottle.getType(this.itemHandler.getStackInSlot(0)).getColor();
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.worldPosition.getX() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, this.worldPosition.getX() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F,
this.worldPosition.getY() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, this.worldPosition.getY() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F,
this.worldPosition.getZ() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F, this.worldPosition.getZ() + 1 / 16F + this.level.random.nextFloat() * 14 / 16F,
0, 0, 0, color, 1, 80 + this.level.random.nextInt(50), 0, false, true); 0, 0, 0, color, 1, 80 + this.level.random.nextInt(50), 0, false, true);
} }
return; return;
} }
@ -98,20 +99,21 @@ public class BlockEntityAuraTimer extends BlockEntityImpl implements ITickableBl
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
compound.put("items", this.itemHandler.serializeNBT()); compound.put("items", this.itemHandler.serializeNBT(registries));
compound.putInt("timer", this.timer); compound.putInt("timer", this.timer);
} }
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.itemHandler.deserializeNBT(compound.getCompound("items")); this.itemHandler.deserializeNBT(registries, compound.getCompound("items"));
this.timer = compound.getInt("timer"); this.timer = compound.getInt("timer");
} }
} }
} }

View file

@ -49,26 +49,26 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
var topPos = middlePos.relative(facing, 2); var topPos = middlePos.relative(facing, 2);
var bottomPos = middlePos.relative(facing.getOpposite(), 2); var bottomPos = middlePos.relative(facing.getOpposite(), 2);
var poses = new BlockPos[]{ var poses = new BlockPos[]{
topPos.relative(facing.getCounterClockWise(), 2), topPos.relative(facing.getCounterClockWise(), 2),
topPos, topPos,
topPos.relative(facing.getClockWise(), 2), topPos.relative(facing.getClockWise(), 2),
middlePos.relative(facing.getCounterClockWise(), 2), middlePos.relative(facing.getCounterClockWise(), 2),
middlePos, middlePos,
middlePos.relative(facing.getClockWise(), 2), middlePos.relative(facing.getClockWise(), 2),
bottomPos.relative(facing.getCounterClockWise(), 2), bottomPos.relative(facing.getCounterClockWise(), 2),
bottomPos, bottomPos,
bottomPos.relative(facing.getClockWise(), 2) bottomPos.relative(facing.getClockWise(), 2)
}; };
var items = new ItemEntity[9]; var items = new ItemEntity[9];
for (var i = 0; i < poses.length; i++) { for (var i = 0; i < poses.length; i++) {
var entities = this.level.getEntitiesOfClass( var entities = this.level.getEntitiesOfClass(
ItemEntity.class, new AABB(poses[i]).inflate(0.25), EntitySelector.ENTITY_STILL_ALIVE); ItemEntity.class, new AABB(poses[i]).inflate(0.25), EntitySelector.ENTITY_STILL_ALIVE);
if (entities.size() > 1) if (entities.size() > 1)
return; return;
if (entities.isEmpty()) if (entities.isEmpty())
continue; continue;
var entity = entities.get(0); var entity = entities.getFirst();
if (entity.hasPickUpDelay()) if (entity.hasPickUpDelay())
return; return;
var stack = entity.getItem(); var stack = entity.getItem();
@ -78,19 +78,19 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
this.crafting.setItem(i, stack.copy()); this.crafting.setItem(i, stack.copy());
} }
var recipe = this.level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, this.crafting, this.level).orElse(null); var recipe = this.level.getRecipeManager().getRecipeFor(RecipeType.CRAFTING, this.crafting.asCraftInput(), this.level).orElse(null);
if (recipe == null) if (recipe == null)
return; return;
var result = recipe.value().assemble(this.crafting, this.level.registryAccess()); var result = recipe.value().assemble(this.crafting.asCraftInput(), this.level.registryAccess());
if (result.isEmpty()) if (result.isEmpty())
return; return;
var resultItem = new ItemEntity(this.level, var resultItem = new ItemEntity(this.level,
this.worldPosition.getX() + 0.5F, this.worldPosition.getY() - 0.35F, this.worldPosition.getZ() + 0.5F, result.copy()); this.worldPosition.getX() + 0.5F, this.worldPosition.getY() - 0.35F, this.worldPosition.getZ() + 0.5F, result.copy());
resultItem.setDeltaMovement(0, 0, 0); resultItem.setDeltaMovement(0, 0, 0);
this.level.addFreshEntity(resultItem); this.level.addFreshEntity(resultItem);
var remainingItems = recipe.value().getRemainingItems(this.crafting); var remainingItems = recipe.value().getRemainingItems(this.crafting.asCraftInput());
for (var i = 0; i < items.length; i++) { for (var i = 0; i < items.length; i++) {
var item = items[i]; var item = items[i];
if (item == null) if (item == null)
@ -111,8 +111,9 @@ public class BlockEntityAutoCrafter extends BlockEntityImpl implements ITickable
} }
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER)); new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.ANIMAL_SPAWNER));
} }
} }
} }
} }

View file

@ -8,6 +8,7 @@ import net.minecraft.core.Direction;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.SingleRecipeInput;
import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity; import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.Capabilities;
@ -35,7 +36,8 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I
var below = this.level.getBlockEntity(this.worldPosition.below()); var below = this.level.getBlockEntity(this.worldPosition.below());
if (!(below instanceof BlastFurnaceBlockEntity tile)) if (!(below instanceof BlastFurnaceBlockEntity tile))
return; return;
Recipe<?> recipe = this.level.getRecipeManager().getRecipeFor(BlockEntityFurnaceHeater.getRecipeType(tile), tile, this.level).orElse(null).value(); var input = new SingleRecipeInput(tile.getItem(0));
Recipe<?> recipe = this.level.getRecipeManager().getRecipeFor(BlockEntityFurnaceHeater.getRecipeType(tile), input, this.level).orElse(null).value();
if (recipe == null) if (recipe == null)
return; return;
if (!this.isApplicable(recipe.getIngredients())) if (!this.isApplicable(recipe.getIngredients()))
@ -48,7 +50,7 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I
if (this.level.random.nextFloat() > 0.45F) { if (this.level.random.nextFloat() > 0.45F) {
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 0)); new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 0));
return; return;
} }
@ -67,7 +69,7 @@ public class BlockEntityBlastFurnaceBooster extends BlockEntityImpl implements I
IAuraChunk.getAuraChunk(this.level, pos).drainAura(pos, toUse); IAuraChunk.getAuraChunk(this.level, pos).drainAura(pos, toUse);
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 1)); new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.BLAST_FURNACE_BOOSTER, 1));
} }
private boolean isApplicable(List<Ingredient> ingredients) { private boolean isApplicable(List<Ingredient> ingredients) {

View file

@ -1,9 +1,11 @@
package de.ellpeck.naturesaura.blocks.tiles; package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.Helper;
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.core.Direction; import net.minecraft.core.Direction;
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.nbt.NbtUtils; import net.minecraft.nbt.NbtUtils;
@ -43,7 +45,7 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ())); PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.CHORUS_GENERATOR, pos.getX(), pos.getY(), pos.getZ()));
this.level.removeBlock(pos, false); this.level.removeBlock(pos, false);
this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5, this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5,
SoundEvents.CHORUS_FRUIT_TELEPORT, SoundSource.BLOCKS, 0.5F, 1F); SoundEvents.CHORUS_FRUIT_TELEPORT, SoundSource.BLOCKS, 0.5F, 1F);
this.generateAura(this.auraPerBlock); this.generateAura(this.auraPerBlock);
} }
@ -97,8 +99,8 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
var list = new ListTag(); var list = new ListTag();
for (var pos : this.currentlyBreaking) for (var pos : this.currentlyBreaking)
@ -109,14 +111,15 @@ public class BlockEntityChorusGenerator extends BlockEntityImpl implements ITick
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
this.currentlyBreaking.clear(); this.currentlyBreaking.clear();
var list = compound.getList("breaking", 10); var list = compound.getList("breaking", ListTag.TAG_INT_ARRAY);
for (var i = 0; i < list.size(); i++) for (var tag : list)
this.currentlyBreaking.add(NbtUtils.readBlockPos(list.getCompound(i))); this.currentlyBreaking.add(Helper.readBlockPos(tag));
this.auraPerBlock = compound.getInt("aura"); this.auraPerBlock = compound.getInt("aura");
} }
} }
} }

View file

@ -3,6 +3,7 @@ package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
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.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -108,15 +109,15 @@ public class BlockEntityChunkLoader extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) if (type == SaveType.TILE)
compound.putLongArray("forced_chunks", this.forcedChunks.stream().map(ChunkPos::toLong).collect(Collectors.toList())); compound.putLongArray("forced_chunks", this.forcedChunks.stream().map(ChunkPos::toLong).collect(Collectors.toList()));
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
this.forcedChunks.clear(); this.forcedChunks.clear();

View file

@ -5,6 +5,7 @@ import de.ellpeck.naturesaura.api.aura.container.BasicAuraContainer;
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.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
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;
@ -94,8 +95,8 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.container.writeNBT(compound); this.container.writeNBT(compound);
compound.putBoolean("drain_mode", this.isDrainMode); compound.putBoolean("drain_mode", this.isDrainMode);
@ -103,8 +104,8 @@ public class BlockEntityEndFlower extends BlockEntityImpl implements ITickableBl
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.container.readNBT(compound); this.container.readNBT(compound);
this.isDrainMode = compound.getBoolean("drain_mode"); this.isDrainMode = compound.getBoolean("drain_mode");

View file

@ -8,6 +8,7 @@ import de.ellpeck.naturesaura.gui.ContainerEnderCrate;
import de.ellpeck.naturesaura.gui.ModContainers; import de.ellpeck.naturesaura.gui.ModContainers;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
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.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
@ -110,8 +111,8 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements MenuProvid
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (this.name != null) if (this.name != null)
compound.putString("name", this.name); compound.putString("name", this.name);
@ -119,8 +120,8 @@ public class BlockEntityEnderCrate extends BlockEntityImpl implements MenuProvid
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (compound.contains("name")) if (compound.contains("name"))
this.name = compound.getString("name"); this.name = compound.getString("name");

View file

@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticleStream; import de.ellpeck.naturesaura.packet.PacketParticleStream;
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.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -175,8 +176,8 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (this.connectionOffset != null) if (this.connectionOffset != null)
compound.putLong("connection", this.connectionOffset.asLong()); compound.putLong("connection", this.connectionOffset.asLong());
@ -189,8 +190,8 @@ public class BlockEntityFieldCreator extends BlockEntityImpl implements ITickabl
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
if (compound.contains("connection")) if (compound.contains("connection"))
this.connectionOffset = BlockPos.of(compound.getLong("connection")); this.connectionOffset = BlockPos.of(compound.getLong("connection"));

View file

@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticleStream; import de.ellpeck.naturesaura.packet.PacketParticleStream;
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.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
@ -96,8 +97,8 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.SYNC && !this.consumedRecently.isEmpty()) { if (type != SaveType.SYNC && !this.consumedRecently.isEmpty()) {
var list = new ListTag(); var list = new ListTag();
@ -115,14 +116,14 @@ public class BlockEntityFlowerGenerator extends BlockEntityImpl implements ITick
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.SYNC) { if (type != SaveType.SYNC) {
this.consumedRecently.clear(); this.consumedRecently.clear();
var list = compound.getList("consumed_recently", 10); var list = compound.getList("consumed_recently", 10);
for (var base : list) { for (var base : list) {
var tag = (CompoundTag) base; var tag = (CompoundTag) base;
var block = BuiltInRegistries.BLOCK.get(new ResourceLocation(tag.getString("block"))); var block = BuiltInRegistries.BLOCK.get(ResourceLocation.parse(tag.getString("block")));
if (block != null) if (block != null)
this.consumedRecently.put(block.defaultBlockState(), new MutableInt(tag.getInt("amount"))); this.consumedRecently.put(block.defaultBlockState(), new MutableInt(tag.getInt("amount")));
} }

View file

@ -8,11 +8,13 @@ import de.ellpeck.naturesaura.blocks.BlockFurnaceHeater;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticleStream; import de.ellpeck.naturesaura.packet.PacketParticleStream;
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.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.inventory.ContainerData; import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.item.crafting.AbstractCookingRecipe; import net.minecraft.world.item.crafting.AbstractCookingRecipe;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.SingleRecipeInput;
import net.minecraft.world.level.block.AbstractFurnaceBlock; import net.minecraft.world.level.block.AbstractFurnaceBlock;
import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity;
import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity; import net.minecraft.world.level.block.entity.BlastFurnaceBlockEntity;
@ -77,13 +79,13 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
if (this.level.getGameTime() % 15 == 0) { if (this.level.getGameTime() % 15 == 0) {
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream( PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream(
this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F, this.worldPosition.getX() + (float) this.level.random.nextGaussian() * 5F,
this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F, this.worldPosition.getY() + 1 + this.level.random.nextFloat() * 5F,
this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F, this.worldPosition.getZ() + (float) this.level.random.nextGaussian() * 5F,
tilePos.getX() + this.level.random.nextFloat(), tilePos.getX() + this.level.random.nextFloat(),
tilePos.getY() + this.level.random.nextFloat(), tilePos.getY() + this.level.random.nextFloat(),
tilePos.getZ() + this.level.random.nextFloat(), tilePos.getZ() + this.level.random.nextFloat(),
this.level.random.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.random.nextFloat() + 0.5F this.level.random.nextFloat() * 0.07F + 0.07F, IAuraType.forLevel(this.level).getColor(), this.level.random.nextFloat() + 0.5F
)); ));
} }
} }
@ -102,7 +104,7 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
var input = furnace.getItem(0); var input = furnace.getItem(0);
if (!input.isEmpty()) { if (!input.isEmpty()) {
var recipe = this.level.getRecipeManager().getRecipeFor(BlockEntityFurnaceHeater.getRecipeType(furnace), furnace, this.level).orElse(null); var recipe = this.level.getRecipeManager().getRecipeFor(BlockEntityFurnaceHeater.getRecipeType(furnace), new SingleRecipeInput(input), this.level).orElse(null);
if (recipe == null) if (recipe == null)
return false; return false;
var output = recipe.value().getResultItem(this.level.registryAccess()); var output = recipe.value().getResultItem(this.level.registryAccess());
@ -113,16 +115,16 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.SYNC) if (type == SaveType.SYNC)
compound.putBoolean("active", this.isActive); compound.putBoolean("active", this.isActive);
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.SYNC) if (type == SaveType.SYNC)
this.isActive = compound.getBoolean("active"); this.isActive = compound.getBoolean("active");
@ -132,4 +134,5 @@ public class BlockEntityFurnaceHeater extends BlockEntityImpl implements ITickab
public boolean allowsLowerLimiter() { public boolean allowsLowerLimiter() {
return true; return true;
} }
} }

View file

@ -4,6 +4,7 @@ import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.blocks.BlockGratedChute; import de.ellpeck.naturesaura.blocks.BlockGratedChute;
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.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -64,8 +65,8 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
pull: pull:
if (curr.isEmpty() || curr.getCount() < curr.getMaxStackSize()) { if (curr.isEmpty() || curr.getCount() < curr.getMaxStackSize()) {
var items = this.level.getEntitiesOfClass(ItemEntity.class, new AABB( var items = this.level.getEntitiesOfClass(ItemEntity.class, new AABB(
this.worldPosition.getX(), this.worldPosition.getY() + 0.5, this.worldPosition.getZ(), this.worldPosition.getX(), this.worldPosition.getY() + 0.5, this.worldPosition.getZ(),
this.worldPosition.getX() + 1, this.worldPosition.getY() + 2, this.worldPosition.getZ() + 1)); this.worldPosition.getX() + 1, this.worldPosition.getY() + 2, this.worldPosition.getZ() + 1));
for (var item : items) { for (var item : items) {
if (!item.isAlive()) if (!item.isAlive())
continue; continue;
@ -119,24 +120,23 @@ public class BlockEntityGratedChute extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
compound.putInt("cooldown", this.cooldown); compound.putInt("cooldown", this.cooldown);
compound.put("items", this.items.serializeNBT()); compound.put("items", this.items.serializeNBT(registries));
compound.putBoolean("blacklist", this.isBlacklist); compound.putBoolean("blacklist", this.isBlacklist);
} }
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.cooldown = compound.getInt("cooldown"); this.cooldown = compound.getInt("cooldown");
this.items.deserializeNBT(compound.getCompound("items")); this.items.deserializeNBT(registries, compound.getCompound("items"));
this.isBlacklist = compound.getBoolean("blacklist"); this.isBlacklist = compound.getBoolean("blacklist");
} }
} }
} }

View file

@ -4,6 +4,7 @@ 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.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;
@ -25,25 +26,25 @@ public class BlockEntityImpl extends BlockEntity {
} }
@Override @Override
public void saveAdditional(CompoundTag compound) { public void saveAdditional(CompoundTag compound, HolderLookup.Provider registries) {
this.writeNBT(compound, SaveType.TILE); this.writeNBT(compound, SaveType.TILE, registries);
} }
@Override @Override
public void load(CompoundTag compound) { protected void loadAdditional(CompoundTag tag, HolderLookup.Provider registries) {
this.readNBT(compound, SaveType.TILE); this.readNBT(tag, SaveType.TILE, registries);
} }
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
super.saveAdditional(compound); super.saveAdditional(compound, registries);
compound.putInt("redstone", this.redstonePower); compound.putInt("redstone", this.redstonePower);
} }
} }
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
super.load(compound); super.loadWithComponents(compound, registries);
this.redstonePower = compound.getInt("redstone"); this.redstonePower = compound.getInt("redstone");
} }
} }
@ -54,29 +55,28 @@ public class BlockEntityImpl extends BlockEntity {
@Override @Override
public final ClientboundBlockEntityDataPacket getUpdatePacket() { public final ClientboundBlockEntityDataPacket getUpdatePacket() {
return ClientboundBlockEntityDataPacket.create(this, e -> { return ClientboundBlockEntityDataPacket.create(this, (e, r) -> {
var compound = new CompoundTag(); var compound = new CompoundTag();
this.writeNBT(compound, SaveType.SYNC); this.writeNBT(compound, SaveType.SYNC, r);
return compound; return compound;
}); });
} }
@Override @Override
public final CompoundTag getUpdateTag() { public final CompoundTag getUpdateTag(HolderLookup.Provider registries) {
var compound = new CompoundTag(); var compound = new CompoundTag();
this.writeNBT(compound, SaveType.SYNC); this.writeNBT(compound, SaveType.SYNC, registries);
return compound; return compound;
} }
@Override @Override
public void handleUpdateTag(CompoundTag tag) { public void handleUpdateTag(CompoundTag tag, HolderLookup.Provider registries) {
this.readNBT(tag, SaveType.SYNC); this.readNBT(tag, SaveType.SYNC, registries);
} }
@Override @Override
public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) { public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider registries) {
super.onDataPacket(net, pkt); this.readNBT(pkt.getTag(), SaveType.SYNC, registries);
this.readNBT(pkt.getTag(), SaveType.SYNC);
} }
public void sendToClients() { public void sendToClients() {
@ -102,7 +102,7 @@ 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.writeNBT(compound, SaveType.BLOCK, this.getLevel().registryAccess());
if (!compound.isEmpty()) { if (!compound.isEmpty()) {
if (!regularItem.hasTag()) if (!regularItem.hasTag())
regularItem.setTag(new CompoundTag()); regularItem.setTag(new CompoundTag());
@ -114,7 +114,7 @@ public class BlockEntityImpl extends BlockEntity {
if (stack.hasTag()) { if (stack.hasTag()) {
var compound = stack.getTag().getCompound("data"); var compound = stack.getTag().getCompound("data");
if (compound != null) if (compound != null)
this.readNBT(compound, SaveType.BLOCK); this.readNBT(compound, SaveType.BLOCK, this.level.registryAccess());
} }
} }

View file

@ -2,6 +2,7 @@ package de.ellpeck.naturesaura.blocks.tiles;
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.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -83,8 +84,8 @@ public class BlockEntityItemDistributor extends BlockEntityImpl implements ITick
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
compound.putInt("cooldown", this.cooldown); compound.putInt("cooldown", this.cooldown);
compound.putInt("side", this.currentSide.ordinal()); compound.putInt("side", this.currentSide.ordinal());
@ -94,8 +95,8 @@ public class BlockEntityItemDistributor extends BlockEntityImpl implements ITick
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
this.cooldown = compound.getInt("cooldown"); this.cooldown = compound.getInt("cooldown");
this.currentSide = Direction.values()[compound.getInt("side")]; this.currentSide = Direction.values()[compound.getInt("side")];

View file

@ -3,7 +3,6 @@ package de.ellpeck.naturesaura.blocks.tiles;
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.container.BasicAuraContainer; import de.ellpeck.naturesaura.api.aura.container.BasicAuraContainer;
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.blocks.multi.Multiblocks; import de.ellpeck.naturesaura.blocks.multi.Multiblocks;
import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketHandler;
@ -12,7 +11,7 @@ import de.ellpeck.naturesaura.packet.PacketParticles;
import de.ellpeck.naturesaura.recipes.AltarRecipe; import de.ellpeck.naturesaura.recipes.AltarRecipe;
import de.ellpeck.naturesaura.recipes.ModRecipes; import de.ellpeck.naturesaura.recipes.ModRecipes;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder; import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
@ -24,7 +23,6 @@ import net.minecraft.world.item.crafting.RecipeHolder;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
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.neoforge.items.IItemHandlerModifiable;
import net.neoforged.neoforge.items.ItemStackHandler; import net.neoforged.neoforge.items.ItemStackHandler;
public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickableBlockEntity { public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickableBlockEntity {
@ -110,11 +108,11 @@ public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickable
if (this.level.getGameTime() % 3 == 0) if (this.level.getGameTime() % 3 == 0)
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream( PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream(
this.worldPosition.getX() + (float) rand.nextGaussian() * 10F, this.worldPosition.getX() + (float) rand.nextGaussian() * 10F,
this.worldPosition.getY() + rand.nextFloat() * 10F, this.worldPosition.getY() + rand.nextFloat() * 10F,
this.worldPosition.getZ() + (float) rand.nextGaussian() * 10F, this.worldPosition.getZ() + (float) rand.nextGaussian() * 10F,
this.worldPosition.getX() + 0.5F, this.worldPosition.getY() + 0.5F, this.worldPosition.getZ() + 0.5F, this.worldPosition.getX() + 0.5F, this.worldPosition.getY() + 0.5F, this.worldPosition.getZ() + 0.5F,
rand.nextFloat() * 0.1F + 0.1F, this.container.getAuraColor(), rand.nextFloat() + 1F rand.nextFloat() * 0.1F + 0.1F, this.container.getAuraColor(), rand.nextFloat() + 1F
)); ));
} }
} }
@ -173,23 +171,23 @@ public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickable
var fourths = this.container.getMaxAura() / 4; var fourths = this.container.getMaxAura() / 4;
if (this.container.getStoredAura() > 0) { if (this.container.getStoredAura() > 0) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.worldPosition.getX() - 4F + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + rand.nextFloat(), this.worldPosition.getX() - 4F + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + rand.nextFloat(),
0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true); 0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true);
} }
if (this.container.getStoredAura() >= fourths) { if (this.container.getStoredAura() >= fourths) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.worldPosition.getX() + 4F + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + rand.nextFloat(), this.worldPosition.getX() + 4F + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + rand.nextFloat(),
0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true); 0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true);
} }
if (this.container.getStoredAura() >= fourths * 2) { if (this.container.getStoredAura() >= fourths * 2) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.worldPosition.getX() + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() - 4F + rand.nextFloat(), this.worldPosition.getX() + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() - 4F + rand.nextFloat(),
0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true); 0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true);
} }
if (this.container.getStoredAura() >= fourths * 3) { if (this.container.getStoredAura() >= fourths * 3) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.worldPosition.getX() + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + 4F + rand.nextFloat(), this.worldPosition.getX() + rand.nextFloat(), this.worldPosition.getY() + 3F, this.worldPosition.getZ() + 4F + rand.nextFloat(),
0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true); 0F, 0F, 0F, this.container.getAuraColor(), rand.nextFloat() * 3F + 1F, rand.nextInt(100) + 50, -0.05F, true, true);
} }
} }
@ -215,10 +213,10 @@ public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
compound.put("items", this.items.serializeNBT()); compound.put("items", this.items.serializeNBT(registries));
compound.putBoolean("complete", this.isComplete); compound.putBoolean("complete", this.isComplete);
this.container.writeNBT(compound); this.container.writeNBT(compound);
} }
@ -232,17 +230,17 @@ public class BlockEntityNatureAltar extends BlockEntityImpl implements ITickable
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.items.deserializeNBT(compound.getCompound("items")); this.items.deserializeNBT(registries, compound.getCompound("items"));
this.isComplete = compound.getBoolean("complete"); this.isComplete = compound.getBoolean("complete");
this.container.readNBT(compound); this.container.readNBT(compound);
} }
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
if (compound.contains("recipe")) { if (compound.contains("recipe")) {
if (this.hasLevel()) if (this.hasLevel())
this.currentRecipe = (RecipeHolder<AltarRecipe>) this.level.getRecipeManager().byKey(new ResourceLocation(compound.getString("recipe"))).orElse(null); this.currentRecipe = (RecipeHolder<AltarRecipe>) this.level.getRecipeManager().byKey(ResourceLocation.parse(compound.getString("recipe"))).orElse(null);
this.timer = compound.getInt("timer"); this.timer = compound.getInt("timer");
} }
} }

View file

@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.packet.PacketParticles;
import de.ellpeck.naturesaura.recipes.ModRecipes; import de.ellpeck.naturesaura.recipes.ModRecipes;
import de.ellpeck.naturesaura.recipes.OfferingRecipe; import de.ellpeck.naturesaura.recipes.OfferingRecipe;
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.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
@ -92,8 +93,8 @@ public class BlockEntityOfferingTable extends BlockEntityImpl implements ITickab
lightningboltentity.moveTo(Vec3.atCenterOf(this.worldPosition)); lightningboltentity.moveTo(Vec3.atCenterOf(this.worldPosition));
this.level.addFreshEntity(lightningboltentity); this.level.addFreshEntity(lightningboltentity);
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles( PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles(
(float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.OFFERING_TABLE, (float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.OFFERING_TABLE,
this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ())); this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ()));
break; break;
} }
@ -105,31 +106,31 @@ public class BlockEntityOfferingTable extends BlockEntityImpl implements ITickab
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
compound.put("items", this.items.serializeNBT()); compound.put("items", this.items.serializeNBT(registries));
if (type != SaveType.SYNC) { if (type != SaveType.SYNC) {
var list = new ListTag(); var list = new ListTag();
for (var stack : this.itemsToSpawn) for (var stack : this.itemsToSpawn)
list.add(stack.save(new CompoundTag())); list.add(stack.save(registries, new CompoundTag()));
compound.put("items_to_spawn", list); compound.put("items_to_spawn", list);
} }
} }
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.items.deserializeNBT(compound.getCompound("items")); this.items.deserializeNBT(registries, compound.getCompound("items"));
if (type != SaveType.SYNC) { if (type != SaveType.SYNC) {
this.itemsToSpawn.clear(); this.itemsToSpawn.clear();
var list = compound.getList("items_to_spawn", 10); var list = compound.getList("items_to_spawn", 10);
for (var base : list) for (var base : list)
this.itemsToSpawn.add(ItemStack.of((CompoundTag) base)); this.itemsToSpawn.add(ItemStack.parseOptional(registries, (CompoundTag) base));
} }
} }
} }

View file

@ -2,6 +2,7 @@ package de.ellpeck.naturesaura.blocks.tiles;
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.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -14,15 +15,15 @@ public class BlockEntityProjectileGenerator extends BlockEntityImpl {
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
compound.putInt("next_side", this.nextSide.ordinal()); compound.putInt("next_side", this.nextSide.ordinal());
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
this.nextSide = Direction.values()[compound.getInt("next_side")]; this.nextSide = Direction.values()[compound.getInt("next_side")];
} }

View file

@ -7,6 +7,7 @@ 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.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -23,14 +24,14 @@ public class BlockEntityRFConverter extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
compound.putInt("energy", this.storage.getEnergyStored()); compound.putInt("energy", this.storage.getEnergyStored());
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
this.storage.setEnergy(compound.getInt("energy")); this.storage.setEnergy(compound.getInt("energy"));
} }

View file

@ -3,6 +3,7 @@ package de.ellpeck.naturesaura.blocks.tiles;
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.core.HolderLookup;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.monster.MagmaCube; import net.minecraft.world.entity.monster.MagmaCube;
import net.minecraft.world.entity.monster.Slime; import net.minecraft.world.entity.monster.Slime;
@ -52,8 +53,8 @@ public class BlockEntitySlimeSplitGenerator extends BlockEntityImpl implements I
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
compound.putInt("timer", this.generationTimer); compound.putInt("timer", this.generationTimer);
compound.putInt("amount", this.amountToRelease); compound.putInt("amount", this.amountToRelease);
@ -62,8 +63,8 @@ public class BlockEntitySlimeSplitGenerator extends BlockEntityImpl implements I
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
this.generationTimer = compound.getInt("timer"); this.generationTimer = compound.getInt("timer");
this.amountToRelease = compound.getInt("amount"); this.amountToRelease = compound.getInt("amount");

View file

@ -5,6 +5,7 @@ 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.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.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
@ -96,15 +97,15 @@ public class BlockEntitySnowCreator extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type == SaveType.TILE) if (type == SaveType.TILE)
compound.putInt("snowman_count", this.snowmanCount); compound.putInt("snowman_count", this.snowmanCount);
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type == SaveType.TILE) if (type == SaveType.TILE)
this.snowmanCount = compound.getInt("snowman_count"); this.snowmanCount = compound.getInt("snowman_count");
} }

View file

@ -6,6 +6,7 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.ModItems;
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.network.protocol.game.ClientboundSetTimePacket; import net.minecraft.network.protocol.game.ClientboundSetTimePacket;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
@ -106,15 +107,15 @@ public class BlockEntityTimeChanger extends BlockEntityImpl implements ITickable
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
compound.putLong("goal", this.goalTime); compound.putLong("goal", this.goalTime);
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
this.goalTime = compound.getLong("goal"); this.goalTime = compound.getLong("goal");
} }

View file

@ -5,6 +5,7 @@ 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.misc.WeatherType; import de.ellpeck.naturesaura.api.misc.WeatherType;
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.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -88,8 +89,8 @@ public class BlockEntityWeatherChanger extends BlockEntityImpl implements ITicka
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
compound.putInt("time", this.processTime); compound.putInt("time", this.processTime);
if (this.type != null) if (this.type != null)
@ -99,8 +100,8 @@ public class BlockEntityWeatherChanger extends BlockEntityImpl implements ITicka
} }
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) { if (type != SaveType.BLOCK) {
this.processTime = compound.getInt("time"); this.processTime = compound.getInt("time");
this.type = WeatherType.values()[compound.getInt("weather")]; this.type = WeatherType.values()[compound.getInt("weather")];

View file

@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.packet.PacketParticleStream;
import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.packet.PacketParticles;
import de.ellpeck.naturesaura.recipes.TreeRitualRecipe; import de.ellpeck.naturesaura.recipes.TreeRitualRecipe;
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.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
@ -61,18 +62,18 @@ public class BlockEntityWoodStand extends BlockEntityImpl implements ITickableBl
var tile = this.level.getBlockEntity(pos); var tile = this.level.getBlockEntity(pos);
if (tile instanceof BlockEntityWoodStand && !((BlockEntityWoodStand) tile).items.getStackInSlot(0).isEmpty()) { if (tile instanceof BlockEntityWoodStand && !((BlockEntityWoodStand) tile).items.getStackInSlot(0).isEmpty()) {
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream( PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticleStream(
(float) pos.getX() + 0.2F + this.level.random.nextFloat() * 0.6F, (float) pos.getX() + 0.2F + this.level.random.nextFloat() * 0.6F,
(float) pos.getY() + 0.85F, (float) pos.getY() + 0.85F,
(float) pos.getZ() + 0.2F + this.level.random.nextFloat() * 0.6F, (float) pos.getZ() + 0.2F + this.level.random.nextFloat() * 0.6F,
this.ritualPos.getX() + 0.5F, this.ritualPos.getY() + this.level.random.nextFloat() * 3F + 2F, this.ritualPos.getZ() + 0.5F, this.ritualPos.getX() + 0.5F, this.ritualPos.getY() + this.level.random.nextFloat() * 3F + 2F, this.ritualPos.getZ() + 0.5F,
this.level.random.nextFloat() * 0.04F + 0.04F, 0x89cc37, this.level.random.nextFloat() + 1F this.level.random.nextFloat() * 0.04F + 0.04F, 0x89cc37, this.level.random.nextFloat() + 1F
)); ));
} }
return true; return true;
}); });
PacketHandler.sendToAllAround(this.level, this.ritualPos, 32, PacketHandler.sendToAllAround(this.level, this.ritualPos, 32,
new PacketParticles(this.ritualPos.getX(), this.ritualPos.getY(), this.ritualPos.getZ(), PacketParticles.Type.TR_GOLD_POWDER)); new PacketParticles(this.ritualPos.getX(), this.ritualPos.getY(), this.ritualPos.getZ(), PacketParticles.Type.TR_GOLD_POWDER));
if (this.timer >= this.recipe.value().time) { if (this.timer >= this.recipe.value().time) {
Multiblocks.TREE_RITUAL.forEach(this.ritualPos, 'G', (pos, matcher) -> { Multiblocks.TREE_RITUAL.forEach(this.ritualPos, 'G', (pos, matcher) -> {
@ -82,14 +83,14 @@ public class BlockEntityWoodStand extends BlockEntityImpl implements ITickableBl
Helper.mineRecursively(this.level, this.ritualPos, this.ritualPos, ItemStack.EMPTY, 6, 32, s -> s.is(BlockTags.LOGS) || s.getBlock() instanceof LeavesBlock); Helper.mineRecursively(this.level, this.ritualPos, this.ritualPos, ItemStack.EMPTY, 6, 32, s -> s.is(BlockTags.LOGS) || s.getBlock() instanceof LeavesBlock);
var item = new ItemEntity(this.level, var item = new ItemEntity(this.level,
this.ritualPos.getX() + 0.5, this.ritualPos.getY() + 4.5, this.ritualPos.getZ() + 0.5, this.ritualPos.getX() + 0.5, this.ritualPos.getY() + 4.5, this.ritualPos.getZ() + 0.5,
this.recipe.value().output.copy()); this.recipe.value().output.copy());
this.level.addFreshEntity(item); this.level.addFreshEntity(item);
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.TR_SPAWN_RESULT)); new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.TR_SPAWN_RESULT));
this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5, this.level.playSound(null, this.worldPosition.getX() + 0.5, this.worldPosition.getY() + 0.5, this.worldPosition.getZ() + 0.5,
SoundEvents.ENDERMAN_TELEPORT, SoundSource.BLOCKS, 0.65F, 1F); SoundEvents.ENDERMAN_TELEPORT, SoundSource.BLOCKS, 0.65F, 1F);
this.ritualPos = null; this.ritualPos = null;
this.recipe = null; this.recipe = null;
@ -99,9 +100,9 @@ public class BlockEntityWoodStand extends BlockEntityImpl implements ITickableBl
var tile = this.level.getBlockEntity(pos); var tile = this.level.getBlockEntity(pos);
if (tile instanceof BlockEntityWoodStand stand && !stand.items.getStackInSlot(0).isEmpty()) { if (tile instanceof BlockEntityWoodStand stand && !stand.items.getStackInSlot(0).isEmpty()) {
PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, PacketHandler.sendToAllAround(this.level, this.worldPosition, 32,
new PacketParticles(stand.worldPosition.getX(), stand.worldPosition.getY(), stand.worldPosition.getZ(), PacketParticles.Type.TR_CONSUME_ITEM)); new PacketParticles(stand.worldPosition.getX(), stand.worldPosition.getY(), stand.worldPosition.getZ(), PacketParticles.Type.TR_CONSUME_ITEM));
this.level.playSound(null, stand.worldPosition.getX() + 0.5, stand.worldPosition.getY() + 0.5, stand.worldPosition.getZ() + 0.5, this.level.playSound(null, stand.worldPosition.getX() + 0.5, stand.worldPosition.getY() + 0.5, stand.worldPosition.getZ() + 0.5,
SoundEvents.WOOD_STEP, SoundSource.BLOCKS, 0.5F, 1F); SoundEvents.WOOD_STEP, SoundSource.BLOCKS, 0.5F, 1F);
stand.items.setStackInSlot(0, ItemStack.EMPTY); stand.items.setStackInSlot(0, ItemStack.EMPTY);
stand.sendToClients(); stand.sendToClients();
@ -154,10 +155,10 @@ public class BlockEntityWoodStand extends BlockEntityImpl implements ITickableBl
} }
@Override @Override
public void writeNBT(CompoundTag compound, SaveType type) { public void writeNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.writeNBT(compound, type); super.writeNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
compound.put("items", this.items.serializeNBT()); compound.put("items", this.items.serializeNBT(registries));
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
if (this.ritualPos != null && this.recipe != null) { if (this.ritualPos != null && this.recipe != null) {
@ -170,17 +171,17 @@ public class BlockEntityWoodStand extends BlockEntityImpl implements ITickableBl
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void readNBT(CompoundTag compound, SaveType type) { public void readNBT(CompoundTag compound, SaveType type, HolderLookup.Provider registries) {
super.readNBT(compound, type); super.readNBT(compound, type, registries);
if (type != SaveType.BLOCK) if (type != SaveType.BLOCK)
this.items.deserializeNBT(compound.getCompound("items")); this.items.deserializeNBT(registries, compound.getCompound("items"));
if (type == SaveType.TILE) { if (type == SaveType.TILE) {
if (compound.contains("recipe")) { if (compound.contains("recipe")) {
this.ritualPos = BlockPos.of(compound.getLong("ritual_pos")); this.ritualPos = BlockPos.of(compound.getLong("ritual_pos"));
this.timer = compound.getInt("timer"); this.timer = compound.getInt("timer");
if (this.hasLevel()) if (this.hasLevel())
this.recipe = (RecipeHolder<TreeRitualRecipe>) this.level.getRecipeManager().byKey(new ResourceLocation(compound.getString("recipe"))).orElse(null); this.recipe = (RecipeHolder<TreeRitualRecipe>) this.level.getRecipeManager().byKey(ResourceLocation.parse(compound.getString("recipe"))).orElse(null);
} }
} }
} }

View file

@ -16,11 +16,12 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.Capabilities;
public class RenderAuraTimer implements BlockEntityRenderer<BlockEntityAuraTimer> { public class RenderAuraTimer implements BlockEntityRenderer<BlockEntityAuraTimer> {
private static final ResourceLocation RES = new ResourceLocation(NaturesAura.MOD_ID, "textures/models/aura_timer_aura.png"); private static final ResourceLocation RES = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/models/aura_timer_aura.png");
private final AuraModel model = new AuraModel(); private final AuraModel model = new AuraModel();
public RenderAuraTimer(BlockEntityRendererProvider.Context context) { public RenderAuraTimer(BlockEntityRendererProvider.Context context) {
@ -41,7 +42,7 @@ public class RenderAuraTimer implements BlockEntityRenderer<BlockEntityAuraTimer
var r = (type.getColor() >> 16 & 255) / 255F; var r = (type.getColor() >> 16 & 255) / 255F;
var g = (type.getColor() >> 8 & 255) / 255F; var g = (type.getColor() >> 8 & 255) / 255F;
var b = (type.getColor() & 255) / 255F; var b = (type.getColor() & 255) / 255F;
this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(RenderAuraTimer.RES)), combinedLightIn, combinedOverlayIn, r, g, b, 0.75F); this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(RenderAuraTimer.RES)), combinedLightIn, combinedOverlayIn, FastColor.ARGB32.colorFromFloat(r, g, b, 0.75F));
stack.popPose(); stack.popPose();
} }
@ -59,8 +60,8 @@ public class RenderAuraTimer implements BlockEntityRenderer<BlockEntityAuraTimer
} }
@Override @Override
public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { public void renderToBuffer(PoseStack poseStack, VertexConsumer buffer, int packedLight, int packedOverlay, int color) {
this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); this.model.render(poseStack, buffer, packedLight, packedOverlay, color);
} }
} }

View file

@ -26,10 +26,10 @@ public class RenderEnderCrate implements BlockEntityRenderer<BlockEntityEnderCra
} }
private static void renderFace(Matrix4f p_173696_, VertexConsumer p_173697_, float p_173700_, float p_173701_) { private static void renderFace(Matrix4f p_173696_, VertexConsumer p_173697_, float p_173700_, float p_173701_) {
p_173697_.vertex(p_173696_, (float) 1 / 16F, p_173700_, (float) 15 / 16F).endVertex(); p_173697_.addVertex(p_173696_, (float) 1 / 16F, p_173700_, (float) 15 / 16F);
p_173697_.vertex(p_173696_, (float) 15 / 16F, p_173700_, (float) 15 / 16F).endVertex(); p_173697_.addVertex(p_173696_, (float) 15 / 16F, p_173700_, (float) 15 / 16F);
p_173697_.vertex(p_173696_, (float) 15 / 16F, p_173701_, (float) 1 / 16F).endVertex(); p_173697_.addVertex(p_173696_, (float) 15 / 16F, p_173701_, (float) 1 / 16F);
p_173697_.vertex(p_173696_, (float) 1 / 16F, p_173701_, (float) 1 / 16F).endVertex(); p_173697_.addVertex(p_173696_, (float) 1 / 16F, p_173701_, (float) 1 / 16F);
} }
private static float getOffsetUp() { private static float getOffsetUp() {
@ -39,4 +39,5 @@ public class RenderEnderCrate implements BlockEntityRenderer<BlockEntityEnderCra
private static RenderType renderType() { private static RenderType renderType() {
return RenderType.endPortal(); return RenderType.endPortal();
} }
} }

View file

@ -17,13 +17,14 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class RenderGeneratorLimitRemover implements BlockEntityRenderer<BlockEntityGeneratorLimitRemover> { public class RenderGeneratorLimitRemover implements BlockEntityRenderer<BlockEntityGeneratorLimitRemover> {
private static final ResourceLocation RES = new ResourceLocation(NaturesAura.MOD_ID, "textures/models/generator_limit_remover_glint.png"); private static final ResourceLocation RES = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/models/generator_limit_remover_glint.png");
private final ModelLimitRemoverGlint model = new ModelLimitRemoverGlint(); private final ModelLimitRemoverGlint model = new ModelLimitRemoverGlint();
public RenderGeneratorLimitRemover(BlockEntityRendererProvider.Context context) { public RenderGeneratorLimitRemover(BlockEntityRendererProvider.Context context) {
@ -46,7 +47,7 @@ public class RenderGeneratorLimitRemover implements BlockEntityRenderer<BlockEnt
stack.translate(-0.002F + xOff, 1 + 0.002F + yOff, 1 + 0.002F + zOff); stack.translate(-0.002F + xOff, 1 + 0.002F + yOff, 1 + 0.002F + zOff);
stack.mulPose(Axis.XP.rotationDegrees(180F)); stack.mulPose(Axis.XP.rotationDegrees(180F));
stack.scale(1.004F, 1.004F, 1.004F); stack.scale(1.004F, 1.004F, 1.004F);
model.renderToBuffer(stack, buffer.getBuffer(model.renderType(texture)), brightness, combinedOverlayIn, 1, 1, 1, alpha * maxAlpha); model.renderToBuffer(stack, buffer.getBuffer(model.renderType(texture)), brightness, combinedOverlayIn, FastColor.ARGB32.colorFromFloat(1, 1, 1, alpha * maxAlpha));
stack.popPose(); stack.popPose();
} }
@ -63,8 +64,10 @@ public class RenderGeneratorLimitRemover implements BlockEntityRenderer<BlockEnt
} }
@Override @Override
public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, int color) {
this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, color);
} }
} }
} }

View file

@ -17,7 +17,7 @@ import static de.ellpeck.naturesaura.blocks.tiles.render.RenderGeneratorLimitRem
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class RenderLowerLimiter implements BlockEntityRenderer<BlockEntityLowerLimiter> { public class RenderLowerLimiter implements BlockEntityRenderer<BlockEntityLowerLimiter> {
private static final ResourceLocation RES = new ResourceLocation(NaturesAura.MOD_ID, "textures/models/lower_limiter_glint.png"); private static final ResourceLocation RES = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/models/lower_limiter_glint.png");
private final ModelLimitRemoverGlint model = new ModelLimitRemoverGlint(); private final ModelLimitRemoverGlint model = new ModelLimitRemoverGlint();
public RenderLowerLimiter(BlockEntityRendererProvider.Context context) {} public RenderLowerLimiter(BlockEntityRendererProvider.Context context) {}

View file

@ -17,13 +17,14 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class RenderProjectileGenerator implements BlockEntityRenderer<BlockEntityProjectileGenerator> { public class RenderProjectileGenerator implements BlockEntityRenderer<BlockEntityProjectileGenerator> {
private static final ResourceLocation RES = new ResourceLocation(NaturesAura.MOD_ID, "textures/models/projectile_generator_overlay.png"); private static final ResourceLocation RES = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/models/projectile_generator_overlay.png");
private final ModelOverlay model = new ModelOverlay(); private final ModelOverlay model = new ModelOverlay();
public RenderProjectileGenerator(BlockEntityRendererProvider.Context context) { public RenderProjectileGenerator(BlockEntityRendererProvider.Context context) {
@ -46,7 +47,7 @@ public class RenderProjectileGenerator implements BlockEntityRenderer<BlockEntit
stack.translate(-0.002F, 0, 0); stack.translate(-0.002F, 0, 0);
} }
var brightness = 15 << 20 | 15 << 4; var brightness = 15 << 20 | 15 << 4;
this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(RenderProjectileGenerator.RES)), brightness, combinedOverlayIn, 1, 1, 1, 1); this.model.renderToBuffer(stack, buffer.getBuffer(this.model.renderType(RenderProjectileGenerator.RES)), brightness, combinedOverlayIn, FastColor.ARGB32.colorFromFloat(1, 1, 1, 1));
stack.popPose(); stack.popPose();
} }
@ -63,8 +64,10 @@ public class RenderProjectileGenerator implements BlockEntityRenderer<BlockEntit
} }
@Override @Override
public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, int color) {
this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, color);
} }
} }
} }

View file

@ -19,7 +19,7 @@ import net.minecraft.world.phys.AABB;
public class AngerEffect implements IDrainSpotEffect { public class AngerEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "anger"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "anger");
private AABB bb; private AABB bb;
@ -77,4 +77,5 @@ public class AngerEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return AngerEffect.NAME; return AngerEffect.NAME;
} }
} }

View file

@ -27,7 +27,7 @@ import java.util.Comparator;
public class AnimalEffect implements IDrainSpotEffect { public class AnimalEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "animal"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "animal");
private int chance; private int chance;
private AABB bb; private AABB bb;
@ -113,8 +113,8 @@ public class AnimalEffect implements IDrainSpotEffect {
return; return;
var secondOptional = animals.stream() var secondOptional = animals.stream()
.filter(e -> e != first && !e.isInLove() && !e.isBaby()) .filter(e -> e != first && !e.isInLove() && !e.isBaby())
.min(Comparator.comparingDouble(e -> e.distanceToSqr(first))); .min(Comparator.comparingDouble(e -> e.distanceToSqr(first)));
if (secondOptional.isEmpty()) if (secondOptional.isEmpty())
return; return;
var second = secondOptional.get(); var second = secondOptional.get();
@ -133,12 +133,12 @@ public class AnimalEffect implements IDrainSpotEffect {
animal.setInLove(null); animal.setInLove(null);
for (var j = 0; j < 7; j++) for (var j = 0; j < 7; j++)
animal.level().addParticle(ParticleTypes.HEART, animal.level().addParticle(ParticleTypes.HEART,
animal.getX() + (double) (animal.level().random.nextFloat() * animal.getBbWidth() * 2.0F) - animal.getBbWidth(), animal.getX() + (double) (animal.level().random.nextFloat() * animal.getBbWidth() * 2.0F) - animal.getBbWidth(),
animal.getY() + 0.5D + (double) (animal.level().random.nextFloat() * animal.getBbHeight()), animal.getY() + 0.5D + (double) (animal.level().random.nextFloat() * animal.getBbHeight()),
animal.getZ() + (double) (animal.level().random.nextFloat() * animal.getBbWidth() * 2.0F) - animal.getBbWidth(), animal.getZ() + (double) (animal.level().random.nextFloat() * animal.getBbWidth() * 2.0F) - animal.getBbWidth(),
animal.level().random.nextGaussian() * 0.02D, animal.level().random.nextGaussian() * 0.02D,
animal.level().random.nextGaussian() * 0.02D, animal.level().random.nextGaussian() * 0.02D,
animal.level().random.nextGaussian() * 0.02D); animal.level().random.nextGaussian() * 0.02D);
} }
@Override @Override
@ -150,4 +150,5 @@ public class AnimalEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return AnimalEffect.NAME; return AnimalEffect.NAME;
} }
} }

View file

@ -13,7 +13,7 @@ import org.apache.commons.lang3.mutable.MutableInt;
public class BalanceEffect implements IDrainSpotEffect { public class BalanceEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "balance"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "balance");
@Override @Override
public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) { public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) {

View file

@ -8,6 +8,7 @@ import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.chunk.AuraChunk; import de.ellpeck.naturesaura.chunk.AuraChunk;
import de.ellpeck.naturesaura.potion.ModPotions; import de.ellpeck.naturesaura.potion.ModPotions;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
@ -21,7 +22,7 @@ import net.minecraft.world.phys.AABB;
public class BreathlessEffect implements IDrainSpotEffect { public class BreathlessEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "breathless"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "breathless");
private int amp; private int amp;
private AABB bb; private AABB bb;
@ -62,7 +63,7 @@ public class BreathlessEffect implements IDrainSpotEffect {
return; return;
var entities = level.getEntitiesOfClass(LivingEntity.class, this.bb); var entities = level.getEntitiesOfClass(LivingEntity.class, this.bb);
for (var entity : entities) for (var entity : entities)
entity.addEffect(new MobEffectInstance(ModPotions.BREATHLESS, 300, this.amp)); entity.addEffect(new MobEffectInstance(Holder.direct(ModPotions.BREATHLESS), 300, this.amp));
} }
@Override @Override
@ -74,4 +75,5 @@ public class BreathlessEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return BreathlessEffect.NAME; return BreathlessEffect.NAME;
} }
} }

View file

@ -19,7 +19,7 @@ import net.minecraft.world.phys.AABB;
public class CacheRechargeEffect implements IDrainSpotEffect { public class CacheRechargeEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "cache_recharge"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "cache_recharge");
private int amount; private int amount;
private AABB bb; private AABB bb;
@ -77,4 +77,5 @@ public class CacheRechargeEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return CacheRechargeEffect.NAME; return CacheRechargeEffect.NAME;
} }
} }

View file

@ -20,7 +20,7 @@ import net.neoforged.neoforge.event.EventHooks;
public class ExplosionEffect implements IDrainSpotEffect { public class ExplosionEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "explosions"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "explosions");
private float strength; private float strength;
private int dist; private int dist;

View file

@ -23,7 +23,7 @@ import net.minecraft.world.level.chunk.LevelChunk;
public class GrassDieEffect implements IDrainSpotEffect { public class GrassDieEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "grass_die"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "grass_die");
private int amount; private int amount;
private int dist; private int dist;
@ -63,9 +63,9 @@ public class GrassDieEffect implements IDrainSpotEffect {
return; return;
for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) { for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) {
var grassPos = BlockPos.containing( var grassPos = BlockPos.containing(
pos.getX() + level.random.nextGaussian() * this.dist, pos.getX() + level.random.nextGaussian() * this.dist,
pos.getY() + level.random.nextGaussian() * this.dist, pos.getY() + level.random.nextGaussian() * this.dist,
pos.getZ() + level.random.nextGaussian() * this.dist pos.getZ() + level.random.nextGaussian() * this.dist
); );
if (grassPos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(grassPos)) { if (grassPos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(grassPos)) {
var state = level.getBlockState(grassPos); var state = level.getBlockState(grassPos);
@ -96,4 +96,5 @@ public class GrassDieEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return GrassDieEffect.NAME; return GrassDieEffect.NAME;
} }
} }

View file

@ -23,7 +23,7 @@ import net.minecraft.world.level.chunk.LevelChunk;
public class NetherDecayEffect implements IDrainSpotEffect { public class NetherDecayEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "nether_decay"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "nether_decay");
private int amount; private int amount;
private int dist; private int dist;
@ -62,9 +62,9 @@ public class NetherDecayEffect implements IDrainSpotEffect {
return; return;
for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) { for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) {
var offset = BlockPos.containing( var offset = BlockPos.containing(
pos.getX() + level.random.nextGaussian() * this.dist, pos.getX() + level.random.nextGaussian() * this.dist,
pos.getY() + level.random.nextGaussian() * this.dist, pos.getY() + level.random.nextGaussian() * this.dist,
pos.getZ() + level.random.nextGaussian() * this.dist); pos.getZ() + level.random.nextGaussian() * this.dist);
if (offset.distSqr(pos) > this.dist * this.dist || !level.isLoaded(offset)) if (offset.distSqr(pos) > this.dist * this.dist || !level.isLoaded(offset))
continue; continue;
@ -101,4 +101,5 @@ public class NetherDecayEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return NetherDecayEffect.NAME; return NetherDecayEffect.NAME;
} }
} }

View file

@ -22,7 +22,7 @@ import net.neoforged.neoforge.common.Tags;
public class NetherGrassEffect implements IDrainSpotEffect { public class NetherGrassEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "nether_grass"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "nether_grass");
private int amount; private int amount;
private int dist; private int dist;
@ -78,14 +78,14 @@ public class NetherGrassEffect implements IDrainSpotEffect {
continue; continue;
var state = level.getBlockState(goalPos); var state = level.getBlockState(goalPos);
if (state.is(Tags.Blocks.NETHERRACK)) { if (state.is(Tags.Blocks.NETHERRACKS)) {
level.setBlockAndUpdate(goalPos, ModBlocks.NETHER_GRASS.defaultBlockState()); level.setBlockAndUpdate(goalPos, ModBlocks.NETHER_GRASS.defaultBlockState());
var closestSpot = IAuraChunk.getHighestSpot(level, goalPos, 25, pos); var closestSpot = IAuraChunk.getHighestSpot(level, goalPos, 25, pos);
IAuraChunk.getAuraChunk(level, closestSpot).drainAura(closestSpot, 500); IAuraChunk.getAuraChunk(level, closestSpot).drainAura(closestSpot, 500);
PacketHandler.sendToAllAround(level, goalPos, 32, PacketHandler.sendToAllAround(level, goalPos, 32,
new PacketParticles(goalPos.getX(), goalPos.getY() + 0.5F, goalPos.getZ(), PacketParticles.Type.PLANT_BOOST)); new PacketParticles(goalPos.getX(), goalPos.getY() + 0.5F, goalPos.getZ(), PacketParticles.Type.PLANT_BOOST));
break; break;
} }
} }
@ -102,4 +102,5 @@ public class NetherGrassEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return NetherGrassEffect.NAME; return NetherGrassEffect.NAME;
} }
} }

View file

@ -39,7 +39,7 @@ import java.util.Set;
public class OreSpawnEffect implements IDrainSpotEffect { public class OreSpawnEffect implements IDrainSpotEffect {
public static final Set<BlockState> SPAWN_EXCEPTIONS = new HashSet<>(); public static final Set<BlockState> SPAWN_EXCEPTIONS = new HashSet<>();
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "ore_spawn"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "ore_spawn");
private int amount; private int amount;
private int dist; private int dist;
@ -93,7 +93,7 @@ public class OreSpawnEffect implements IDrainSpotEffect {
var totalWeight = WeightedRandom.getTotalWeight(ores); var totalWeight = WeightedRandom.getTotalWeight(ores);
var powders = NaturesAuraAPI.instance().getActiveEffectPowders(level, var powders = NaturesAuraAPI.instance().getActiveEffectPowders(level,
new AABB(pos).inflate(this.dist), OreSpawnEffect.NAME); new AABB(pos).inflate(this.dist), OreSpawnEffect.NAME);
if (powders.isEmpty()) if (powders.isEmpty())
return; return;
for (var i = 0; i < this.amount; i++) { for (var i = 0; i < this.amount; i++) {
@ -105,7 +105,7 @@ public class OreSpawnEffect implements IDrainSpotEffect {
var z = Mth.floor(powderPos.z + level.random.nextGaussian() * range); var z = Mth.floor(powderPos.z + level.random.nextGaussian() * range);
var orePos = new BlockPos(x, y, z); var orePos = new BlockPos(x, y, z);
if (orePos.distToCenterSqr(powderPos.x, powderPos.y, powderPos.z) <= range * range if (orePos.distToCenterSqr(powderPos.x, powderPos.y, powderPos.z) <= range * range
&& orePos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(orePos)) { && orePos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(orePos)) {
var state = level.getBlockState(orePos); var state = level.getBlockState(orePos);
if (state.getBlock() != requiredBlock) if (state.getBlock() != requiredBlock)
continue; continue;
@ -149,7 +149,7 @@ public class OreSpawnEffect implements IDrainSpotEffect {
@Override @Override
public boolean appliesHere(LevelChunk chunk, IAuraChunk auraChunk, IAuraType type) { public boolean appliesHere(LevelChunk chunk, IAuraChunk auraChunk, IAuraType type) {
return ModConfig.instance.oreEffect.get() && return ModConfig.instance.oreEffect.get() &&
(type.isSimilar(NaturesAuraAPI.TYPE_OVERWORLD) || type.isSimilar(NaturesAuraAPI.TYPE_NETHER)); (type.isSimilar(NaturesAuraAPI.TYPE_OVERWORLD) || type.isSimilar(NaturesAuraAPI.TYPE_NETHER));
} }
@Override @Override

View file

@ -28,7 +28,7 @@ import java.util.Set;
public class PlantBoostEffect implements IDrainSpotEffect { public class PlantBoostEffect implements IDrainSpotEffect {
public static final Set<Block> EXCEPTIONS = new HashSet<>(List.of(Blocks.GRASS_BLOCK, Blocks.MOSS_BLOCK, Blocks.GLOW_LICHEN, Blocks.SMALL_DRIPLEAF, Blocks.BIG_DRIPLEAF, Blocks.BIG_DRIPLEAF_STEM)); public static final Set<Block> EXCEPTIONS = new HashSet<>(List.of(Blocks.GRASS_BLOCK, Blocks.MOSS_BLOCK, Blocks.GLOW_LICHEN, Blocks.SMALL_DRIPLEAF, Blocks.BIG_DRIPLEAF, Blocks.BIG_DRIPLEAF_STEM));
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "plant_boost"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "plant_boost");
private int amount; private int amount;
private int dist; private int dist;
@ -90,7 +90,7 @@ public class PlantBoostEffect implements IDrainSpotEffect {
IAuraChunk.getAuraChunk(level, closestSpot).drainAura(closestSpot, 3500); IAuraChunk.getAuraChunk(level, closestSpot).drainAura(closestSpot, 3500);
PacketHandler.sendToAllAround(level, plantPos, 32, PacketHandler.sendToAllAround(level, plantPos, 32,
new PacketParticles(plantPos.getX(), plantPos.getY(), plantPos.getZ(), PacketParticles.Type.PLANT_BOOST)); new PacketParticles(plantPos.getX(), plantPos.getY(), plantPos.getZ(), PacketParticles.Type.PLANT_BOOST));
} }
} }
} }
@ -106,4 +106,5 @@ public class PlantBoostEffect implements IDrainSpotEffect {
public ResourceLocation getName() { public ResourceLocation getName() {
return PlantBoostEffect.NAME; return PlantBoostEffect.NAME;
} }
} }

View file

@ -18,7 +18,7 @@ import java.util.List;
public class ReplenishingEffect implements IDrainSpotEffect { public class ReplenishingEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "replenishing"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "replenishing");
@Override @Override
public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) { public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) {

View file

@ -14,7 +14,7 @@ import net.minecraft.world.level.chunk.LevelChunk;
public class SpreadEffect implements IDrainSpotEffect { public class SpreadEffect implements IDrainSpotEffect {
public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "spread"); public static final ResourceLocation NAME = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "spread");
@Override @Override
public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) { public void update(Level level, LevelChunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot, AuraChunk.DrainSpot actualSpot) {

View file

@ -18,10 +18,11 @@ public final class Compat {
@SuppressWarnings("Convert2MethodRef") // bleh classloading compat issues @SuppressWarnings("Convert2MethodRef") // bleh classloading compat issues
private static final Map<String, Supplier<ICompat>> MODULE_TYPES = ImmutableMap.<String, Supplier<ICompat>>builder() private static final Map<String, Supplier<ICompat>> MODULE_TYPES = ImmutableMap.<String, Supplier<ICompat>>builder()
.put("patchouli", () -> new PatchouliCompat()) .put("patchouli", () -> new PatchouliCompat())
.put("curios", () -> new CuriosCompat()) // TODO curios?
//.put("enchantability", EnchantibilityCompat::new) //.put("curios", () -> new CuriosCompat())
.build(); //.put("enchantability", EnchantibilityCompat::new)
.build();
private static final Map<String, ICompat> MODULES = new HashMap<>(); private static final Map<String, ICompat> MODULES = new HashMap<>();
public static void setup(FMLCommonSetupEvent event) { public static void setup(FMLCommonSetupEvent event) {

View file

@ -24,7 +24,7 @@ public class AltarCategory implements IRecipeCategory<AltarRecipe> {
private final ItemStack altar = new ItemStack(ModBlocks.NATURE_ALTAR); private final ItemStack altar = new ItemStack(ModBlocks.NATURE_ALTAR);
public AltarCategory(IGuiHelper helper) { public AltarCategory(IGuiHelper helper) {
this.background = helper.createDrawable(new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/jei/altar.png"), 0, 0, 103, 57); this.background = helper.createDrawable(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/jei/altar.png"), 0, 0, 103, 57);
} }
@Override @Override
@ -53,4 +53,5 @@ public class AltarCategory implements IRecipeCategory<AltarRecipe> {
builder.addSlot(RecipeIngredientRole.OUTPUT, 81, 19).addItemStack(recipe.output); builder.addSlot(RecipeIngredientRole.OUTPUT, 81, 19).addItemStack(recipe.output);
builder.addSlot(RecipeIngredientRole.CATALYST, 38, 19).addItemStacks(recipe.catalyst == Ingredient.EMPTY ? Collections.singletonList(this.altar) : Arrays.asList(recipe.catalyst.getItems())); builder.addSlot(RecipeIngredientRole.CATALYST, 38, 19).addItemStacks(recipe.catalyst == Ingredient.EMPTY ? Collections.singletonList(this.altar) : Arrays.asList(recipe.catalyst.getItems()));
} }
} }

View file

@ -24,7 +24,6 @@ import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.SpawnEggItem; import net.minecraft.world.item.SpawnEggItem;
import net.neoforged.neoforge.common.DeferredSpawnEggItem;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -36,15 +35,15 @@ public class AnimalSpawnerCategory implements IRecipeCategory<AnimalSpawnerRecip
private final Map<EntityType<?>, Entity> entityCache = new HashMap<>(); private final Map<EntityType<?>, Entity> entityCache = new HashMap<>();
public AnimalSpawnerCategory(IGuiHelper helper) { public AnimalSpawnerCategory(IGuiHelper helper) {
this.background = helper.createDrawable(new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/jei/animal_spawner.png"), 0, 0, 72, 86); this.background = helper.createDrawable(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/jei/animal_spawner.png"), 0, 0, 72, 86);
} }
private static void renderEntity(PoseStack matrixstack, int x, int y, float scale, float yaw, float pitch, LivingEntity entity) { private static void renderEntity(PoseStack matrixstack, int x, int y, float scale, float yaw, float pitch, LivingEntity entity) {
var f = (float) Math.atan(yaw / 40.0F); var f = (float) Math.atan(yaw / 40.0F);
var f1 = (float) Math.atan(pitch / 40.0F); var f1 = (float) Math.atan(pitch / 40.0F);
var posestack = RenderSystem.getModelViewStack(); var posestack = RenderSystem.getModelViewStack();
posestack.pushPose(); posestack.pushMatrix();
posestack.translate(x, y, 1050.0D); posestack.translate(x, y, 1050.0F);
posestack.scale(1.0F, 1.0F, -1.0F); posestack.scale(1.0F, 1.0F, -1.0F);
RenderSystem.applyModelViewMatrix(); RenderSystem.applyModelViewMatrix();
matrixstack.translate(0.0D, 0.0D, 1000.0D); matrixstack.translate(0.0D, 0.0D, 1000.0D);
@ -77,7 +76,7 @@ public class AnimalSpawnerCategory implements IRecipeCategory<AnimalSpawnerRecip
entity.setXRot(f4); entity.setXRot(f4);
entity.yHeadRotO = f5; entity.yHeadRotO = f5;
entity.yHeadRot = f6; entity.yHeadRot = f6;
posestack.popPose(); posestack.popMatrix();
RenderSystem.applyModelViewMatrix(); RenderSystem.applyModelViewMatrix();
Lighting.setupFor3DItems(); Lighting.setupFor3DItems();
} }
@ -127,4 +126,5 @@ public class AnimalSpawnerCategory implements IRecipeCategory<AnimalSpawnerRecip
graphics.drawString(minecraft.font, name, 36 - minecraft.font.width(name) / 2F, 55, 0xFFFFFF, true); graphics.drawString(minecraft.font, name, 36 - minecraft.font.width(name) / 2F, 55, 0xFFFFFF, true);
} }
} }

View file

@ -10,7 +10,8 @@ import de.ellpeck.naturesaura.recipes.*;
import mezz.jei.api.IModPlugin; import mezz.jei.api.IModPlugin;
import mezz.jei.api.JeiPlugin; import mezz.jei.api.JeiPlugin;
import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.ingredients.subtypes.IIngredientSubtypeInterpreter; import mezz.jei.api.ingredients.subtypes.ISubtypeInterpreter;
import mezz.jei.api.ingredients.subtypes.UidContext;
import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.recipe.RecipeType;
import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCatalystRegistration;
import mezz.jei.api.registration.IRecipeCategoryRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration;
@ -20,6 +21,7 @@ import net.minecraft.client.Minecraft;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.RecipeHolder;
import org.jetbrains.annotations.Nullable;
@JeiPlugin @JeiPlugin
public class JEINaturesAuraPlugin implements IModPlugin { public class JEINaturesAuraPlugin implements IModPlugin {
@ -31,33 +33,60 @@ public class JEINaturesAuraPlugin implements IModPlugin {
@Override @Override
public ResourceLocation getPluginUid() { public ResourceLocation getPluginUid() {
return new ResourceLocation(NaturesAura.MOD_ID, "jei_plugin"); return ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "jei_plugin");
} }
@Override @Override
public void registerCategories(IRecipeCategoryRegistration registry) { public void registerCategories(IRecipeCategoryRegistration registry) {
var helper = registry.getJeiHelpers().getGuiHelper(); var helper = registry.getJeiHelpers().getGuiHelper();
registry.addRecipeCategories( registry.addRecipeCategories(
new TreeRitualCategory(helper), new TreeRitualCategory(helper),
new AltarCategory(helper), new AltarCategory(helper),
new OfferingCategory(helper), new OfferingCategory(helper),
new AnimalSpawnerCategory(helper) new AnimalSpawnerCategory(helper)
); );
} }
@Override @Override
public void registerItemSubtypes(ISubtypeRegistration registration) { public void registerItemSubtypes(ISubtypeRegistration registration) {
registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.EFFECT_POWDER, (stack, context) -> ItemEffectPowder.getEffect(stack).toString()); registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.EFFECT_POWDER, new ISubtypeInterpreter<>() {
registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.AURA_BOTTLE, (stack, context) -> ItemAuraBottle.getType(stack).getName().toString()); @Override
public @Nullable Object getSubtypeData(ItemStack ingredient, UidContext context) {
return ItemEffectPowder.getEffect(ingredient);
}
var auraInterpreter = (IIngredientSubtypeInterpreter<ItemStack>) (stack, context) -> { @Override
var container = stack.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY); public String getLegacyStringSubtypeInfo(ItemStack ingredient, UidContext context) {
if (container != null) return ItemEffectPowder.getEffect(ingredient).toString();
return String.valueOf(container.getStoredAura()); }
return IIngredientSubtypeInterpreter.NONE; });
registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.AURA_BOTTLE, new ISubtypeInterpreter<>() {
@Override
public @Nullable Object getSubtypeData(ItemStack ingredient, UidContext context) {
return ItemAuraBottle.getType(ingredient).getName();
}
@Override
public String getLegacyStringSubtypeInfo(ItemStack ingredient, UidContext context) {
return ItemAuraBottle.getType(ingredient).getName().toString();
}
});
var auraInterpreter = new ISubtypeInterpreter<ItemStack>() {
@Override
public @Nullable Object getSubtypeData(ItemStack ingredient, UidContext context) {
var container = ingredient.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY);
return container != null ? container.getStoredAura() : null;
}
@Override
public String getLegacyStringSubtypeInfo(ItemStack ingredient, UidContext context) {
var container = ingredient.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY);
return container != null ? String.valueOf(container.getStoredAura()) : "";
}
}; };
registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.AURA_CACHE, auraInterpreter); registration.registerSubtypeInterpreter(ModItems.AURA_CACHE, auraInterpreter);
registration.registerSubtypeInterpreter(VanillaTypes.ITEM_STACK, ModItems.AURA_TROVE, auraInterpreter); registration.registerSubtypeInterpreter(ModItems.AURA_TROVE, auraInterpreter);
} }
@Override @Override

View file

@ -19,7 +19,7 @@ public class OfferingCategory implements IRecipeCategory<OfferingRecipe> {
private final IDrawable background; private final IDrawable background;
public OfferingCategory(IGuiHelper helper) { public OfferingCategory(IGuiHelper helper) {
this.background = helper.createDrawable(new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/jei/offering.png"), 0, 0, 87, 36); this.background = helper.createDrawable(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/jei/offering.png"), 0, 0, 87, 36);
} }
@Override @Override
@ -48,4 +48,5 @@ public class OfferingCategory implements IRecipeCategory<OfferingRecipe> {
builder.addSlot(RecipeIngredientRole.OUTPUT, 66, 15).addItemStack(recipe.output); builder.addSlot(RecipeIngredientRole.OUTPUT, 66, 15).addItemStack(recipe.output);
builder.addSlot(RecipeIngredientRole.INPUT, 28, 1).addItemStacks(Arrays.asList(recipe.startItem.getItems())); builder.addSlot(RecipeIngredientRole.INPUT, 28, 1).addItemStacks(Arrays.asList(recipe.startItem.getItems()));
} }
} }

View file

@ -19,7 +19,7 @@ public class TreeRitualCategory implements IRecipeCategory<TreeRitualRecipe> {
private final IDrawable background; private final IDrawable background;
public TreeRitualCategory(IGuiHelper helper) { public TreeRitualCategory(IGuiHelper helper) {
this.background = helper.createDrawable(new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/jei/tree_ritual.png"), 0, 0, 146, 86); this.background = helper.createDrawable(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/jei/tree_ritual.png"), 0, 0, 146, 86);
} }
@Override @Override

View file

@ -5,11 +5,11 @@ import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.multiblock.Matcher; import de.ellpeck.naturesaura.api.multiblock.Matcher;
import de.ellpeck.naturesaura.compat.ICompat; import de.ellpeck.naturesaura.compat.ICompat;
import de.ellpeck.naturesaura.data.ItemTagProvider;
import de.ellpeck.naturesaura.events.ClientEvents; import de.ellpeck.naturesaura.events.ClientEvents;
import de.ellpeck.naturesaura.renderers.SupporterFancyHandler; import de.ellpeck.naturesaura.renderers.SupporterFancyHandler;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.core.HolderLookup;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Style;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -17,9 +17,9 @@ import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
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.neoforge.common.NeoForge;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.common.NeoForge;
import vazkii.patchouli.api.BookDrawScreenEvent; import vazkii.patchouli.api.BookDrawScreenEvent;
import vazkii.patchouli.api.IMultiblock; import vazkii.patchouli.api.IMultiblock;
import vazkii.patchouli.api.IVariable; import vazkii.patchouli.api.IVariable;
@ -32,7 +32,7 @@ import java.util.stream.Collectors;
public class PatchouliCompat implements ICompat { public class PatchouliCompat implements ICompat {
public static final ResourceLocation BOOK = new ResourceLocation(NaturesAura.MOD_ID, "book"); public static final ResourceLocation BOOK = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "book");
private static final Map<ResourceLocation, IMultiblock> MULTIBLOCKS = new HashMap<>(); private static final Map<ResourceLocation, IMultiblock> MULTIBLOCKS = new HashMap<>();
public static void addPatchouliMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) { public static void addPatchouliMultiblock(ResourceLocation name, String[][] pattern, Object... rawMatchers) {
@ -43,7 +43,7 @@ public class PatchouliCompat implements ICompat {
rawMatchers[i] = PatchouliAPI.get().anyMatcher(); rawMatchers[i] = PatchouliAPI.get().anyMatcher();
else else
rawMatchers[i] = PatchouliAPI.get().predicateMatcher(matcher.defaultState(), rawMatchers[i] = PatchouliAPI.get().predicateMatcher(matcher.defaultState(),
state -> check.matches(null, null, null, null, state, (char) 0)); state -> check.matches(null, null, null, null, state, (char) 0));
} }
} }
PatchouliCompat.MULTIBLOCKS.put(name, PatchouliAPI.get().makeMultiblock(pattern, rawMatchers)); PatchouliCompat.MULTIBLOCKS.put(name, PatchouliAPI.get().makeMultiblock(pattern, rawMatchers));
@ -52,14 +52,13 @@ public class PatchouliCompat implements ICompat {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T extends Recipe<?>> T getRecipe(String type, String name) { public static <T extends Recipe<?>> T getRecipe(String type, String name) {
var manager = Minecraft.getInstance().level.getRecipeManager(); var manager = Minecraft.getInstance().level.getRecipeManager();
var res = new ResourceLocation(name); var res = ResourceLocation.parse(name);
var pre = new ResourceLocation(res.getNamespace(), type + "/" + res.getPath()); var pre = ResourceLocation.fromNamespaceAndPath(res.getNamespace(), type + "/" + res.getPath());
return (T) manager.byKey(pre).orElse(null).value(); return (T) manager.byKey(pre).orElse(null).value();
} }
public static IVariable ingredientVariable(Ingredient ingredient) { public static IVariable ingredientVariable(Ingredient ingredient, HolderLookup.Provider registries) {
return IVariable.wrapList(Arrays.stream(ingredient.getItems()) return IVariable.wrapList(Arrays.stream(ingredient.getItems()).map(i -> IVariable.from(i, registries)).collect(Collectors.toList()), registries);
.map(IVariable::from).collect(Collectors.toList()));
} }
@Override @Override
@ -78,11 +77,6 @@ public class PatchouliCompat implements ICompat {
NeoForge.EVENT_BUS.register(this); NeoForge.EVENT_BUS.register(this);
} }
@Override
public void addItemTags(ItemTagProvider provider) {
}
@SubscribeEvent @SubscribeEvent
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void onBookDraw(BookDrawScreenEvent event) { public void onBookDraw(BookDrawScreenEvent event) {
@ -99,9 +93,9 @@ public class PatchouliCompat implements ICompat {
if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 43 && event.getMouseY() < y + 42) if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 43 && event.getMouseY() < y + 42)
event.getGraphics().renderTooltip(Minecraft.getInstance().font, event.getGraphics().renderTooltip(Minecraft.getInstance().font,
Collections.singletonList(Component.literal("It's the author Ellpeck's birthday!").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GOLD))), Collections.singletonList(Component.literal("It's the author Ellpeck's birthday!").setStyle(Style.EMPTY.applyFormat(ChatFormatting.GOLD))),
Optional.empty(), Optional.empty(),
event.getMouseX(), event.getMouseY()); event.getMouseX(), event.getMouseY());
} else if (now.getMonth() == Month.JUNE) { } else if (now.getMonth() == Month.JUNE) {
var x = gui.width / 2 + 272 / 2; var x = gui.width / 2 + 272 / 2;
var y = gui.height / 2 + 32; var y = gui.height / 2 + 32;
@ -111,8 +105,8 @@ public class PatchouliCompat implements ICompat {
if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 45 && event.getMouseY() < y + 26) if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 45 && event.getMouseY() < y + 26)
//noinspection UnnecessaryUnicodeEscape //noinspection UnnecessaryUnicodeEscape
event.getGraphics().renderTooltip(gui.getMinecraft().font, event.getGraphics().renderTooltip(gui.getMinecraft().font,
Collections.singletonList(Component.literal("\u00A76Happy \u00A74P\u00A76r\u00A7ei\u00A72d\u00A79e\u00A75!")), Optional.empty(), Collections.singletonList(Component.literal("\u00A76Happy \u00A74P\u00A76r\u00A7ei\u00A72d\u00A79e\u00A75!")), Optional.empty(),
event.getMouseX(), event.getMouseY()); event.getMouseX(), event.getMouseY());
} }
var name = gui.getMinecraft().player.getName().getString(); var name = gui.getMinecraft().player.getName().getString();
@ -134,9 +128,10 @@ public class PatchouliCompat implements ICompat {
if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 16 && event.getMouseY() < y + 18) if (event.getMouseX() >= x && event.getMouseY() >= y && event.getMouseX() < x + 16 && event.getMouseY() < y + 18)
event.getGraphics().renderTooltip(gui.getMinecraft().font, event.getGraphics().renderTooltip(gui.getMinecraft().font,
Collections.singletonList(Component.literal("Thanks for your support, " + name + "!").setStyle(Style.EMPTY.applyFormat(ChatFormatting.YELLOW))), Optional.empty(), Collections.singletonList(Component.literal("Thanks for your support, " + name + "!").setStyle(Style.EMPTY.applyFormat(ChatFormatting.YELLOW))), Optional.empty(),
event.getMouseX(), event.getMouseY()); event.getMouseX(), event.getMouseY());
} }
} }
} }

View file

@ -13,7 +13,7 @@ public class ProcessorAltar implements IComponentProcessor {
@Override @Override
public void setup(Level level, IVariableProvider provider) { public void setup(Level level, IVariableProvider provider) {
this.recipe = PatchouliCompat.getRecipe("altar", provider.get("recipe").asString()); this.recipe = PatchouliCompat.getRecipe("altar", provider.get("recipe", level.registryAccess()).asString());
} }
@Override @Override
@ -21,10 +21,10 @@ public class ProcessorAltar implements IComponentProcessor {
if (this.recipe == null) if (this.recipe == null)
return null; return null;
return switch (key) { return switch (key) {
case "input" -> PatchouliCompat.ingredientVariable(this.recipe.input); case "input" -> PatchouliCompat.ingredientVariable(this.recipe.input, level.registryAccess());
case "output" -> IVariable.from(this.recipe.output); case "output" -> IVariable.from(this.recipe.output, level.registryAccess());
case "catalyst" -> this.recipe.catalyst != Ingredient.EMPTY ? PatchouliCompat.ingredientVariable(this.recipe.catalyst) : null; case "catalyst" -> this.recipe.catalyst != Ingredient.EMPTY ? PatchouliCompat.ingredientVariable(this.recipe.catalyst, level.registryAccess()) : null;
case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString()); case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString(), level.registryAccess());
default -> null; default -> null;
}; };
} }

View file

@ -15,7 +15,7 @@ public class ProcessorAnimalSpawner implements IComponentProcessor {
@Override @Override
public void setup(Level level, IVariableProvider provider) { public void setup(Level level, IVariableProvider provider) {
this.recipe = PatchouliCompat.getRecipe("animal_spawner", provider.get("recipe").asString()); this.recipe = PatchouliCompat.getRecipe("animal_spawner", provider.get("recipe", level.registryAccess()).asString());
} }
@Override @Override
@ -24,12 +24,12 @@ public class ProcessorAnimalSpawner implements IComponentProcessor {
return null; return null;
if (key.startsWith("input")) { if (key.startsWith("input")) {
var id = Integer.parseInt(key.substring(5)) - 1; var id = Integer.parseInt(key.substring(5)) - 1;
return this.recipe.ingredients.size() > id ? PatchouliCompat.ingredientVariable(this.recipe.ingredients.get(id)) : null; return this.recipe.ingredients.size() > id ? PatchouliCompat.ingredientVariable(this.recipe.ingredients.get(id), level.registryAccess()) : null;
} else { } else {
return switch (key) { return switch (key) {
case "name" -> IVariable.wrap(this.recipe.entity.getDescription().getString()); case "name" -> IVariable.wrap(this.recipe.entity.getDescription().getString(), level.registryAccess());
case "entity" -> IVariable.wrap(BuiltInRegistries.ENTITY_TYPE.getKey(this.recipe.entity).toString()); case "entity" -> IVariable.wrap(BuiltInRegistries.ENTITY_TYPE.getKey(this.recipe.entity).toString(), level.registryAccess());
case "egg" -> IVariable.from(new ItemStack(SpawnEggItem.byId(this.recipe.entity))); case "egg" -> IVariable.from(new ItemStack(SpawnEggItem.byId(this.recipe.entity)), level.registryAccess());
default -> null; default -> null;
}; };
} }

View file

@ -12,7 +12,7 @@ public class ProcessorOffering implements IComponentProcessor {
@Override @Override
public void setup(Level level, IVariableProvider provider) { public void setup(Level level, IVariableProvider provider) {
this.recipe = PatchouliCompat.getRecipe("offering", provider.get("recipe").asString()); this.recipe = PatchouliCompat.getRecipe("offering", provider.get("recipe", level.registryAccess()).asString());
} }
@Override @Override
@ -20,10 +20,10 @@ public class ProcessorOffering implements IComponentProcessor {
if (this.recipe == null) if (this.recipe == null)
return null; return null;
return switch (key) { return switch (key) {
case "input" -> PatchouliCompat.ingredientVariable(this.recipe.input); case "input" -> PatchouliCompat.ingredientVariable(this.recipe.input, level.registryAccess());
case "output" -> IVariable.from(this.recipe.output); case "output" -> IVariable.from(this.recipe.output, level.registryAccess());
case "start" -> PatchouliCompat.ingredientVariable(this.recipe.startItem); case "start" -> PatchouliCompat.ingredientVariable(this.recipe.startItem, level.registryAccess());
case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString()); case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString(), level.registryAccess());
default -> null; default -> null;
}; };
} }

View file

@ -12,7 +12,7 @@ public class ProcessorTreeRitual implements IComponentProcessor {
@Override @Override
public void setup(Level level, IVariableProvider provider) { public void setup(Level level, IVariableProvider provider) {
this.recipe = PatchouliCompat.getRecipe("tree_ritual", provider.get("recipe").asString()); this.recipe = PatchouliCompat.getRecipe("tree_ritual", provider.get("recipe", level.registryAccess()).asString());
} }
@Override @Override
@ -21,14 +21,15 @@ public class ProcessorTreeRitual implements IComponentProcessor {
return null; return null;
if (key.startsWith("input")) { if (key.startsWith("input")) {
var id = Integer.parseInt(key.substring(5)) - 1; var id = Integer.parseInt(key.substring(5)) - 1;
return this.recipe.ingredients.size() > id ? PatchouliCompat.ingredientVariable(this.recipe.ingredients.get(id)) : null; return this.recipe.ingredients.size() > id ? PatchouliCompat.ingredientVariable(this.recipe.ingredients.get(id), level.registryAccess()) : null;
} else { } else {
return switch (key) { return switch (key) {
case "output" -> IVariable.from(this.recipe.output); case "output" -> IVariable.from(this.recipe.output, level.registryAccess());
case "sapling" -> PatchouliCompat.ingredientVariable(this.recipe.saplingType); case "sapling" -> PatchouliCompat.ingredientVariable(this.recipe.saplingType, level.registryAccess());
case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString()); case "name" -> IVariable.wrap(this.recipe.output.getHoverName().getString(), level.registryAccess());
default -> null; default -> null;
}; };
} }
} }
} }

View file

@ -7,6 +7,7 @@ import de.ellpeck.naturesaura.blocks.Slab;
import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.advancements.critereon.StatePropertiesPredicate; import net.minecraft.advancements.critereon.StatePropertiesPredicate;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.data.loot.BlockLootSubProvider;
import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
@ -25,8 +26,8 @@ import java.util.Set;
public class BlockLootProvider extends BlockLootSubProvider { public class BlockLootProvider extends BlockLootSubProvider {
public BlockLootProvider() { public BlockLootProvider(HolderLookup.Provider registries) {
super(Set.of(), FeatureFlags.REGISTRY.allFlags()); super(Set.of(), FeatureFlags.REGISTRY.allFlags(), registries);
} }
@Override @Override
@ -43,15 +44,16 @@ public class BlockLootProvider extends BlockLootSubProvider {
} }
} }
this.add(ModBlocks.ANCIENT_LEAVES, BlockLootProvider::createSilkTouchOnlyTable); this.add(ModBlocks.ANCIENT_LEAVES, this::createSilkTouchOnlyTable);
this.add(ModBlocks.DECAYED_LEAVES, BlockLootProvider::createSilkTouchOnlyTable); this.add(ModBlocks.DECAYED_LEAVES, this::createSilkTouchOnlyTable);
this.add(ModBlocks.GOLDEN_LEAVES, b -> LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(this.applyExplosionCondition(b, LootItem.lootTableItem(ModItems.GOLD_LEAF)).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(b).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(BlockGoldenLeaves.STAGE, BlockGoldenLeaves.HIGHEST_STAGE)))).when(LootItemRandomChanceCondition.randomChance(0.75F)))); this.add(ModBlocks.GOLDEN_LEAVES, b -> LootTable.lootTable().withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1)).add(this.applyExplosionCondition(b, LootItem.lootTableItem(ModItems.GOLD_LEAF)).when(LootItemBlockStatePropertyCondition.hasBlockStateProperties(b).setProperties(StatePropertiesPredicate.Builder.properties().hasProperty(BlockGoldenLeaves.STAGE, BlockGoldenLeaves.HIGHEST_STAGE)))).when(LootItemRandomChanceCondition.randomChance(0.75F))));
this.add(ModBlocks.NETHER_WART_MUSHROOM, b -> BlockLootSubProvider.createSilkTouchDispatchTable(b, LootItem.lootTableItem(Items.NETHER_WART).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2))))); this.add(ModBlocks.NETHER_WART_MUSHROOM, b -> this.createSilkTouchDispatchTable(b, LootItem.lootTableItem(Items.NETHER_WART).apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 2)))));
this.add(ModBlocks.NETHER_GRASS, b -> BlockLootSubProvider.createSilkTouchDispatchTable(b, LootItem.lootTableItem(Blocks.NETHERRACK))); this.add(ModBlocks.NETHER_GRASS, b -> this.createSilkTouchDispatchTable(b, LootItem.lootTableItem(Blocks.NETHERRACK)));
} }
@Override @Override
protected Iterable<Block> getKnownBlocks() { protected Iterable<Block> getKnownBlocks() {
return ModRegistry.ALL_ITEMS.stream().filter(i -> i instanceof Block).map(i -> (Block) i).toList(); return ModRegistry.ALL_ITEMS.stream().filter(i -> i instanceof Block).map(i -> (Block) i).toList();
} }
} }

View file

@ -17,10 +17,10 @@ import java.util.concurrent.CompletableFuture;
public class BlockTagProvider extends BlockTagsProvider { public class BlockTagProvider extends BlockTagsProvider {
public static final TagKey<Block> ALTAR_WOOD = BlockTags.create(new ResourceLocation(NaturesAura.MOD_ID, "altar_wood")); public static final TagKey<Block> ALTAR_WOOD = BlockTags.create(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "altar_wood"));
public static final TagKey<Block> ALTAR_STONE = BlockTags.create(new ResourceLocation(NaturesAura.MOD_ID, "altar_stone")); public static final TagKey<Block> ALTAR_STONE = BlockTags.create(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "altar_stone"));
public static final TagKey<Block> ALTAR_GOLD_BRICK = BlockTags.create(new ResourceLocation(NaturesAura.MOD_ID, "altar_gold_brick")); public static final TagKey<Block> ALTAR_GOLD_BRICK = BlockTags.create(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "altar_gold_brick"));
public static final TagKey<Block> ALTAR_FANCY_BRICK = BlockTags.create(new ResourceLocation(NaturesAura.MOD_ID, "altar_fancy_brick")); public static final TagKey<Block> ALTAR_FANCY_BRICK = BlockTags.create(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "altar_fancy_brick"));
public BlockTagProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { public BlockTagProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper) {
super(output, lookupProvider, NaturesAura.MOD_ID, existingFileHelper); super(output, lookupProvider, NaturesAura.MOD_ID, existingFileHelper);
@ -42,21 +42,22 @@ public class BlockTagProvider extends BlockTagsProvider {
this.tag(BlockTagProvider.ALTAR_FANCY_BRICK).add(Blocks.RED_NETHER_BRICKS, Blocks.CHISELED_STONE_BRICKS); this.tag(BlockTagProvider.ALTAR_FANCY_BRICK).add(Blocks.RED_NETHER_BRICKS, Blocks.CHISELED_STONE_BRICKS);
this.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(ModBlocks.ANIMAL_CONTAINER, ModBlocks.ANIMAL_GENERATOR, this.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(ModBlocks.ANIMAL_CONTAINER, ModBlocks.ANIMAL_GENERATOR,
ModBlocks.ANIMAL_SPAWNER, ModBlocks.AURA_DETECTOR, ModBlocks.AURA_TIMER, ModBlocks.BLAST_FURNACE_BOOSTER, ModBlocks.ANIMAL_SPAWNER, ModBlocks.AURA_DETECTOR, ModBlocks.AURA_TIMER, ModBlocks.BLAST_FURNACE_BOOSTER,
ModBlocks.CHORUS_GENERATOR, ModBlocks.CHUNK_LOADER, ModBlocks.CONVERSION_CATALYST, ModBlocks.CRUSHING_CATALYST, ModBlocks.CHORUS_GENERATOR, ModBlocks.CHUNK_LOADER, ModBlocks.CONVERSION_CATALYST, ModBlocks.CRUSHING_CATALYST,
ModBlocks.DEPTH_INGOT_BLOCK, ModBlocks.ENDER_CRATE, ModBlocks.FIELD_CREATOR, ModBlocks.FIREWORK_GENERATOR, ModBlocks.DEPTH_INGOT_BLOCK, ModBlocks.ENDER_CRATE, ModBlocks.FIELD_CREATOR, ModBlocks.FIREWORK_GENERATOR,
ModBlocks.FURNACE_HEATER, ModBlocks.GENERATOR_LIMIT_REMOVER, ModBlocks.GOLD_BRICK, ModBlocks.GOLD_NETHER_BRICK, ModBlocks.FURNACE_HEATER, ModBlocks.GENERATOR_LIMIT_REMOVER, ModBlocks.GOLD_BRICK, ModBlocks.GOLD_NETHER_BRICK,
ModBlocks.GRATED_CHUTE, ModBlocks.HOPPER_UPGRADE, ModBlocks.INFUSED_BRICK, ModBlocks.INFUSED_BRICK_SLAB, ModBlocks.GRATED_CHUTE, ModBlocks.HOPPER_UPGRADE, ModBlocks.INFUSED_BRICK, ModBlocks.INFUSED_BRICK_SLAB,
ModBlocks.INFUSED_BRICK_STAIRS, ModBlocks.INFUSED_IRON_BLOCK, ModBlocks.INFUSED_SLAB, ModBlocks.INFUSED_STAIRS, ModBlocks.INFUSED_BRICK_STAIRS, ModBlocks.INFUSED_IRON_BLOCK, ModBlocks.INFUSED_SLAB, ModBlocks.INFUSED_STAIRS,
ModBlocks.INFUSED_STONE, ModBlocks.ITEM_DISTRIBUTOR, ModBlocks.LOWER_LIMITER, ModBlocks.MOSS_GENERATOR, ModBlocks.INFUSED_STONE, ModBlocks.ITEM_DISTRIBUTOR, ModBlocks.LOWER_LIMITER, ModBlocks.MOSS_GENERATOR,
ModBlocks.NATURE_ALTAR, ModBlocks.NETHER_GRASS, ModBlocks.PICKUP_STOPPER, ModBlocks.PLACER, ModBlocks.POTION_GENERATOR, ModBlocks.NATURE_ALTAR, ModBlocks.NETHER_GRASS, ModBlocks.PICKUP_STOPPER, ModBlocks.PLACER, ModBlocks.POTION_GENERATOR,
ModBlocks.POWDER_PLACER, ModBlocks.PROJECTILE_GENERATOR, ModBlocks.RF_CONVERTER, ModBlocks.SKY_INGOT_BLOCK, ModBlocks.POWDER_PLACER, ModBlocks.PROJECTILE_GENERATOR, ModBlocks.RF_CONVERTER, ModBlocks.SKY_INGOT_BLOCK,
ModBlocks.SNOW_CREATOR, ModBlocks.SPAWN_LAMP, ModBlocks.SPRING, ModBlocks.TAINTED_GOLD_BLOCK, ModBlocks.SNOW_CREATOR, ModBlocks.SPAWN_LAMP, ModBlocks.SPRING, ModBlocks.TAINTED_GOLD_BLOCK,
ModBlocks.TIME_CHANGER, ModBlocks.WEATHER_CHANGER); ModBlocks.TIME_CHANGER, ModBlocks.WEATHER_CHANGER);
this.tag(BlockTags.MINEABLE_WITH_AXE).add(ModBlocks.ANCIENT_BARK, ModBlocks.ANCIENT_LOG, this.tag(BlockTags.MINEABLE_WITH_AXE).add(ModBlocks.ANCIENT_BARK, ModBlocks.ANCIENT_LOG,
ModBlocks.ANCIENT_PLANKS, ModBlocks.ANCIENT_SLAB, ModBlocks.ANCIENT_STAIRS, ModBlocks.ANCIENT_PLANKS, ModBlocks.ANCIENT_SLAB, ModBlocks.ANCIENT_STAIRS,
ModBlocks.AUTO_CRAFTER, ModBlocks.FLOWER_GENERATOR, ModBlocks.NETHER_WART_MUSHROOM, ModBlocks.AUTO_CRAFTER, ModBlocks.FLOWER_GENERATOR, ModBlocks.NETHER_WART_MUSHROOM,
ModBlocks.OAK_GENERATOR, ModBlocks.OFFERING_TABLE, ModBlocks.WOOD_STAND); ModBlocks.OAK_GENERATOR, ModBlocks.OFFERING_TABLE, ModBlocks.WOOD_STAND);
} }
} }

View file

@ -13,7 +13,6 @@ import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
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.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider;
import net.neoforged.neoforge.data.event.GatherDataEvent; import net.neoforged.neoforge.data.event.GatherDataEvent;
import net.neoforged.neoforge.registries.DataPackRegistriesHooks; import net.neoforged.neoforge.registries.DataPackRegistriesHooks;
@ -38,7 +37,7 @@ public final class ModData {
var blockTags = new BlockTagProvider(out, lookup, existing); var blockTags = new BlockTagProvider(out, lookup, existing);
gen.addProvider(event.includeServer(), blockTags); gen.addProvider(event.includeServer(), blockTags);
gen.addProvider(event.includeServer(), new ItemTagProvider(out, lookup, blockTags.contentsGetter(), existing)); gen.addProvider(event.includeServer(), new ItemTagProvider(out, lookup, blockTags.contentsGetter(), existing));
gen.addProvider(event.includeServer(), new LootTableProvider(out, Set.of(), List.of(new LootTableProvider.SubProviderEntry(BlockLootProvider::new, LootContextParamSets.BLOCK)))); gen.addProvider(event.includeServer(), new LootTableProvider(out, Set.of(), List.of(new LootTableProvider.SubProviderEntry(BlockLootProvider::new, LootContextParamSets.BLOCK)), lookup));
gen.addProvider(event.includeServer(), new BlockStateGenerator(out, existing)); gen.addProvider(event.includeServer(), new BlockStateGenerator(out, existing));
gen.addProvider(event.includeServer(), new ItemModelGenerator(out, existing)); gen.addProvider(event.includeServer(), new ItemModelGenerator(out, existing));
gen.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(out, CompletableFuture.supplyAsync(ModData::getProvider), Set.of(NaturesAura.MOD_ID))); gen.addProvider(event.includeServer(), new DatapackBuiltinEntriesProvider(out, CompletableFuture.supplyAsync(ModData::getProvider), Set.of(NaturesAura.MOD_ID)));

View file

@ -3,8 +3,8 @@ package de.ellpeck.naturesaura.enchant;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ItemStack; 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.Enchantment;
import net.minecraft.world.item.enchantment.EnchantmentCategory;
import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.item.enchantment.Enchantments;
public class AuraMendingEnchantment extends ModEnchantment { public class AuraMendingEnchantment extends ModEnchantment {

View file

@ -51,23 +51,23 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable {
} }
@Override @Override
public void onAddedToWorld() { public void onAddedToLevel() {
super.onAddedToWorld(); super.onAddedToLevel();
this.powderListDirty = true; this.powderListDirty = true;
} }
@Override @Override
public void onRemovedFromWorld() { public void onRemovedFromLevel() {
super.onRemovedFromWorld(); super.onRemovedFromLevel();
// we pass a null effect because we want to remove our effect from the world // we pass a null effect because we want to remove our effect from the world
this.updatePowderListStatus(null); this.updatePowderListStatus(null);
} }
@Override @Override
protected void defineSynchedData() { protected void defineSynchedData(SynchedEntityData.Builder builder) {
this.entityData.define(EntityEffectInhibitor.INHIBITED_EFFECT, ""); builder.define(EntityEffectInhibitor.INHIBITED_EFFECT, "");
this.entityData.define(EntityEffectInhibitor.COLOR, 0); builder.define(EntityEffectInhibitor.COLOR, 0);
this.entityData.define(EntityEffectInhibitor.AMOUNT, 0); builder.define(EntityEffectInhibitor.AMOUNT, 0);
} }
@Override @Override
@ -94,13 +94,13 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable {
if (this.level().isClientSide) { if (this.level().isClientSide) {
if (this.level().getGameTime() % 5 == 0) { if (this.level().getGameTime() % 5 == 0) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
this.getX() + this.level().random.nextGaussian() * 0.1F, this.getX() + this.level().random.nextGaussian() * 0.1F,
this.getY(), this.getY(),
this.getZ() + this.level().random.nextGaussian() * 0.1F, this.getZ() + this.level().random.nextGaussian() * 0.1F,
this.level().random.nextGaussian() * 0.005F, this.level().random.nextGaussian() * 0.005F,
this.level().random.nextFloat() * 0.03F, this.level().random.nextFloat() * 0.03F,
this.level().random.nextGaussian() * 0.005F, this.level().random.nextGaussian() * 0.005F,
this.getColor(), this.level().random.nextFloat() * 3F + 1F, 120, 0F, true, true); this.getColor(), this.level().random.nextFloat() * 3F + 1F, 120, 0F, true, true);
} }
this.renderTicks++; this.renderTicks++;
} }
@ -108,7 +108,7 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable {
@Override @Override
protected void readAdditionalSaveData(CompoundTag compound) { protected void readAdditionalSaveData(CompoundTag compound) {
this.setInhibitedEffect(new ResourceLocation(compound.getString("effect"))); this.setInhibitedEffect(ResourceLocation.parse(compound.getString("effect")));
this.setColor(compound.getInt("color")); this.setColor(compound.getInt("color"));
this.setAmount(compound.contains("amount") ? compound.getInt("amount") : 24); this.setAmount(compound.contains("amount") ? compound.getInt("amount") : 24);
} }
@ -156,7 +156,7 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable {
var effect = this.entityData.get(EntityEffectInhibitor.INHIBITED_EFFECT); var effect = this.entityData.get(EntityEffectInhibitor.INHIBITED_EFFECT);
if (effect == null || effect.isEmpty()) if (effect == null || effect.isEmpty())
return null; return null;
return new ResourceLocation(effect); return ResourceLocation.parse(effect);
} }
public void setInhibitedEffect(ResourceLocation effect) { public void setInhibitedEffect(ResourceLocation effect) {

View file

@ -2,6 +2,7 @@ package de.ellpeck.naturesaura.entities;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.blocks.ModBlocks; import de.ellpeck.naturesaura.blocks.ModBlocks;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
@ -22,7 +23,7 @@ public class EntityLightProjectile extends ThrowableProjectile {
} }
@Override @Override
protected void defineSynchedData() { protected void defineSynchedData(SynchedEntityData.Builder builder) {
} }
@ -32,11 +33,11 @@ public class EntityLightProjectile extends ThrowableProjectile {
if (this.level().isClientSide && this.tickCount > 1) { if (this.level().isClientSide && this.tickCount > 1) {
for (float i = 0; i <= 1; i += 0.2F) { for (float i = 0; i <= 1; i += 0.2F) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
Mth.lerp(i, this.xOld, this.getX()), Mth.lerp(i, this.xOld, this.getX()),
Mth.lerp(i, this.yOld, this.getY()), Mth.lerp(i, this.yOld, this.getY()),
Mth.lerp(i, this.zOld, this.getZ()), Mth.lerp(i, this.zOld, this.getZ()),
this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F, this.random.nextGaussian() * 0.01F,
0xffcb5c, this.random.nextFloat() * 0.5F + 1, 20, 0, false, true); 0xffcb5c, this.random.nextFloat() * 0.5F + 1, 20, 0, false, true);
} }
} }
} }
@ -50,7 +51,7 @@ public class EntityLightProjectile extends ThrowableProjectile {
if (state.canBeReplaced()) if (state.canBeReplaced())
this.level().setBlockAndUpdate(pos, ModBlocks.LIGHT.defaultBlockState()); this.level().setBlockAndUpdate(pos, ModBlocks.LIGHT.defaultBlockState());
} else if (result instanceof EntityHitResult entity) { } else if (result instanceof EntityHitResult entity) {
entity.getEntity().setSecondsOnFire(5); entity.getEntity().setRemainingFireTicks(5 * 20);
} }
} }
this.discard(); this.discard();

View file

@ -9,7 +9,6 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.LongTag; import net.minecraft.nbt.LongTag;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
@ -23,10 +22,9 @@ import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.portal.DimensionTransition;
import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult;
import net.neoforged.neoforge.common.util.ITeleporter;
import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -57,8 +55,8 @@ public class EntityMoverMinecart extends Minecart {
if (!this.spotOffsets.isEmpty() && this.level().getGameTime() % 10 == 0) if (!this.spotOffsets.isEmpty() && this.level().getGameTime() % 10 == 0)
PacketHandler.sendToAllAround(this.level(), pos, 32, new PacketParticles( PacketHandler.sendToAllAround(this.level(), pos, 32, new PacketParticles(
(float) this.getX(), (float) this.getY(), (float) this.getZ(), PacketParticles.Type.MOVER_CART, (float) this.getX(), (float) this.getY(), (float) this.getZ(), PacketParticles.Type.MOVER_CART,
Mth.floor(this.getDeltaMovement().x * 100F), Mth.floor(this.getDeltaMovement().y * 100F), Mth.floor(this.getDeltaMovement().z * 100F))); Mth.floor(this.getDeltaMovement().x * 100F), Mth.floor(this.getDeltaMovement().y * 100F), Mth.floor(this.getDeltaMovement().z * 100F)));
if (pos.distSqr(this.lastPosition) < 8 * 8) if (pos.distSqr(this.lastPosition) < 8 * 8)
return; return;
@ -113,8 +111,8 @@ public class EntityMoverMinecart extends Minecart {
} }
@Override @Override
public CompoundTag serializeNBT() { protected void addAdditionalSaveData(CompoundTag compound) {
var compound = super.serializeNBT(); super.addAdditionalSaveData(compound);
compound.putBoolean("active", this.isActive); compound.putBoolean("active", this.isActive);
compound.putLong("last_pos", this.lastPosition.asLong()); compound.putLong("last_pos", this.lastPosition.asLong());
@ -122,12 +120,11 @@ public class EntityMoverMinecart extends Minecart {
for (var offset : this.spotOffsets) for (var offset : this.spotOffsets)
list.add(LongTag.valueOf(offset.asLong())); list.add(LongTag.valueOf(offset.asLong()));
compound.put("offsets", list); compound.put("offsets", list);
return compound;
} }
@Override @Override
public void deserializeNBT(CompoundTag compound) { protected void readAdditionalSaveData(CompoundTag compound) {
super.deserializeNBT(compound); super.readAdditionalSaveData(compound);
this.isActive = compound.getBoolean("active"); this.isActive = compound.getBoolean("active");
this.lastPosition = BlockPos.of(compound.getLong("last_pos")); this.lastPosition = BlockPos.of(compound.getLong("last_pos"));
@ -137,10 +134,9 @@ public class EntityMoverMinecart extends Minecart {
this.spotOffsets.add(BlockPos.of(((LongTag) base).getAsLong())); this.spotOffsets.add(BlockPos.of(((LongTag) base).getAsLong()));
} }
@Nullable
@Override @Override
public Entity changeDimension(ServerLevel destination, ITeleporter teleporter) { public @org.jetbrains.annotations.Nullable Entity changeDimension(DimensionTransition transition) {
var entity = super.changeDimension(destination, teleporter); var entity = super.changeDimension(transition);
if (entity instanceof EntityMoverMinecart) { if (entity instanceof EntityMoverMinecart) {
var pos = entity.blockPosition(); var pos = entity.blockPosition();
this.moveAura(this.level(), this.lastPosition, entity.level(), pos); this.moveAura(this.level(), this.lastPosition, entity.level(), pos);
@ -179,4 +175,5 @@ public class EntityMoverMinecart extends Minecart {
public InteractionResult interact(Player p_38483_, InteractionHand p_38484_) { public InteractionResult interact(Player p_38483_, InteractionHand p_38484_) {
return InteractionResult.PASS; return InteractionResult.PASS;
} }
} }

View file

@ -32,9 +32,9 @@ public class EntityStructureFinder extends EyeOfEnder {
} }
@Override @Override
protected void defineSynchedData() { protected void defineSynchedData(SynchedEntityData.Builder builder) {
super.defineSynchedData(); super.defineSynchedData(builder);
this.entityData.define(EntityStructureFinder.COLOR, 0); builder.define(EntityStructureFinder.COLOR, 0);
} }
@Override @Override

View file

@ -18,11 +18,12 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MinecartRenderer; import net.minecraft.client.renderer.entity.MinecartRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FastColor;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
public class RenderMoverMinecart extends MinecartRenderer<EntityMoverMinecart> { public class RenderMoverMinecart extends MinecartRenderer<EntityMoverMinecart> {
private static final ResourceLocation RES = new ResourceLocation(NaturesAura.MOD_ID, "textures/models/mover_cart.png"); private static final ResourceLocation RES = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/models/mover_cart.png");
public RenderMoverMinecart(EntityRendererProvider.Context p_174300_) { public RenderMoverMinecart(EntityRendererProvider.Context p_174300_) {
super(p_174300_, ModelLayers.MINECART); super(p_174300_, ModelLayers.MINECART);
@ -36,7 +37,7 @@ public class RenderMoverMinecart extends MinecartRenderer<EntityMoverMinecart> {
matrixStackIn.translate(0, 22 / 16F, 0); matrixStackIn.translate(0, 22 / 16F, 0);
matrixStackIn.translate(0, 0, 1); matrixStackIn.translate(0, 0, 1);
matrixStackIn.mulPose(Axis.XP.rotationDegrees(180)); matrixStackIn.mulPose(Axis.XP.rotationDegrees(180));
this.model.renderToBuffer(matrixStackIn, bufferIn.getBuffer(this.model.renderType(RenderMoverMinecart.RES)), packedLightIn, OverlayTexture.NO_OVERLAY, 1, 1, 1, 1); this.model.renderToBuffer(matrixStackIn, bufferIn.getBuffer(this.model.renderType(RenderMoverMinecart.RES)), packedLightIn, OverlayTexture.NO_OVERLAY, FastColor.ARGB32.colorFromFloat(1, 1, 1, 1));
matrixStackIn.popPose(); matrixStackIn.popPose();
} }
@ -53,8 +54,10 @@ public class RenderMoverMinecart extends MinecartRenderer<EntityMoverMinecart> {
} }
@Override @Override
public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, int color) {
this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, red, green, blue, alpha); this.model.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn, color);
} }
} }
} }

View file

@ -2,10 +2,7 @@ package de.ellpeck.naturesaura.events;
import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.*;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat;
import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
@ -40,15 +37,14 @@ import net.minecraft.world.level.block.MyceliumBlock;
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.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent;
import net.neoforged.neoforge.client.event.RenderGuiOverlayEvent;
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
import net.neoforged.neoforge.client.gui.overlay.VanillaGuiOverlay;
import net.neoforged.neoforge.common.IPlantable;
import net.neoforged.neoforge.energy.EnergyStorage;
import net.neoforged.neoforge.event.TickEvent;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.neoforge.capabilities.Capabilities;
import net.neoforged.neoforge.client.event.ClientTickEvent;
import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent;
import net.neoforged.neoforge.client.event.RenderGuiLayerEvent;
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
import net.neoforged.neoforge.client.gui.VanillaGuiLayers;
import net.neoforged.neoforge.energy.EnergyStorage;
import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableInt;
import java.text.NumberFormat; import java.text.NumberFormat;
@ -60,8 +56,8 @@ import java.util.Map;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class ClientEvents { public class ClientEvents {
public static final ResourceLocation OVERLAYS = new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/overlays.png"); public static final ResourceLocation OVERLAYS = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/overlays.png");
public static final ResourceLocation BOOK_GUI = new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/book.png"); public static final ResourceLocation BOOK_GUI = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/gui/book.png");
public static final List<PacketAuraChunk> PENDING_AURA_CHUNKS = new ArrayList<>(); public static final List<PacketAuraChunk> PENDING_AURA_CHUNKS = new ArrayList<>();
private static final ItemStack ITEM_FRAME = new ItemStack(Items.ITEM_FRAME); private static final ItemStack ITEM_FRAME = new ItemStack(Items.ITEM_FRAME);
private static final ItemStack DISPENSER = new ItemStack(Blocks.DISPENSER); private static final ItemStack DISPENSER = new ItemStack(Blocks.DISPENSER);
@ -95,74 +91,72 @@ public class ClientEvents {
} }
@SubscribeEvent @SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) { public void onClientTick(ClientTickEvent.Post event) {
if (event.phase != TickEvent.Phase.END) { ClientEvents.heldCache = ItemStack.EMPTY;
ClientEvents.heldCache = ItemStack.EMPTY; ClientEvents.heldEye = ItemStack.EMPTY;
ClientEvents.heldEye = ItemStack.EMPTY; ClientEvents.heldOcular = ItemStack.EMPTY;
ClientEvents.heldOcular = ItemStack.EMPTY;
var mc = Minecraft.getInstance(); var mc = Minecraft.getInstance();
if (mc.level == null) { if (mc.level == null) {
ItemRangeVisualizer.clear(); ItemRangeVisualizer.clear();
ClientEvents.PENDING_AURA_CHUNKS.clear(); ClientEvents.PENDING_AURA_CHUNKS.clear();
} else { } else {
ClientEvents.PENDING_AURA_CHUNKS.removeIf(next -> next.tryHandle(mc.level)); ClientEvents.PENDING_AURA_CHUNKS.removeIf(next -> next.tryHandle(mc.level));
if (!mc.isPaused()) { if (!mc.isPaused()) {
if (mc.level.getGameTime() % 20 == 0) { if (mc.level.getGameTime() % 20 == 0) {
var amount = Mth.floor(190 * ModConfig.instance.excessParticleAmount.get()); var amount = Mth.floor(190 * ModConfig.instance.excessParticleAmount.get());
for (var i = 0; i < amount; i++) { for (var i = 0; i < amount; i++) {
var x = Mth.floor(mc.player.getX()) + mc.level.random.nextInt(64) - 32; var x = Mth.floor(mc.player.getX()) + mc.level.random.nextInt(64) - 32;
var y = Mth.floor(mc.player.getY()) + mc.level.random.nextInt(32) - 16; var y = Mth.floor(mc.player.getY()) + mc.level.random.nextInt(32) - 16;
var z = Mth.floor(mc.player.getZ()) + mc.level.random.nextInt(64) - 32; var z = Mth.floor(mc.player.getZ()) + mc.level.random.nextInt(64) - 32;
var pos = Helper.getClosestAirAboveGround(mc.level, new BlockPos(x, y, z), 16).below(); var pos = Helper.getClosestAirAboveGround(mc.level, new BlockPos(x, y, z), 16).below();
var state = mc.level.getBlockState(pos); var state = mc.level.getBlockState(pos);
var block = state.getBlock(); var block = state.getBlock();
if (block instanceof BonemealableBlock || block instanceof IPlantable || block instanceof LeavesBlock || block instanceof MyceliumBlock) { if (block instanceof BonemealableBlock || block instanceof LeavesBlock || block instanceof MyceliumBlock) {
var excess = IAuraChunk.triangulateAuraInArea(mc.level, pos, 45) - IAuraChunk.DEFAULT_AURA; var excess = IAuraChunk.triangulateAuraInArea(mc.level, pos, 45) - IAuraChunk.DEFAULT_AURA;
if (excess > 0) { if (excess > 0) {
var chance = Math.max(10, 50 - excess / 25000); var chance = Math.max(10, 50 - excess / 25000);
if (mc.level.random.nextInt(chance) <= 0) if (mc.level.random.nextInt(chance) <= 0)
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
pos.getX() + mc.level.random.nextFloat(), pos.getX() + mc.level.random.nextFloat(),
pos.getY() + 0.5F, pos.getY() + 0.5F,
pos.getZ() + mc.level.random.nextFloat(), pos.getZ() + mc.level.random.nextFloat(),
mc.level.random.nextGaussian() * 0.01F, mc.level.random.nextGaussian() * 0.01F,
mc.level.random.nextFloat() * 0.025F, mc.level.random.nextFloat() * 0.025F,
mc.level.random.nextGaussian() * 0.01F, mc.level.random.nextGaussian() * 0.01F,
block instanceof MyceliumBlock ? 0x875ca1 : BiomeColors.getAverageGrassColor(mc.level, pos), block instanceof MyceliumBlock ? 0x875ca1 : BiomeColors.getAverageGrassColor(mc.level, pos),
Math.min(2F, 1F + mc.level.random.nextFloat() * (excess / 30000F)), Math.min(2F, 1F + mc.level.random.nextFloat() * (excess / 30000F)),
Math.min(300, 100 + mc.level.random.nextInt(excess / 3000 + 1)), Math.min(300, 100 + mc.level.random.nextInt(excess / 3000 + 1)),
0F, false, true); 0F, false, true);
}
} }
} }
} }
}
if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER) && mc.level.getGameTime() % 5 == 0) { if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER) && mc.level.getGameTime() % 5 == 0) {
var inst = NaturesAuraAPI.instance(); var inst = NaturesAuraAPI.instance();
inst.setParticleSpawnRange(512); inst.setParticleSpawnRange(512);
inst.setParticleDepth(false); inst.setParticleDepth(false);
for (var pos : ItemRangeVisualizer.VISUALIZED_RAILS.get(mc.level.dimension().location())) { for (var pos : ItemRangeVisualizer.VISUALIZED_RAILS.get(mc.level.dimension().location())) {
NaturesAuraAPI.instance().spawnMagicParticle( NaturesAuraAPI.instance().spawnMagicParticle(
pos.getX() + mc.level.random.nextFloat(), pos.getX() + mc.level.random.nextFloat(),
pos.getY() + mc.level.random.nextFloat(), pos.getY() + mc.level.random.nextFloat(),
pos.getZ() + mc.level.random.nextFloat(), pos.getZ() + mc.level.random.nextFloat(),
0F, 0F, 0F, 0xe0faff, mc.level.random.nextFloat() * 5 + 1, 100, 0F, false, true); 0F, 0F, 0F, 0xe0faff, mc.level.random.nextFloat() * 5 + 1, 100, 0F, false, true);
}
inst.setParticleDepth(true);
inst.setParticleSpawnRange(32);
} }
inst.setParticleDepth(true);
inst.setParticleSpawnRange(32);
}
ClientEvents.heldCache = Helper.getEquippedItem(s -> s.getItem() instanceof ItemAuraCache, mc.player, false); ClientEvents.heldCache = Helper.getEquippedItem(s -> s.getItem() instanceof ItemAuraCache, mc.player, false);
ClientEvents.heldEye = Helper.getEquippedItem(s -> s.getItem() == ModItems.EYE, mc.player, true); ClientEvents.heldEye = Helper.getEquippedItem(s -> s.getItem() == ModItems.EYE, mc.player, true);
ClientEvents.heldOcular = Helper.getEquippedItem(s -> s.getItem() == ModItems.EYE_IMPROVED, mc.player, false); ClientEvents.heldOcular = Helper.getEquippedItem(s -> s.getItem() == ModItems.EYE_IMPROVED, mc.player, false);
if (!ClientEvents.heldOcular.isEmpty() && mc.level.getGameTime() % 20 == 0) { if (!ClientEvents.heldOcular.isEmpty() && mc.level.getGameTime() % 20 == 0) {
ClientEvents.SHOWING_EFFECTS.clear(); ClientEvents.SHOWING_EFFECTS.clear();
Helper.getAuraChunksWithSpotsInArea(mc.level, mc.player.blockPosition(), 100, Helper.getAuraChunksWithSpotsInArea(mc.level, mc.player.blockPosition(), 100,
chunk -> chunk.getActiveEffectIcons(mc.player, ClientEvents.SHOWING_EFFECTS)); chunk -> chunk.getActiveEffectIcons(mc.player, ClientEvents.SHOWING_EFFECTS));
}
} }
} }
} }
@ -175,15 +169,14 @@ public class ClientEvents {
var mc = Minecraft.getInstance(); var mc = Minecraft.getInstance();
var view = mc.gameRenderer.getMainCamera().getPosition(); var view = mc.gameRenderer.getMainCamera().getPosition();
var tesselator = Tesselator.getInstance(); var tesselator = Tesselator.getInstance();
var buffer = tesselator.getBuilder();
mc.getProfiler().push(NaturesAura.MOD_ID + ":onLevelRender"); mc.getProfiler().push(NaturesAura.MOD_ID + ":onLevelRender");
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
var mv = RenderSystem.getModelViewStack(); var mv = RenderSystem.getModelViewStack();
mv.pushPose(); mv.pushMatrix();
mv.mulPoseMatrix(event.getPoseStack().last().pose()); mv.mul(event.getPoseStack().last().pose());
mv.translate(-view.x, -view.y, -view.z); mv.translate((float) -view.x, (float) -view.y, (float) -view.z);
RenderSystem.applyModelViewMatrix(); RenderSystem.applyModelViewMatrix();
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.setShader(GameRenderer::getPositionColorShader); RenderSystem.setShader(GameRenderer::getPositionColorShader);
@ -192,12 +185,12 @@ public class ClientEvents {
// aura spot debug // aura spot debug
ClientEvents.hoveringAuraSpot = null; ClientEvents.hoveringAuraSpot = null;
if (mc.getDebugOverlay().showDebugScreen() && (mc.player.isCreative() || mc.player.isSpectator()) && ModConfig.instance.debugLevel.get()) { if (mc.getDebugOverlay().showDebugScreen() && (mc.player.isCreative() || mc.player.isSpectator()) && ModConfig.instance.debugLevel.get()) {
var playerEye = mc.player.getEyePosition(event.getPartialTick()); var playerEye = mc.player.getEyePosition(event.getPartialTick().getGameTimeDeltaPartialTick(true));
var playerView = mc.player.getViewVector(event.getPartialTick()).normalize(); var playerView = mc.player.getViewVector(event.getPartialTick().getGameTimeDeltaPartialTick(true)).normalize();
var range = mc.gameMode.getPickRange(); var range = mc.gameMode.getDestroyStage();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); var builder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
IAuraChunk.getSpotsInArea(mc.level, mc.player.blockPosition(), 64, (pos, spot) -> { IAuraChunk.getSpotsInArea(mc.level, mc.player.blockPosition(), 64, (pos, spot) -> {
Helper.renderWeirdBox(buffer, pos.getX(), pos.getY(), pos.getZ(), 1, 1, 1, spot > 0 ? 0F : 1F, spot > 0 ? 1F : 0F, 0F, 0.35F); Helper.renderWeirdBox(builder, pos.getX(), pos.getY(), pos.getZ(), 1, 1, 1, spot > 0 ? 0F : 1F, spot > 0 ? 1F : 0F, 0F, 0.35F);
// dirty raytrace to see if we're looking at roughly this spot // dirty raytrace to see if we're looking at roughly this spot
if (playerEye.distanceToSqr(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5) <= range * range) { if (playerEye.distanceToSqr(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5) <= range * range) {
for (var d = 0F; d <= range; d += 0.5F) { for (var d = 0F; d <= range; d += 0.5F) {
@ -209,14 +202,14 @@ public class ClientEvents {
} }
}); });
tesselator.end(); BufferUploader.drawWithShader(builder.build());
} }
// range visualizer // range visualizer
if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER)) { if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER)) {
RenderSystem.disableCull(); RenderSystem.disableCull();
var dim = mc.level.dimension().location(); var dim = mc.level.dimension().location();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); var builder = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
for (var pos : ItemRangeVisualizer.VISUALIZED_BLOCKS.get(dim)) { for (var pos : ItemRangeVisualizer.VISUALIZED_BLOCKS.get(dim)) {
if (!mc.level.isLoaded(pos)) if (!mc.level.isLoaded(pos))
continue; continue;
@ -224,18 +217,18 @@ public class ClientEvents {
var block = state.getBlock(); var block = state.getBlock();
if (!(block instanceof IVisualizable)) if (!(block instanceof IVisualizable))
continue; continue;
this.renderVisualize(buffer, (IVisualizable) block, mc.level, pos); this.renderVisualize(builder, (IVisualizable) block, mc.level, pos);
} }
for (var entity : ItemRangeVisualizer.VISUALIZED_ENTITIES.get(dim)) { for (var entity : ItemRangeVisualizer.VISUALIZED_ENTITIES.get(dim)) {
if (!entity.isAlive() || !(entity instanceof IVisualizable)) if (!entity.isAlive() || !(entity instanceof IVisualizable))
continue; continue;
this.renderVisualize(buffer, (IVisualizable) entity, mc.level, entity.blockPosition()); this.renderVisualize(builder, (IVisualizable) entity, mc.level, entity.blockPosition());
} }
tesselator.end(); BufferUploader.drawWithShader(builder.build());
RenderSystem.enableCull(); RenderSystem.enableCull();
} }
mv.popPose(); mv.popMatrix();
RenderSystem.applyModelViewMatrix(); RenderSystem.applyModelViewMatrix();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
@ -247,17 +240,17 @@ public class ClientEvents {
if (box != null) { if (box != null) {
box = box.inflate(0.05F); box = box.inflate(0.05F);
var color = visualize.getVisualizationColor(level, pos); var color = visualize.getVisualizationColor(level, pos);
Helper.renderWeirdBox(buffer, box.minX, box.minY, box.minZ, box.maxX - box.minX, box.maxY - box.minY, box.maxZ - box.minZ, (color >> 16 & 255) / 255F, (color >> 8 & 255) / 255F, (color & 255) / 255F, 0.5F); Helper.renderWeirdBox(buffer, (float) box.minX, (float) box.minY, (float) box.minZ, (float) (box.maxX - box.minX), (float) (box.maxY - box.minY), (float) (box.maxZ - box.minZ), (color >> 16 & 255) / 255F, (color >> 8 & 255) / 255F, (color & 255) / 255F, 0.5F);
} }
} }
@SubscribeEvent @SubscribeEvent
public void onOverlayRender(RenderGuiOverlayEvent.Post event) { public void onOverlayRender(RenderGuiLayerEvent.Post event) {
var mc = Minecraft.getInstance(); var mc = Minecraft.getInstance();
var graphics = event.getGuiGraphics(); var graphics = event.getGuiGraphics();
var stack = graphics.pose(); var stack = graphics.pose();
if (event.getOverlay() == VanillaGuiOverlay.HOTBAR.type()) { if (event.getName() == VanillaGuiLayers.HOTBAR) {
var res = event.getWindow(); var res = mc.getWindow();
if (mc.player != null) { if (mc.player != null) {
if (!ClientEvents.heldCache.isEmpty()) { if (!ClientEvents.heldCache.isEmpty()) {
var container = ClientEvents.heldCache.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY, null); var container = ClientEvents.heldCache.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY, null);
@ -368,7 +361,7 @@ public class ClientEvents {
var state = mc.level.getBlockState(pos); var state = mc.level.getBlockState(pos);
var blockStack = state.getBlock().getCloneItemStack(state, blockHitResult, mc.level, pos, mc.player); var blockStack = state.getBlock().getCloneItemStack(state, blockHitResult, mc.level, pos, mc.player);
this.drawContainerInfo(graphics, container.getStoredAura(), container.getMaxAura(), container.getAuraColor(), this.drawContainerInfo(graphics, container.getStoredAura(), container.getMaxAura(), container.getAuraColor(),
mc, res, 35, blockStack.getHoverName().getString(), null); mc, res, 35, blockStack.getHoverName().getString(), null);
if (tile instanceof BlockEntityNatureAltar) { if (tile instanceof BlockEntityNatureAltar) {
var itemHandler = tile.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, tile.getBlockPos(), tile.getBlockState(), tile, null); var itemHandler = tile.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, tile.getBlockPos(), tile.getBlockState(), tile, null);
@ -377,23 +370,23 @@ public class ClientEvents {
var stackCont = tileStack.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY); var stackCont = tileStack.getCapability(NaturesAuraAPI.AURA_CONTAINER_ITEM_CAPABILITY);
if (stackCont != null) { if (stackCont != null) {
this.drawContainerInfo(graphics, stackCont.getStoredAura(), stackCont.getMaxAura(), stackCont.getAuraColor(), this.drawContainerInfo(graphics, stackCont.getStoredAura(), stackCont.getMaxAura(), stackCont.getAuraColor(),
mc, res, 55, tileStack.getHoverName().getString(), null); mc, res, 55, tileStack.getHoverName().getString(), null);
} }
} }
} }
} else if (tile instanceof BlockEntityRFConverter) { } else if (tile instanceof BlockEntityRFConverter) {
EnergyStorage storage = ((BlockEntityRFConverter) tile).storage; EnergyStorage storage = ((BlockEntityRFConverter) tile).storage;
this.drawContainerInfo(graphics, storage.getEnergyStored(), storage.getMaxEnergyStored(), 0xcc4916, this.drawContainerInfo(graphics, storage.getEnergyStored(), storage.getMaxEnergyStored(), 0xcc4916,
mc, res, 35, I18n.get("block.naturesaura.rf_converter"), mc, res, 35, I18n.get("block.naturesaura.rf_converter"),
storage.getEnergyStored() + " / " + storage.getMaxEnergyStored() + " RF"); storage.getEnergyStored() + " / " + storage.getMaxEnergyStored() + " RF");
} else if (tile instanceof BlockEntityGratedChute chute) { } else if (tile instanceof BlockEntityGratedChute chute) {
var itemHandler = tile.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, tile.getBlockPos(), tile.getBlockState(), tile, null); var itemHandler = tile.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, tile.getBlockPos(), tile.getBlockState(), tile, null);
var itemStack = itemHandler.getStackInSlot(0); var itemStack = itemHandler.getStackInSlot(0);
if (itemStack.isEmpty()) { if (itemStack.isEmpty()) {
graphics.drawString(mc.font, graphics.drawString(mc.font,
ChatFormatting.GRAY.toString() + ChatFormatting.ITALIC + I18n.get("info.naturesaura.empty"), ChatFormatting.GRAY.toString() + ChatFormatting.ITALIC + I18n.get("info.naturesaura.empty"),
x + 5, y - 11, 0xFFFFFF); x + 5, y - 11, 0xFFFFFF);
} else { } else {
Helper.renderItemInGui(graphics, itemStack, x + 2, y - 18, 1F); Helper.renderItemInGui(graphics, itemStack, x + 2, y - 18, 1F);
} }

View file

@ -19,13 +19,14 @@ import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.neoforged.neoforge.event.TickEvent;
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
import net.neoforged.neoforge.event.level.ChunkEvent; import net.neoforged.neoforge.event.level.ChunkEvent;
import net.neoforged.neoforge.event.level.ChunkWatchEvent; import net.neoforged.neoforge.event.level.ChunkWatchEvent;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.util.ObfuscationReflectionHelper; import net.neoforged.fml.util.ObfuscationReflectionHelper;
import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.tick.LevelTickEvent;
import net.neoforged.neoforge.event.tick.PlayerTickEvent;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -65,12 +66,12 @@ public class CommonEvents {
@SubscribeEvent @SubscribeEvent
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void onLevelTick(TickEvent.LevelTickEvent event) { public void onLevelTick(LevelTickEvent.Post event) {
if (!event.level.isClientSide && event.phase == TickEvent.Phase.END) { if (!event.getLevel().isClientSide) {
if (event.level.getGameTime() % 20 == 0) { if (event.getLevel().getGameTime() % 20 == 0) {
event.level.getProfiler().push(NaturesAura.MOD_ID + ":onLevelTick"); event.getLevel().getProfiler().push(NaturesAura.MOD_ID + ":onLevelTick");
try { try {
var manager = ((ServerChunkCache) event.level.getChunkSource()).chunkMap; var manager = ((ServerChunkCache) event.getLevel().getChunkSource()).chunkMap;
var chunks = (Iterable<ChunkHolder>) CommonEvents.GET_LOADED_CHUNKS_METHOD.invoke(manager); var chunks = (Iterable<ChunkHolder>) CommonEvents.GET_LOADED_CHUNKS_METHOD.invoke(manager);
for (var holder : chunks) { for (var holder : chunks) {
var chunk = holder.getTickingChunk(); var chunk = holder.getTickingChunk();
@ -83,27 +84,27 @@ public class CommonEvents {
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
NaturesAura.LOGGER.fatal(e); NaturesAura.LOGGER.fatal(e);
} }
event.level.getProfiler().pop(); event.getLevel().getProfiler().pop();
} }
} }
} }
@SubscribeEvent @SubscribeEvent
public void onPlayerTick(TickEvent.PlayerTickEvent event) { public void onPlayerTick(PlayerTickEvent.Post event) {
if (!event.player.level().isClientSide && event.phase == TickEvent.Phase.END) { if (!event.getEntity().level().isClientSide) {
if (event.player.level().getGameTime() % 10 == 0) { if (event.getEntity().level().getGameTime() % 10 == 0) {
var pending = CommonEvents.PENDING_AURA_CHUNKS.get(event.player.getUUID()); var pending = CommonEvents.PENDING_AURA_CHUNKS.get(event.getEntity().getUUID());
pending.removeIf(p -> this.handleChunkWatchDeferred(event.player, p)); pending.removeIf(p -> this.handleChunkWatchDeferred(event.getEntity(), p));
} }
if (event.player.level().getGameTime() % 200 != 0) if (event.getEntity().level().getGameTime() % 200 != 0)
return; return;
var aura = IAuraChunk.triangulateAuraInArea(event.player.level(), event.player.blockPosition(), 25); var aura = IAuraChunk.triangulateAuraInArea(event.getEntity().level(), event.getEntity().blockPosition(), 25);
if (aura <= 0) if (aura <= 0)
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "negative_imbalance"), "triggered_in_code"); Helper.addAdvancement(event.getEntity(), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "negative_imbalance"), "triggered_in_code");
else if (aura >= 1500000) else if (aura >= 1500000)
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "positive_imbalance"), "triggered_in_code"); Helper.addAdvancement(event.getEntity(), ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "positive_imbalance"), "triggered_in_code");
} }
} }

View file

@ -1,9 +1,8 @@
package de.ellpeck.naturesaura.gen; package de.ellpeck.naturesaura.gen;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext; import net.minecraft.data.worldgen.BootstrapContext;
import net.minecraft.data.worldgen.features.FeatureUtils; import net.minecraft.data.worldgen.features.FeatureUtils;
import net.minecraft.data.worldgen.placement.PlacementUtils; import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
@ -13,7 +12,7 @@ import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConf
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature;
@SuppressWarnings("NonConstantFieldWithUpperCaseName") @SuppressWarnings({"NonConstantFieldWithUpperCaseName", "FieldNamingConvention"})
public final class ModFeatures { public final class ModFeatures {
public static Feature<TreeConfiguration> ANCIENT_TREE; public static Feature<TreeConfiguration> ANCIENT_TREE;
@ -26,16 +25,15 @@ public final class ModFeatures {
public static final class Configured { public static final class Configured {
public static ResourceKey<ConfiguredFeature<?, ?>> ANCIENT_TREE = FeatureUtils.createKey(NaturesAura.MOD_ID + ":ancient_tree"); public static final ResourceKey<ConfiguredFeature<?, ?>> ANCIENT_TREE = FeatureUtils.createKey(NaturesAura.MOD_ID + ":ancient_tree");
public static ResourceKey<ConfiguredFeature<?, ?>> NETHER_WART_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":nether_wart_mushroom"); public static final ResourceKey<ConfiguredFeature<?, ?>> NETHER_WART_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":nether_wart_mushroom");
public static ResourceKey<ConfiguredFeature<?, ?>> AURA_BLOOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_bloom"); public static final ResourceKey<ConfiguredFeature<?, ?>> AURA_BLOOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_bloom");
public static ResourceKey<ConfiguredFeature<?, ?>> AURA_CACTUS = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_cactus"); public static final ResourceKey<ConfiguredFeature<?, ?>> AURA_CACTUS = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_cactus");
public static ResourceKey<ConfiguredFeature<?, ?>> WARPED_AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":warped_aura_mushroom"); public static final ResourceKey<ConfiguredFeature<?, ?>> WARPED_AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":warped_aura_mushroom");
public static ResourceKey<ConfiguredFeature<?, ?>> CRIMSON_AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":crimson_aura_mushroom"); public static final ResourceKey<ConfiguredFeature<?, ?>> CRIMSON_AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":crimson_aura_mushroom");
public static ResourceKey<ConfiguredFeature<?, ?>> AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_mushroom"); public static final ResourceKey<ConfiguredFeature<?, ?>> AURA_MUSHROOM = FeatureUtils.createKey(NaturesAura.MOD_ID + ":aura_mushroom");
public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) {
public static void bootstrap(BootstapContext<ConfiguredFeature<?, ?>> context) {
FeatureUtils.register(context, ModFeatures.Configured.AURA_BLOOM, ModFeatures.AURA_BLOOM, NoneFeatureConfiguration.INSTANCE); FeatureUtils.register(context, ModFeatures.Configured.AURA_BLOOM, ModFeatures.AURA_BLOOM, NoneFeatureConfiguration.INSTANCE);
FeatureUtils.register(context, ModFeatures.Configured.AURA_CACTUS, ModFeatures.AURA_CACTUS, NoneFeatureConfiguration.INSTANCE); FeatureUtils.register(context, ModFeatures.Configured.AURA_CACTUS, ModFeatures.AURA_CACTUS, NoneFeatureConfiguration.INSTANCE);
FeatureUtils.register(context, ModFeatures.Configured.WARPED_AURA_MUSHROOM, ModFeatures.WARPED_AURA_MUSHROOM, NoneFeatureConfiguration.INSTANCE); FeatureUtils.register(context, ModFeatures.Configured.WARPED_AURA_MUSHROOM, ModFeatures.WARPED_AURA_MUSHROOM, NoneFeatureConfiguration.INSTANCE);
@ -45,25 +43,28 @@ public final class ModFeatures {
FeatureUtils.register(context, ModFeatures.Configured.NETHER_WART_MUSHROOM, ModFeatures.NETHER_WART_MUSHROOM, NoneFeatureConfiguration.INSTANCE); FeatureUtils.register(context, ModFeatures.Configured.NETHER_WART_MUSHROOM, ModFeatures.NETHER_WART_MUSHROOM, NoneFeatureConfiguration.INSTANCE);
} }
} }
public static final class Placed { public static final class Placed {
public static ResourceKey<PlacedFeature> AURA_BLOOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_bloom"); public static final ResourceKey<PlacedFeature> AURA_BLOOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_bloom");
public static ResourceKey<PlacedFeature> AURA_CACTUS = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_cactus"); public static final ResourceKey<PlacedFeature> AURA_CACTUS = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_cactus");
public static ResourceKey<PlacedFeature> WARPED_AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":warped_aura_mushroom"); public static final ResourceKey<PlacedFeature> WARPED_AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":warped_aura_mushroom");
public static ResourceKey<PlacedFeature> CRIMSON_AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":crimson_aura_mushroom"); public static final ResourceKey<PlacedFeature> CRIMSON_AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":crimson_aura_mushroom");
public static ResourceKey<PlacedFeature> AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_mushroom"); public static final ResourceKey<PlacedFeature> AURA_MUSHROOM = PlacementUtils.createKey(NaturesAura.MOD_ID + ":aura_mushroom");
public static void bootstrap(BootstapContext<PlacedFeature> context) { public static void bootstrap(BootstrapContext<PlacedFeature> context) {
HolderGetter<ConfiguredFeature<?, ?>> holdergetter = context.lookup(Registries.CONFIGURED_FEATURE); var holdergetter = context.lookup(Registries.CONFIGURED_FEATURE);
PlacementUtils.register(context, AURA_BLOOM, holdergetter.getOrThrow(ModFeatures.Configured.AURA_BLOOM)); PlacementUtils.register(context, Placed.AURA_BLOOM, holdergetter.getOrThrow(ModFeatures.Configured.AURA_BLOOM));
PlacementUtils.register(context, AURA_CACTUS, holdergetter.getOrThrow(ModFeatures.Configured.AURA_CACTUS)); PlacementUtils.register(context, Placed.AURA_CACTUS, holdergetter.getOrThrow(ModFeatures.Configured.AURA_CACTUS));
PlacementUtils.register(context, WARPED_AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.WARPED_AURA_MUSHROOM)); PlacementUtils.register(context, Placed.WARPED_AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.WARPED_AURA_MUSHROOM));
PlacementUtils.register(context, CRIMSON_AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.CRIMSON_AURA_MUSHROOM)); PlacementUtils.register(context, Placed.CRIMSON_AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.CRIMSON_AURA_MUSHROOM));
PlacementUtils.register(context, AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.AURA_MUSHROOM)); PlacementUtils.register(context, Placed.AURA_MUSHROOM, holdergetter.getOrThrow(ModFeatures.Configured.AURA_MUSHROOM));
} }
} }
} }

View file

@ -11,7 +11,7 @@ import net.neoforged.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class GuiEnderCrate extends AbstractContainerScreen<ContainerEnderCrate> { public class GuiEnderCrate extends AbstractContainerScreen<ContainerEnderCrate> {
private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("textures/gui/container/generic_54.png"); private static final ResourceLocation CHEST_GUI_TEXTURE = ResourceLocation.withDefaultNamespace("textures/gui/container/generic_54.png");
public GuiEnderCrate(ContainerEnderCrate container, Inventory inv, Component title) { public GuiEnderCrate(ContainerEnderCrate container, Inventory inv, Component title) {
super(container, inv, title); super(container, inv, title);

View file

@ -10,6 +10,7 @@ import de.ellpeck.naturesaura.reg.ICustomCreativeTab;
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.Holder;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@ -40,7 +41,7 @@ public class ItemAuraCache extends ItemImpl implements ITrinketItem, ICustomCrea
if (recharge != null) { if (recharge != null) {
if (recharge.rechargeFromContainer(container, itemSlot, i, player.getInventory().selected == i)) if (recharge.rechargeFromContainer(container, itemSlot, i, player.getInventory().selected == i))
break; break;
} else if (stack.getEnchantmentLevel(ModEnchantments.AURA_MENDING) > 0) { } else if (stack.getEnchantmentLevel(Holder.direct(ModEnchantments.AURA_MENDING)) > 0) {
var mainSize = player.getInventory().items.size(); var mainSize = player.getInventory().items.size();
var isArmor = i >= mainSize && i < mainSize + player.getInventory().armor.size(); var isArmor = i >= mainSize && i < mainSize + player.getInventory().armor.size();
if ((isArmor || player.getInventory().selected == i) && Helper.rechargeAuraItem(stack, container, 1000)) if ((isArmor || player.getInventory().selected == i) && Helper.rechargeAuraItem(stack, container, 1000))

View file

@ -4,7 +4,6 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.SpawnPlacements;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -33,12 +32,13 @@ public class ItemCaveFinder extends ItemImpl {
for (var z = -range; z <= range; z++) { for (var z = -range; z <= range; z++) {
var offset = pos.offset(x, y, z); var offset = pos.offset(x, y, z);
var state = levelIn.getBlockState(offset); var state = levelIn.getBlockState(offset);
try { // TODO figure out an entity-independent way of checking if a block is a valid spawn (just checking for air & ground below?)
/* try {
if (!state.getBlock().isValidSpawn(state, levelIn, offset, SpawnPlacements.Type.ON_GROUND, null)) if (!state.getBlock().isValidSpawn(state, levelIn, offset, SpawnPlacements.Type.ON_GROUND, null))
continue; continue;
} catch (Exception e) { } catch (Exception e) {
continue; continue;
} }*/
var offUp = offset.above(); var offUp = offset.above();
var stateUp = levelIn.getBlockState(offUp); var stateUp = levelIn.getBlockState(offUp);
@ -51,8 +51,8 @@ public class ItemCaveFinder extends ItemImpl {
continue; continue;
inst.spawnMagicParticle( inst.spawnMagicParticle(
offset.getX() + 0.5F, offset.getY() + 1.5F, offset.getZ() + 0.5F, offset.getX() + 0.5F, offset.getY() + 1.5F, offset.getZ() + 0.5F,
0F, 0F, 0F, 0x992101, 2.5F, 20 * 30, 0F, false, true); 0F, 0F, 0F, 0x992101, 2.5F, 20 * 30, 0F, false, true);
} }
inst.setParticleDepth(true); inst.setParticleDepth(true);
inst.setParticleSpawnRange(32); inst.setParticleSpawnRange(32);
@ -63,4 +63,5 @@ public class ItemCaveFinder extends ItemImpl {
playerIn.getCooldowns().addCooldown(this, 20 * 30); playerIn.getCooldowns().addCooldown(this, 20 * 30);
return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack);
} }
} }

View file

@ -4,7 +4,9 @@ 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.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.EquipmentSlot;
@ -18,24 +20,22 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.Mod; import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.common.NeoForgeMod; import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent;
import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent;
import net.neoforged.neoforge.event.entity.living.LivingAttackEvent;
import java.util.Comparator; import java.util.Comparator;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class ItemArmor extends ArmorItem implements IModItem { public class ItemArmor extends ArmorItem implements IModItem {
private static final AttributeModifier SKY_MOVEMENT_MODIFIER = new AttributeModifier(UUID.fromString("c1f96acc-e117-4dc1-a351-e196a4de6071"), NaturesAura.MOD_ID + ":sky_movement_speed", 0.15F, AttributeModifier.Operation.MULTIPLY_TOTAL); private static final AttributeModifier SKY_MOVEMENT_MODIFIER = new AttributeModifier(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "sky_movement_speed"), 0.15F, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL);
private static final AttributeModifier SKY_STEP_MODIFIER = new AttributeModifier(UUID.fromString("ac3ce414-7243-418c-97f8-ac84c2c102f6"), NaturesAura.MOD_ID + ":sky_step_modifier", 0.5F, AttributeModifier.Operation.ADDITION); private static final AttributeModifier SKY_STEP_MODIFIER = new AttributeModifier(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "sky_step_modifier"), 0.5F, AttributeModifier.Operation.ADD_VALUE);
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, ArmorMaterial materialIn, ArmorItem.Type equipmentSlotIn) { public ItemArmor(String baseName, Holder<ArmorMaterial> materialIn, ArmorItem.Type equipmentSlotIn) {
super(materialIn, equipmentSlotIn, new Properties()); super(materialIn, equipmentSlotIn, new Properties());
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
@ -43,9 +43,9 @@ public class ItemArmor extends ArmorItem implements IModItem {
public static boolean isFullSetEquipped(LivingEntity entity, ArmorMaterial material) { public static boolean isFullSetEquipped(LivingEntity entity, ArmorMaterial material) {
var set = ItemArmor.SETS.computeIfAbsent(material, m -> BuiltInRegistries.ITEM.stream() var set = ItemArmor.SETS.computeIfAbsent(material, m -> BuiltInRegistries.ITEM.stream()
.filter(i -> i instanceof ItemArmor && ((ItemArmor) i).getMaterial() == material) .filter(i -> i instanceof ItemArmor && ((ItemArmor) i).getMaterial().value() == material)
.sorted(Comparator.comparingInt(i -> ((ItemArmor) i).getEquipmentSlot().ordinal())) .sorted(Comparator.comparingInt(i -> ((ItemArmor) i).getEquipmentSlot().ordinal()))
.toArray(Item[]::new)); .toArray(Item[]::new));
for (var i = 0; i < 4; i++) { for (var i = 0; i < 4; i++) {
var slot = EquipmentSlot.values()[i + 2]; var slot = EquipmentSlot.values()[i + 2];
var stack = entity.getItemBySlot(slot); var stack = entity.getItemBySlot(slot);
@ -60,11 +60,11 @@ public class ItemArmor extends ArmorItem implements IModItem {
return this.baseName; return this.baseName;
} }
@Mod.EventBusSubscriber @EventBusSubscriber
private static final class EventHandler { private static final class EventHandler {
@SubscribeEvent @SubscribeEvent
public static void onAttack(LivingAttackEvent 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)) {
@ -81,25 +81,25 @@ public class ItemArmor extends ArmorItem implements IModItem {
} }
@SubscribeEvent @SubscribeEvent
public static void update(TickEvent.PlayerTickEvent event) { public static void update(PlayerTickEvent event) {
var player = event.player; var player = event.getEntity();
var speed = player.getAttribute(Attributes.MOVEMENT_SPEED); var speed = player.getAttribute(Attributes.MOVEMENT_SPEED);
var step = player.getAttribute(NeoForgeMod.STEP_HEIGHT.value()); 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);
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);
if (!step.hasModifier(ItemArmor.SKY_STEP_MODIFIER)) if (!step.hasModifier(ItemArmor.SKY_STEP_MODIFIER.id()))
step.addPermanentModifier(ItemArmor.SKY_STEP_MODIFIER); step.addPermanentModifier(ItemArmor.SKY_STEP_MODIFIER);
if (!speed.hasModifier(ItemArmor.SKY_MOVEMENT_MODIFIER)) if (!speed.hasModifier(ItemArmor.SKY_MOVEMENT_MODIFIER.id()))
speed.addPermanentModifier(ItemArmor.SKY_MOVEMENT_MODIFIER); speed.addPermanentModifier(ItemArmor.SKY_MOVEMENT_MODIFIER);
} else if (!equipped && nbt.getBoolean(key)) { } else if (!equipped && nbt.getBoolean(key)) {
// we just unequipped it // we just unequipped it
nbt.putBoolean(key, false); nbt.putBoolean(key, false);
step.removeModifier(ItemArmor.SKY_STEP_MODIFIER.getId()); step.removeModifier(ItemArmor.SKY_STEP_MODIFIER.id());
speed.removeModifier(ItemArmor.SKY_MOVEMENT_MODIFIER.getId()); speed.removeModifier(ItemArmor.SKY_MOVEMENT_MODIFIER.id());
} }
} }

View file

@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.AxeItem; import net.minecraft.world.item.AxeItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -20,10 +21,12 @@ import net.minecraft.world.level.block.state.BlockState;
public class ItemAxe extends AxeItem implements IModItem, ICustomItemModel { public class ItemAxe extends AxeItem implements IModItem, ICustomItemModel {
private final String baseName; private final String baseName;
private final float defaultSpeed;
public ItemAxe(String baseName, Tier material, float damage, float speed) { public ItemAxe(String baseName, Tier material, float damage, float speed) {
super(material, damage, speed, new Properties()); super(material, new Properties().attributes(AxeItem.createAttributes(material, damage, speed)));
this.baseName = baseName; this.baseName = baseName;
this.defaultSpeed = speed;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }
@ -35,20 +38,19 @@ public class ItemAxe extends AxeItem implements IModItem, ICustomItemModel {
@Override @Override
public float getDestroySpeed(ItemStack stack, BlockState state) { public float getDestroySpeed(ItemStack stack, BlockState state) {
if (state.is(BlockTags.LEAVES)) { if (state.is(BlockTags.LEAVES)) {
return this.speed; return this.defaultSpeed;
} else { } else {
return super.getDestroySpeed(stack, state); return super.getDestroySpeed(stack, state);
} }
} }
@Override @Override
public boolean onBlockStartBreak(ItemStack stack, BlockPos pos, Player player) { public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) {
if ((stack.getItem() == ModItems.SKY_AXE || stack.getItem() == ModItems.DEPTH_AXE) && Helper.isToolEnabled(stack) && player.level().getBlockState(pos).is(BlockTags.LOGS)) { if ((stack.getItem() == ModItems.SKY_AXE || stack.getItem() == ModItems.DEPTH_AXE) && Helper.isToolEnabled(stack) && level.getBlockState(pos).is(BlockTags.LOGS)) {
var horRange = stack.getItem() == ModItems.DEPTH_AXE ? 6 : 1; var horRange = stack.getItem() == ModItems.DEPTH_AXE ? 6 : 1;
Helper.mineRecursively(player.level(), pos, pos, stack, horRange, 32, s -> s.is(BlockTags.LOGS)); Helper.mineRecursively(level, pos, pos, stack, horRange, 32, s -> s.is(BlockTags.LOGS));
return true;
} }
return false; return super.mineBlock(stack, level, state, pos, miningEntity);
} }
@Override @Override

View file

@ -7,17 +7,19 @@ import de.ellpeck.naturesaura.reg.IModItem;
import de.ellpeck.naturesaura.reg.ModRegistry; import de.ellpeck.naturesaura.reg.ModRegistry;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.HoeItem; import net.minecraft.world.item.HoeItem;
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.Tier; import net.minecraft.world.item.Tier;
import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.BushBlock; import net.minecraft.world.level.block.BushBlock;
import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel { public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
@ -25,7 +27,7 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
private final String baseName; private final String baseName;
public ItemHoe(String baseName, Tier material, int speed) { public ItemHoe(String baseName, Tier material, int speed) {
super(material, speed, 0, new Properties()); super(material, new Properties().attributes(HoeItem.createAttributes(material, 0, speed)));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }
@ -74,31 +76,31 @@ public class ItemHoe extends HoeItem implements IModItem, ICustomItemModel {
} }
@Override @Override
public boolean onBlockStartBreak(ItemStack stack, BlockPos pos, Player player) { public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) {
if (!player.isShiftKeyDown() && (stack.getItem() == ModItems.SKY_HOE || stack.getItem() == ModItems.DEPTH_HOE)) { if (!miningEntity.isShiftKeyDown() && (stack.getItem() == ModItems.SKY_HOE || stack.getItem() == ModItems.DEPTH_HOE)) {
var block = player.level().getBlockState(pos).getBlock(); var block = level.getBlockState(pos).getBlock();
if (!(block instanceof BushBlock) && (stack.getItem() != ModItems.DEPTH_HOE || !(block instanceof LeavesBlock))) if (block instanceof BushBlock || stack.getItem() == ModItems.DEPTH_HOE && block instanceof LeavesBlock) {
return false; if (!level.isClientSide) {
if (!player.level().isClientSide) { var range = 3;
var range = 3; for (var x = -range; x <= range; x++) {
for (var x = -range; x <= range; x++) { for (var y = -range; y <= range; y++) {
for (var y = -range; y <= range; y++) { for (var z = -range; z <= range; z++) {
for (var z = -range; z <= range; z++) { if (x == 0 && y == 0 && z == 0)
if (x == 0 && y == 0 && z == 0) continue;
continue; var offset = pos.offset(x, y, z);
var offset = pos.offset(x, y, z); var offState = level.getBlockState(offset);
var offState = player.level().getBlockState(offset); if (offState.getBlock() instanceof BushBlock || stack.getItem() == ModItems.DEPTH_HOE && offState.getBlock() instanceof LeavesBlock) {
if (offState.getBlock() instanceof BushBlock || stack.getItem() == ModItems.DEPTH_HOE && offState.getBlock() instanceof LeavesBlock) { var entity = offState.hasBlockEntity() ? level.getBlockEntity(offset) : null;
var entity = offState.hasBlockEntity() ? player.level().getBlockEntity(offset) : null; Block.dropResources(offState, level, offset, entity, null, stack);
Block.dropResources(offState, player.level(), offset, entity, null, stack); level.setBlock(offset, Blocks.AIR.defaultBlockState(), 3);
player.level().setBlock(offset, Blocks.AIR.defaultBlockState(), 3); }
} }
} }
} }
} }
} }
} }
return false; return super.mineBlock(stack, level, state, pos, miningEntity);
} }
@Override @Override

View file

@ -16,6 +16,7 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -23,6 +24,7 @@ import net.minecraft.world.item.PickaxeItem;
import net.minecraft.world.item.Tier; import net.minecraft.world.item.Tier;
import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.Tags;
@ -31,7 +33,7 @@ public class ItemPickaxe extends PickaxeItem implements IModItem, ICustomItemMod
private final String baseName; private final String baseName;
public ItemPickaxe(String baseName, Tier material, int damage, float speed) { public ItemPickaxe(String baseName, Tier material, int damage, float speed) {
super(material, damage, speed, new Properties()); super(material, new Properties().attributes(PickaxeItem.createAttributes(material, damage, speed)));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }
@ -58,7 +60,7 @@ public class ItemPickaxe extends PickaxeItem implements IModItem, ICustomItemMod
data.addMossStone(pos); data.addMossStone(pos);
} }
level.playSound(player, pos, SoundEvents.STONE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); level.playSound(player, pos, SoundEvents.STONE_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F);
stack.hurtAndBreak(15, player, p -> p.broadcastBreakEvent(context.getHand())); stack.hurtAndBreak(15, player, LivingEntity.getSlotForHand(context.getHand()));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
} }
@ -84,12 +86,11 @@ public class ItemPickaxe extends PickaxeItem implements IModItem, ICustomItemMod
} }
@Override @Override
public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, Player player) { public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) {
if (itemstack.getItem() == ModItems.DEPTH_PICKAXE && Helper.isToolEnabled(itemstack) && player.level().getBlockState(pos).is(Tags.Blocks.ORES)) { // TODO test depth pickaxe vein mining
Helper.mineRecursively(player.level(), pos, pos, itemstack, 5, 5, s -> s.is(Tags.Blocks.ORES)); if (stack.getItem() == ModItems.DEPTH_PICKAXE && Helper.isToolEnabled(stack) && level.getBlockState(pos).is(Tags.Blocks.ORES))
return true; Helper.mineRecursively(level, pos, pos, stack, 5, 5, s -> s.is(Tags.Blocks.ORES));
} return super.mineBlock(stack, level, state, pos, miningEntity);
return false;
} }
@Override @Override

View file

@ -12,6 +12,7 @@ import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ShovelItem; import net.minecraft.world.item.ShovelItem;
import net.minecraft.world.item.Tier; import net.minecraft.world.item.Tier;
@ -27,7 +28,7 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
private final String baseName; private final String baseName;
public ItemShovel(String baseName, Tier material, float damage, float speed) { public ItemShovel(String baseName, Tier material, float damage, float speed) {
super(material, damage, speed, new Properties()); super(material, new Properties().attributes(ShovelItem.createAttributes(material, damage, speed)));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }
@ -65,7 +66,7 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
} }
level.playSound(player, pos, SoundEvents.GRASS_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F); level.playSound(player, pos, SoundEvents.GRASS_PLACE, SoundSource.BLOCKS, 1.0F, 1.0F);
stack.hurtAndBreak(Mth.ceil(damage), player, p -> p.broadcastBreakEvent(context.getHand())); stack.hurtAndBreak(Mth.ceil(damage), player, LivingEntity.getSlotForHand(context.getHand()));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
} }
@ -80,8 +81,8 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
var facing = context.getClickedFace(); var facing = context.getClickedFace();
if (player.mayUseItemAt(actualPos.relative(facing), facing, stack)) { if (player.mayUseItemAt(actualPos.relative(facing), facing, stack)) {
if (facing != Direction.DOWN if (facing != Direction.DOWN
&& level.getBlockState(actualPos.above()).isAir() && level.getBlockState(actualPos.above()).isAir()
&& level.getBlockState(actualPos).getBlock() == Blocks.GRASS_BLOCK) { && level.getBlockState(actualPos).getBlock() == Blocks.GRASS_BLOCK) {
if (!level.isClientSide) if (!level.isClientSide)
level.setBlock(actualPos, Blocks.DIRT_PATH.defaultBlockState(), 11); level.setBlock(actualPos, Blocks.DIRT_PATH.defaultBlockState(), 11);
flattened = true; flattened = true;
@ -91,7 +92,7 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
} }
if (flattened) { if (flattened) {
level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F);
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(context.getHand())); stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(context.getHand()));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }
} }
@ -109,7 +110,7 @@ public class ItemShovel extends ShovelItem implements IModItem, ICustomItemModel
Block.dropResources(state, level, pos, tile, null, stack); Block.dropResources(state, level, pos, tile, null, stack);
var newContext = new UseOnContext(player, otherHand, new BlockHitResult(context.getClickLocation(), context.getClickedFace(), context.getClickedPos(), context.isInside())); var newContext = new UseOnContext(player, otherHand, new BlockHitResult(context.getClickLocation(), context.getClickedFace(), context.getClickedPos(), context.isInside()));
other.useOn(newContext); other.useOn(newContext);
stack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(context.getHand())); stack.hurtAndBreak(1, player, LivingEntity.getSlotForHand(context.getHand()));
return InteractionResult.SUCCESS; return InteractionResult.SUCCESS;
} }

View file

@ -24,7 +24,7 @@ public class ItemSword extends SwordItem implements IModItem, ICustomItemModel {
private final String baseName; private final String baseName;
public ItemSword(String baseName, Tier material, int damage, float speed) { public ItemSword(String baseName, Tier material, int damage, float speed) {
super(material, damage, speed, new Properties()); super(material, new Properties().attributes(SwordItem.createAttributes(material, damage, speed)));
this.baseName = baseName; this.baseName = baseName;
ModRegistry.ALL_ITEMS.add(this); ModRegistry.ALL_ITEMS.add(this);
} }

View file

@ -23,7 +23,7 @@ public final class ColoredBlockHelper {
private static List<Block> collectBlocks(String name) { private static List<Block> collectBlocks(String name) {
return Arrays.stream(DyeColor.values()).sorted(Comparator.comparingInt(DyeColor::getId)).map(c -> { return Arrays.stream(DyeColor.values()).sorted(Comparator.comparingInt(DyeColor::getId)).map(c -> {
var loc = new ResourceLocation(c.getName() + '_' + name); var loc = ResourceLocation.parse(c.getName() + '_' + name);
var block = BuiltInRegistries.BLOCK.get(loc); var block = BuiltInRegistries.BLOCK.get(loc);
if (block == null || block == Blocks.AIR) if (block == null || block == Blocks.AIR)
throw new IllegalStateException("Couldn't find block with name " + loc); throw new IllegalStateException("Couldn't find block with name " + loc);

View file

@ -10,6 +10,7 @@ import de.ellpeck.naturesaura.chunk.AuraChunk;
import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.ModItems;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
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.nbt.LongTag; import net.minecraft.nbt.LongTag;
@ -39,24 +40,24 @@ public class LevelData extends SavedData implements ILevelData {
} }
public LevelData(CompoundTag compound) { public LevelData(CompoundTag compound, HolderLookup.Provider registries) {
for (var base : compound.getList("storages", 10)) { for (var base : compound.getList("storages", 10)) {
var storageComp = (CompoundTag) base; var storageComp = (CompoundTag) base;
var storage = this.getEnderStorage(storageComp.getString("name")); var storage = this.getEnderStorage(storageComp.getString("name"));
storage.deserializeNBT(storageComp); storage.deserializeNBT(registries, storageComp);
} }
for (var base : compound.getList("converted_moss", Tag.TAG_LONG)) for (var base : compound.getList("converted_moss", Tag.TAG_LONG))
this.recentlyConvertedMossStones.add(BlockPos.of(((LongTag) base).getAsLong())); this.recentlyConvertedMossStones.add(BlockPos.of(((LongTag) base).getAsLong()));
} }
@Override @Override
public CompoundTag save(CompoundTag compound) { public CompoundTag save(CompoundTag compound, HolderLookup.Provider registries) {
var storages = new ListTag(); var storages = new ListTag();
for (var entry : this.enderStorages.entrySet()) { for (var entry : this.enderStorages.entrySet()) {
var handler = entry.getValue(); var handler = entry.getValue();
if (Helper.isEmpty(handler)) if (Helper.isEmpty(handler))
continue; continue;
var storageComp = handler.serializeNBT(); var storageComp = handler.serializeNBT(registries);
storageComp.putString("name", entry.getKey()); storageComp.putString("name", entry.getKey());
storages.add(storageComp); storages.add(storageComp);
} }
@ -94,7 +95,7 @@ public class LevelData extends SavedData implements ILevelData {
public void addMossStone(BlockPos pos) { public void addMossStone(BlockPos pos) {
this.recentlyConvertedMossStones.add(pos); this.recentlyConvertedMossStones.add(pos);
if (this.recentlyConvertedMossStones.size() > 512) if (this.recentlyConvertedMossStones.size() > 512)
this.recentlyConvertedMossStones.remove(0); this.recentlyConvertedMossStones.removeFirst();
} }
} }

View file

@ -16,6 +16,7 @@ import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.renderer.texture.TextureManager;
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 org.jetbrains.annotations.Nullable;
import java.util.Locale; import java.util.Locale;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -26,15 +27,10 @@ public final class ParticleHandler {
public static final ParticleRenderType MAGIC = new ParticleRenderType() { public static final ParticleRenderType MAGIC = new ParticleRenderType() {
@Override @Override
public void begin(BufferBuilder buffer, TextureManager textureManager) { public @Nullable BufferBuilder begin(Tesselator tesselator, TextureManager textureManager) {
ParticleHandler.setupRendering(); ParticleHandler.setupRendering();
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); return tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE);
}
@Override
public void end(Tesselator tessellator) {
tessellator.end();
} }
@Override @Override
@ -45,15 +41,10 @@ public final class ParticleHandler {
public static final ParticleRenderType MAGIC_NO_DEPTH = new ParticleRenderType() { public static final ParticleRenderType MAGIC_NO_DEPTH = new ParticleRenderType() {
@Override @Override
public void begin(BufferBuilder buffer, TextureManager textureManager) { public @Nullable BufferBuilder begin(Tesselator tesselator, TextureManager textureManager) {
ParticleHandler.setupRendering(); ParticleHandler.setupRendering();
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE); return tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.PARTICLE);
}
@Override
public void end(Tesselator tessellator) {
tessellator.end();
} }
@Override @Override
@ -73,8 +64,8 @@ public final class ParticleHandler {
if (ModConfig.instance.respectVanillaParticleSettings.get()) { if (ModConfig.instance.respectVanillaParticleSettings.get()) {
var setting = mc.options.particles().get(); var setting = mc.options.particles().get();
if (setting != ParticleStatus.ALL && if (setting != ParticleStatus.ALL &&
(setting != ParticleStatus.DECREASED || mc.level.random.nextInt(3) != 0) && (setting != ParticleStatus.DECREASED || mc.level.random.nextInt(3) != 0) &&
(setting != ParticleStatus.MINIMAL || mc.level.random.nextInt(10) != 0)) (setting != ParticleStatus.MINIMAL || mc.level.random.nextInt(10) != 0))
return; return;
} }
double setting = ModConfig.instance.particleAmount.get(); double setting = ModConfig.instance.particleAmount.get();
@ -94,4 +85,5 @@ public final class ParticleHandler {
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
RenderSystem.setShaderTexture(0, ParticleMagic.TEXTURE); RenderSystem.setShaderTexture(0, ParticleMagic.TEXTURE);
} }
}
}

View file

@ -19,7 +19,7 @@ import java.util.Collections;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public class ParticleMagic extends Particle { public class ParticleMagic extends Particle {
public static final ResourceLocation TEXTURE = new ResourceLocation(NaturesAura.MOD_ID, "textures/particles/magic_round.png"); public static final ResourceLocation TEXTURE = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "textures/particles/magic_round.png");
private final float desiredScale; private final float desiredScale;
private final boolean fade; private final boolean fade;
@ -109,10 +109,10 @@ public class ParticleMagic extends Particle {
} }
var j = this.getLightColor(partialTicks); var j = this.getLightColor(partialTicks);
buffer.vertex(avector3f[0].x(), avector3f[0].y(), avector3f[0].z()).uv(0, 1).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(j).endVertex(); buffer.addVertex(avector3f[0].x(), avector3f[0].y(), avector3f[0].z()).setUv(0, 1).setColor(this.rCol, this.gCol, this.bCol, this.alpha).setLight(j);
buffer.vertex(avector3f[1].x(), avector3f[1].y(), avector3f[1].z()).uv(1, 1).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(j).endVertex(); buffer.addVertex(avector3f[1].x(), avector3f[1].y(), avector3f[1].z()).setUv(1, 1).setColor(this.rCol, this.gCol, this.bCol, this.alpha).setLight(j);
buffer.vertex(avector3f[2].x(), avector3f[2].y(), avector3f[2].z()).uv(1, 0).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(j).endVertex(); buffer.addVertex(avector3f[2].x(), avector3f[2].y(), avector3f[2].z()).setUv(1, 0).setColor(this.rCol, this.gCol, this.bCol, this.alpha).setLight(j);
buffer.vertex(avector3f[3].x(), avector3f[3].y(), avector3f[3].z()).uv(0, 0).color(this.rCol, this.gCol, this.bCol, this.alpha).uv2(j).endVertex(); buffer.addVertex(avector3f[3].x(), avector3f[3].y(), avector3f[3].z()).setUv(0, 0).setColor(this.rCol, this.gCol, this.bCol, this.alpha).setLight(j);
} }
@Override @Override
@ -124,4 +124,5 @@ public class ParticleMagic extends Particle {
protected int getLightColor(float p_107249_) { protected int getLightColor(float p_107249_) {
return 15 << 20 | 15 << 4; return 15 << 20 | 15 << 4;
} }
} }

View file

@ -1,5 +1,6 @@
package de.ellpeck.naturesaura.potion; package de.ellpeck.naturesaura.potion;
import net.minecraft.core.Holder;
import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.NeoForge;
@ -19,7 +20,7 @@ public class PotionBreathless extends PotionImpl {
@SubscribeEvent @SubscribeEvent
public void onHeal(LivingHealEvent event) { public void onHeal(LivingHealEvent event) {
var effect = event.getEntity().getEffect(this); var effect = event.getEntity().getEffect(Holder.direct(this));
if (effect == null) if (effect == null)
return; return;
var chance = (effect.getAmplifier() + 1) / 15F; var chance = (effect.getAmplifier() + 1) / 15F;
@ -35,8 +36,9 @@ public class PotionBreathless extends PotionImpl {
} }
@Override @Override
public void applyEffectTick(LivingEntity entity, int amplifier) { public boolean applyEffectTick(LivingEntity entity, int amplifier) {
entity.hurt(entity.damageSources().magic(), 1F); entity.hurt(entity.damageSources().magic(), 1F);
return true;
} }
} }

View file

@ -22,7 +22,6 @@ import de.ellpeck.naturesaura.reg.ModRegistry;
import de.ellpeck.naturesaura.renderers.PlayerLayerTrinkets; import de.ellpeck.naturesaura.renderers.PlayerLayerTrinkets;
import de.ellpeck.naturesaura.renderers.SupporterFancyHandler; import de.ellpeck.naturesaura.renderers.SupporterFancyHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRenderer;
@ -30,35 +29,43 @@ import net.minecraft.client.renderer.entity.EntityRenderers;
import net.minecraft.client.renderer.entity.ThrownItemRenderer; import net.minecraft.client.renderer.entity.ThrownItemRenderer;
import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.client.resources.PlayerSkin;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.common.NeoForge; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.common.NeoForge;
public class ClientProxy implements IProxy { public class ClientProxy implements IProxy {
// TODO check ender crate registry functions
@SubscribeEvent
public void registerMenuScreens(RegisterMenuScreensEvent event) {
event.register(ModContainers.ENDER_CRATE, GuiEnderCrate::new);
event.register(ModContainers.ENDER_ACCESS, GuiEnderCrate::new);
}
@Override @Override
public void preInit(FMLCommonSetupEvent event) { public void preInit(FMLCommonSetupEvent event) {
NeoForge.EVENT_BUS.register(new ClientEvents()); NeoForge.EVENT_BUS.register(new ClientEvents());
Compat.setupClient(); Compat.setupClient();
MenuScreens.register(ModContainers.ENDER_CRATE, GuiEnderCrate::new);
MenuScreens.register(ModContainers.ENDER_ACCESS, GuiEnderCrate::new);
ItemProperties.register(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "fill_mode"), ItemProperties.register(ModItems.COLOR_CHANGER, ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "fill_mode"),
(stack, level, entity, i) -> ItemColorChanger.isFillMode(stack) ? 1 : 0); (stack, level, entity, i) -> ItemColorChanger.isFillMode(stack) ? 1 : 0);
ItemProperties.register(ModItems.COLOR_CHANGER, new ResourceLocation(NaturesAura.MOD_ID, "has_color"), ItemProperties.register(ModItems.COLOR_CHANGER, ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "has_color"),
(stack, level, entity, i) -> ItemColorChanger.getStoredColor(stack) != null ? 1 : 0); (stack, level, entity, i) -> ItemColorChanger.getStoredColor(stack) != null ? 1 : 0);
for (var item : new Item[]{ModItems.SKY_AXE, ModItems.DEPTH_PICKAXE, ModItems.DEPTH_AXE}) { for (var item : new Item[]{ModItems.SKY_AXE, ModItems.DEPTH_PICKAXE, ModItems.DEPTH_AXE}) {
ItemProperties.register(item, new ResourceLocation(NaturesAura.MOD_ID, "enabled"), ItemProperties.register(item, ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "enabled"),
(stack, level, entity, i) -> Helper.isToolEnabled(stack) ? 1 : 0); (stack, level, entity, i) -> Helper.isToolEnabled(stack) ? 1 : 0);
} }
} }
@Override @Override
public void init(FMLCommonSetupEvent event) { public void init(FMLCommonSetupEvent event) {
var skinMap = Minecraft.getInstance().getEntityRenderDispatcher().getSkinMap(); var skinMap = Minecraft.getInstance().getEntityRenderDispatcher().getSkinMap();
for (var render : new EntityRenderer[]{skinMap.get("default"), skinMap.get("slim")}) { for (var render : new EntityRenderer[]{skinMap.get(PlayerSkin.Model.WIDE), skinMap.get(PlayerSkin.Model.SLIM)}) {
if (render instanceof PlayerRenderer living) if (render instanceof PlayerRenderer living)
living.addLayer(new PlayerLayerTrinkets(living)); living.addLayer(new PlayerLayerTrinkets(living));
} }
@ -89,9 +96,9 @@ public class ClientProxy implements IProxy {
@Override @Override
public void spawnMagicParticle(double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade) { public void spawnMagicParticle(double posX, double posY, double posZ, double motionX, double motionY, double motionZ, int color, float scale, int maxAge, float gravity, boolean collision, boolean fade) {
ParticleHandler.spawnParticle(() -> new ParticleMagic(Minecraft.getInstance().level, ParticleHandler.spawnParticle(() -> new ParticleMagic(Minecraft.getInstance().level,
posX, posY, posZ, posX, posY, posZ,
motionX, motionY, motionZ, motionX, motionY, motionZ,
color, scale, maxAge, gravity, collision, fade, ParticleHandler.depthEnabled), posX, posY, posZ); color, scale, maxAge, gravity, collision, fade, ParticleHandler.depthEnabled), posX, posY, posZ);
} }
@Override @Override
@ -126,4 +133,4 @@ public class ClientProxy implements IProxy {
Minecraft.getInstance().getBlockColors().register(block.getBlockColor(), (Block) block); Minecraft.getInstance().getBlockColors().register(block.getBlockColor(), (Block) block);
} }
} }

View file

@ -1,16 +1,17 @@
package de.ellpeck.naturesaura.recipes; package de.ellpeck.naturesaura.recipes;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.HolderLookup;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import javax.annotation.Nullable;
public class AltarRecipe extends ModRecipe { public class AltarRecipe extends ModRecipe {
public final Ingredient input; public final Ingredient input;
@ -28,7 +29,7 @@ public class AltarRecipe extends ModRecipe {
} }
@Override @Override
public ItemStack getResultItem(RegistryAccess access) { public ItemStack getResultItem(HolderLookup.Provider registries) {
return this.output; return this.output;
} }
@ -44,32 +45,23 @@ public class AltarRecipe extends ModRecipe {
public static class Serializer implements RecipeSerializer<AltarRecipe> { public static class Serializer implements RecipeSerializer<AltarRecipe> {
private static final Codec<AltarRecipe> CODEC = RecordCodecBuilder.create(i -> i.group( private static final MapCodec<AltarRecipe> CODEC = RecordCodecBuilder.mapCodec(i -> i.group(
Ingredient.CODEC.fieldOf("input").forGetter(r -> r.input), Ingredient.CODEC.fieldOf("input").forGetter(r -> r.input),
ItemStack.ITEM_WITH_COUNT_CODEC.fieldOf("output").forGetter(r -> r.output), ItemStack.CODEC.fieldOf("output").forGetter(r -> r.output),
Ingredient.CODEC.optionalFieldOf("catalyst", Ingredient.EMPTY).forGetter(r -> r.catalyst), Ingredient.CODEC.optionalFieldOf("catalyst", Ingredient.EMPTY).forGetter(r -> r.catalyst),
Codec.INT.fieldOf("aura").forGetter(r -> r.aura), Codec.INT.fieldOf("aura").forGetter(r -> r.aura),
Codec.INT.fieldOf("time").forGetter(r -> r.time) Codec.INT.fieldOf("time").forGetter(r -> r.time)
).apply(i, AltarRecipe::new)); ).apply(i, AltarRecipe::new));
private static final StreamCodec<RegistryFriendlyByteBuf, AltarRecipe> STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistries(Serializer.CODEC.codec());
@Override @Override
public Codec<AltarRecipe> codec() { public MapCodec<AltarRecipe> codec() {
return Serializer.CODEC; return Serializer.CODEC;
} }
@Nullable
@Override @Override
public AltarRecipe fromNetwork(FriendlyByteBuf buffer) { public StreamCodec<RegistryFriendlyByteBuf, AltarRecipe> streamCodec() {
return new AltarRecipe(Ingredient.fromNetwork(buffer), buffer.readItem(), Ingredient.fromNetwork(buffer), buffer.readInt(), buffer.readInt()); return Serializer.STREAM_CODEC;
}
@Override
public void toNetwork(FriendlyByteBuf buffer, AltarRecipe recipe) {
recipe.input.toNetwork(buffer);
buffer.writeItem(recipe.output);
recipe.catalyst.toNetwork(buffer);
buffer.writeInt(recipe.aura);
buffer.writeInt(recipe.time);
} }
} }

View file

@ -1,11 +1,14 @@
package de.ellpeck.naturesaura.recipes; package de.ellpeck.naturesaura.recipes;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
@ -17,7 +20,6 @@ import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class AnimalSpawnerRecipe extends ModRecipe { public class AnimalSpawnerRecipe extends ModRecipe {
@ -38,11 +40,11 @@ public class AnimalSpawnerRecipe extends ModRecipe {
// passed position is zero on the client, so we don't want to do initialization stuff for the entity // passed position is zero on the client, so we don't want to do initialization stuff for the entity
if (pos == BlockPos.ZERO) if (pos == BlockPos.ZERO)
return this.entity.create(level); return this.entity.create(level);
return this.entity.create((ServerLevel) level, null, null, pos, MobSpawnType.SPAWNER, false, false); return this.entity.create((ServerLevel) level, null, pos, MobSpawnType.SPAWNER, false, false);
} }
@Override @Override
public ItemStack getResultItem(RegistryAccess access) { public ItemStack getResultItem(HolderLookup.Provider registries) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@ -58,34 +60,22 @@ public class AnimalSpawnerRecipe extends ModRecipe {
public static class Serializer implements RecipeSerializer<AnimalSpawnerRecipe> { public static class Serializer implements RecipeSerializer<AnimalSpawnerRecipe> {
private static final Codec<AnimalSpawnerRecipe> CODEC = RecordCodecBuilder.create(i -> i.group( private static final MapCodec<AnimalSpawnerRecipe> CODEC = RecordCodecBuilder.mapCodec(i -> i.group(
ResourceLocation.CODEC.fieldOf("entity").forGetter(r -> BuiltInRegistries.ENTITY_TYPE.getKey(r.entity)), ResourceLocation.CODEC.fieldOf("entity").forGetter(r -> BuiltInRegistries.ENTITY_TYPE.getKey(r.entity)),
Codec.INT.fieldOf("aura").forGetter(r -> r.aura), Codec.INT.fieldOf("aura").forGetter(r -> r.aura),
Codec.INT.fieldOf("time").forGetter(r -> r.time), Codec.INT.fieldOf("time").forGetter(r -> r.time),
Ingredient.CODEC.listOf().fieldOf("ingredients").forGetter(r -> r.ingredients) Ingredient.CODEC.listOf().fieldOf("ingredients").forGetter(r -> r.ingredients)
).apply(i, AnimalSpawnerRecipe::new)); ).apply(i, AnimalSpawnerRecipe::new));
private static final StreamCodec<RegistryFriendlyByteBuf, AnimalSpawnerRecipe> STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistries(AnimalSpawnerRecipe.Serializer.CODEC.codec());
@Override @Override
public Codec<AnimalSpawnerRecipe> codec() { public MapCodec<AnimalSpawnerRecipe> codec() {
return Serializer.CODEC; return Serializer.CODEC;
} }
@Override @Override
public AnimalSpawnerRecipe fromNetwork(FriendlyByteBuf buffer) { public StreamCodec<RegistryFriendlyByteBuf, AnimalSpawnerRecipe> streamCodec() {
var ingredients = new ArrayList<Ingredient>(); return Serializer.STREAM_CODEC;
for (var i = buffer.readInt(); i > 0; i--)
ingredients.add(Ingredient.fromNetwork(buffer));
return new AnimalSpawnerRecipe(buffer.readResourceLocation(), buffer.readInt(), buffer.readInt(), ingredients);
}
@Override
public void toNetwork(FriendlyByteBuf buffer, AnimalSpawnerRecipe recipe) {
buffer.writeInt(recipe.ingredients.size());
for (var ing : recipe.ingredients)
ing.toNetwork(buffer);
buffer.writeResourceLocation(BuiltInRegistries.ENTITY_TYPE.getKey(recipe.entity));
buffer.writeInt(recipe.aura);
buffer.writeInt(recipe.time);
} }
} }

View file

@ -1,6 +1,7 @@
package de.ellpeck.naturesaura.recipes; package de.ellpeck.naturesaura.recipes;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
@ -9,8 +10,8 @@ import net.neoforged.neoforge.common.conditions.ICondition;
public class EnabledCondition implements ICondition { public class EnabledCondition implements ICondition {
private static final Codec<EnabledCondition> CODEC = RecordCodecBuilder.create(i -> private static final MapCodec<EnabledCondition> CODEC = RecordCodecBuilder.mapCodec(i ->
i.group(Codec.STRING.fieldOf("name").forGetter(c -> c.name)).apply(i, EnabledCondition::new) i.group(Codec.STRING.fieldOf("name").forGetter(c -> c.name)).apply(i, EnabledCondition::new)
); );
private ModConfigSpec.ConfigValue<Boolean> config; private ModConfigSpec.ConfigValue<Boolean> config;
@ -32,7 +33,7 @@ public class EnabledCondition implements ICondition {
} }
@Override @Override
public Codec<? extends ICondition> codec() { public MapCodec<? extends ICondition> codec() {
return EnabledCondition.CODEC; return EnabledCondition.CODEC;
} }

View file

@ -1,6 +1,6 @@
package de.ellpeck.naturesaura.recipes; package de.ellpeck.naturesaura.recipes;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.HolderLookup;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -15,7 +15,7 @@ public abstract class ModRecipe implements Recipe<RecipeWrapper> {
} }
@Override @Override
public ItemStack assemble(RecipeWrapper inv, RegistryAccess access) { public ItemStack assemble(RecipeWrapper input, HolderLookup.Provider registries) {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
@ -24,5 +24,4 @@ public abstract class ModRecipe implements Recipe<RecipeWrapper> {
return false; return false;
} }
} }

Some files were not shown because too many files have changed in this diff Show more