From 6525ff5d2528834f293b19291deef5a831228ad6 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 25 Sep 2024 15:31:20 +0200 Subject: [PATCH] some work on the port --- .../java/de/ellpeck/naturesaura/Helper.java | 79 ++- .../naturesaura/api/NaturesAuraAPI.java | 14 +- .../blocks/BlockDimensionRail.java | 37 +- .../naturesaura/blocks/BlockEndFlower.java | 3 +- .../naturesaura/blocks/BlockOakGenerator.java | 15 +- .../blocks/BlockPickupStopper.java | 20 +- .../blocks/BlockProjectileGenerator.java | 56 +- .../naturesaura/blocks/BlockWoodStand.java | 11 +- .../tiles/BlockEntityPotionGenerator.java | 26 +- .../ellpeck/naturesaura/chunk/AuraChunk.java | 4 +- .../naturesaura/compat/CuriosCompat.java | 3 + .../naturesaura/data/BiomeModifiers.java | 36 +- .../de/ellpeck/naturesaura/data/ModData.java | 3 +- .../naturesaura/items/ItemPetReviver.java | 13 +- .../naturesaura/packet/PacketAuraChunk.java | 56 +- .../naturesaura/packet/PacketClient.java | 73 +- .../naturesaura/packet/PacketHandler.java | 23 +- .../packet/PacketParticleStream.java | 79 +-- .../naturesaura/packet/PacketParticles.java | 631 +++++++++--------- 19 files changed, 553 insertions(+), 629 deletions(-) diff --git a/src/main/java/de/ellpeck/naturesaura/Helper.java b/src/main/java/de/ellpeck/naturesaura/Helper.java index 37304d78..6c812907 100644 --- a/src/main/java/de/ellpeck/naturesaura/Helper.java +++ b/src/main/java/de/ellpeck/naturesaura/Helper.java @@ -21,7 +21,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -37,7 +37,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; @@ -46,8 +46,6 @@ import net.neoforged.neoforge.capabilities.Capabilities; import net.neoforged.neoforge.capabilities.ICapabilityProvider; import net.neoforged.neoforge.items.IItemHandler; import net.neoforged.neoforge.items.IItemHandlerModifiable; -import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.SlotResult; import java.lang.reflect.Modifier; import java.util.List; @@ -116,7 +114,7 @@ public final class Helper { } public static boolean areItemsEqual(ItemStack first, ItemStack second, boolean nbt) { - return nbt ? ItemStack.isSameItemSameTags(first, second) : ItemStack.isSameItem(first, second); + return nbt ? ItemStack.isSameItemSameComponents(first, second) : ItemStack.isSameItem(first, second); } @OnlyIn(Dist.CLIENT) @@ -132,34 +130,34 @@ public final class Helper { } @OnlyIn(Dist.CLIENT) - public static void renderWeirdBox(VertexConsumer buffer, double x, double y, double z, double width, double height, double depth, float r, float g, float b, float a) { - buffer.vertex(x, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y + height, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z).color(r, g, b, a).endVertex(); - buffer.vertex(x + width, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z + depth).color(r, g, b, a).endVertex(); - buffer.vertex(x, y, z).color(r, g, b, a).endVertex(); + public static void renderWeirdBox(VertexConsumer buffer, float x, float y, float z, float width, float height, float depth, float r, float g, float b, float a) { + buffer.addVertex(x, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z).setColor(r, g, b, a); + buffer.addVertex(x, y, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x, y, z).setColor(r, g, b, a); + buffer.addVertex(x, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z + depth).setColor(r, g, b, a); + buffer.addVertex(x + width, y + height, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z).setColor(r, g, b, a); + buffer.addVertex(x + width, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y, z + depth).setColor(r, g, b, a); + buffer.addVertex(x, y, z).setColor(r, g, b, a); } - public static InteractionResult putStackOnTile(Player player, InteractionHand hand, BlockPos pos, int slot, boolean sound) { + public static ItemInteractionResult putStackOnTile(Player player, InteractionHand hand, BlockPos pos, int slot, boolean sound) { var tile = player.level().getBlockEntity(pos); if (tile instanceof BlockEntityImpl) { var handler = (IItemHandlerModifiable) tile.getLevel().getCapability(Capabilities.ItemHandler.BLOCK, tile.getBlockPos(), tile.getBlockState(), tile, null); @@ -170,17 +168,17 @@ public final class Helper { if (!ItemStack.matches(remain, handStack)) { if (sound) player.level().playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.PLAYERS, 0.75F, 1F); + SoundEvents.ITEM_FRAME_ADD_ITEM, SoundSource.PLAYERS, 0.75F, 1F); if (!player.level().isClientSide) player.setItemInHand(hand, remain); - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } } if (!handler.getStackInSlot(slot).isEmpty()) { if (sound) player.level().playSound(player, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.PLAYERS, 0.75F, 1F); + SoundEvents.ITEM_FRAME_REMOVE_ITEM, SoundSource.PLAYERS, 0.75F, 1F); if (!player.level().isClientSide) { var stack = handler.getStackInSlot(slot); if (!player.addItem(stack)) { @@ -189,11 +187,11 @@ public final class Helper { } handler.setStackInSlot(slot, ItemStack.EMPTY); } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } } } - return InteractionResult.CONSUME; + return ItemInteractionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; } public static ICapabilityProvider makeRechargeProvider(boolean needsSelected) { @@ -215,7 +213,7 @@ public final class Helper { public static BlockState getStateFromString(String raw) { var split = raw.split("\\["); - var block = BuiltInRegistries.BLOCK.get(new ResourceLocation(split[0])); + var block = BuiltInRegistries.BLOCK.get(ResourceLocation.parse(split[0])); if (block != null) { var state = block.defaultBlockState(); if (split.length > 1) { @@ -284,7 +282,7 @@ public final class Helper { for (var entry : clazz.getFields()) { if (!Modifier.isStatic(entry.getModifiers())) continue; - var location = new ResourceLocation(NaturesAura.MOD_ID, entry.getName().toLowerCase(Locale.ROOT)); + var location = ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, entry.getName().toLowerCase(Locale.ROOT)); if (!registry.containsKey(location)) { NaturesAura.LOGGER.fatal("Couldn't find entry named " + location + " in registry"); continue; @@ -298,14 +296,15 @@ public final class Helper { } public static ItemStack getEquippedItem(Predicate predicate, Player player, boolean hotbarOnly) { - if (Compat.hasCompat("curios")) { + // TODO curios? + /* if (Compat.hasCompat("curios")) { var inventory = CuriosApi.getCuriosInventory(player); if (inventory.isPresent()) { var stack = inventory.get().findFirstCurio(predicate).map(SlotResult::stack); if (stack.isPresent()) return stack.get(); } - } + }*/ var invSize = hotbarOnly ? 9 : player.getInventory().getContainerSize(); for (var i = 0; i < invSize; i++) { var slot = player.getInventory().getItem(i); diff --git a/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java b/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java index ed0c830d..251057f6 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java +++ b/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java @@ -52,10 +52,10 @@ public final class NaturesAuraAPI { * A map of all {@link IAuraType} instances which are types of Aura present in different types of levels. {@link BasicAuraType} instances can be easily registered using {@link BasicAuraType#register()}. */ public static final Map AURA_TYPES = new HashMap<>(); - public static final BasicAuraType TYPE_OVERWORLD = new BasicAuraType(new ResourceLocation(NaturesAuraAPI.MOD_ID, "overworld"), Level.OVERWORLD, 0x89cc37, 0).register(); - public static final BasicAuraType TYPE_NETHER = new BasicAuraType(new ResourceLocation(NaturesAuraAPI.MOD_ID, "nether"), Level.NETHER, 0x871c0c, 0).register(); - public static final BasicAuraType TYPE_END = new BasicAuraType(new ResourceLocation(NaturesAuraAPI.MOD_ID, "end"), Level.END, 0x302624, 0).register(); - public static final BasicAuraType TYPE_OTHER = new BasicAuraType(new ResourceLocation(NaturesAuraAPI.MOD_ID, "other"), null, 0x2fa8a0, Integer.MIN_VALUE).register(); + public static final BasicAuraType TYPE_OVERWORLD = new BasicAuraType(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "overworld"), Level.OVERWORLD, 0x89cc37, 0).register(); + public static final BasicAuraType TYPE_NETHER = new BasicAuraType(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "nether"), Level.NETHER, 0x871c0c, 0).register(); + public static final BasicAuraType TYPE_END = new BasicAuraType(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "end"), Level.END, 0x302624, 0).register(); + public static final BasicAuraType TYPE_OTHER = new BasicAuraType(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "other"), null, 0x2fa8a0, Integer.MIN_VALUE).register(); /** * A map of all {@link IDrainSpotEffect} suppliers which are effects that happen passively at every spot that Aura has been drained from in the level. These effects include things like vegetational increase and natural decay. To register your own drain spot effects, just add a supplier for them to this map, and they will automatically be executed once a second for every drain spot currently loaded. */ @@ -87,15 +87,15 @@ public final class NaturesAuraAPI { /** * The capability for any item that stores Aura in the form of an {@link IAuraContainer} */ - public static final ItemCapability AURA_CONTAINER_ITEM_CAPABILITY = ItemCapability.createVoid(new ResourceLocation(NaturesAuraAPI.MOD_ID, "aura_container_item"), IAuraContainer.class); + public static final ItemCapability AURA_CONTAINER_ITEM_CAPABILITY = ItemCapability.createVoid(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "aura_container_item"), IAuraContainer.class); /** * The capability for any block that stores Aura in the form of an {@link IAuraContainer} */ - public static final BlockCapability AURA_CONTAINER_BLOCK_CAPABILITY = BlockCapability.create(new ResourceLocation(NaturesAuraAPI.MOD_ID, "aura_container_block"), IAuraContainer.class, Direction.class); + public static final BlockCapability AURA_CONTAINER_BLOCK_CAPABILITY = BlockCapability.create(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "aura_container_block"), IAuraContainer.class, Direction.class); /** * The capability for any item that can be recharged from an Aura storage container like the Aura Cache in the form of {@link IAuraRecharge} by a player holding it in their hand */ - public static final ItemCapability AURA_RECHARGE_CAPABILITY = ItemCapability.createVoid(new ResourceLocation(NaturesAuraAPI.MOD_ID, "aura_recharge"), IAuraRecharge.class); + public static final ItemCapability AURA_RECHARGE_CAPABILITY = ItemCapability.createVoid(ResourceLocation.fromNamespaceAndPath(NaturesAuraAPI.MOD_ID, "aura_recharge"), IAuraRecharge.class); /** * The capability that any chunk in a level has to store Aura in it. As this is only applicable to chunks and all chunks in the level automatically get assigned this capability, using it directly is not necessary for addon developers. To retrieve this capability from any chunk, use the helper method {@link IAuraChunk#getAuraChunk(net.minecraft.world.level.Level, BlockPos)}. */ diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java index 967ebed1..3e45f570 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java @@ -20,9 +20,11 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BaseRailBlock; @@ -35,10 +37,8 @@ import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.block.state.properties.RailShape; import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.portal.DimensionTransition; import net.minecraft.world.phys.BlockHitResult; -import net.neoforged.neoforge.common.util.ITeleporter; - -import java.util.function.Function; public class BlockDimensionRail extends BaseRailBlock implements IModItem, ICustomBlockState, ICustomItemModel { @@ -66,20 +66,18 @@ public class BlockDimensionRail extends BaseRailBlock implements IModItem, ICust } @Override - @SuppressWarnings("deprecation") - public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - var stack = player.getItemInHand(hand); + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { if (stack.getItem() == ModItems.RANGE_VISUALIZER) { - if (!levelIn.isClientSide) { - var goalPos = this.getGoalCoords(levelIn, pos); + if (!level.isClientSide) { + var goalPos = this.getGoalCoords(level, pos); var data = new CompoundTag(); data.putString("dim", this.goalDim.location().toString()); data.putLong("pos", goalPos.asLong()); PacketHandler.sendTo(player, new PacketClient(0, data)); } - return InteractionResult.SUCCESS; + return ItemInteractionResult.SUCCESS; } - return InteractionResult.FAIL; + return ItemInteractionResult.FAIL; } @Override @@ -95,21 +93,9 @@ public class BlockDimensionRail extends BaseRailBlock implements IModItem, ICust PacketHandler.sendToAllAround(level, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, PacketParticles.Type.DIMENSION_RAIL, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F))); level.playSound(null, pos, SoundEvents.ENDERMAN_TELEPORT, SoundSource.BLOCKS, 1F, 1F); - var goalCoords = this.getGoalCoords(level, pos); - cart.changeDimension(level.getServer().getLevel(this.goalDim), new ITeleporter() { - @Override - public Entity placeEntity(Entity entity, ServerLevel currentLevel, ServerLevel destLevel, float yaw, Function repositionEntity) { - // repositionEntity always causes a NPE because why wouldn't it, so this is a fixed copy - entity.level().getProfiler().popPush("reloading"); - var result = entity.getType().create(destLevel); - if (result != null) { - result.restoreFrom(entity); - destLevel.addDuringTeleport(result); - result.moveTo(goalCoords, yaw, result.getXRot()); - } - return result; - } - }); + // TODO test if this new dimension change works! + var goalCoords = this.getGoalCoords(level, pos).getCenter(); + cart.changeDimension(new DimensionTransition(level.getServer().getLevel(this.goalDim), goalCoords, cart.getDeltaMovement(), cart.getYRot(), cart.getXRot(), DimensionTransition.PLAY_PORTAL_SOUND)); var spot = IAuraChunk.getHighestSpot(level, pos, 35, pos); IAuraChunk.getAuraChunk(level, spot).drainAura(spot, 50000); @@ -177,4 +163,5 @@ public class BlockDimensionRail extends BaseRailBlock implements IModItem, ICust public void generateCustomItemModel(ItemModelGenerator generator) { generator.withExistingParent(this.getBaseName(), "item/generated").texture("layer0", "block/" + this.getBaseName()); } + } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockEndFlower.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockEndFlower.java index 6dfac60f..9537247d 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockEndFlower.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockEndFlower.java @@ -29,6 +29,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.living.LivingEvent; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.tick.EntityTickEvent; import javax.annotation.Nullable; import java.util.List; @@ -52,7 +53,7 @@ public class BlockEndFlower extends BushBlock implements IModItem, ICustomBlockS } @SubscribeEvent - public void onDragonTick(LivingEvent.LivingTickEvent event) { + public void onDragonTick(EntityTickEvent.Pre event) { var living = event.getEntity(); if (living.level().isClientSide || !(living instanceof EnderDragon dragon)) return; diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockOakGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockOakGenerator.java index 2aa36b81..ba18b385 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockOakGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockOakGenerator.java @@ -19,7 +19,7 @@ import net.minecraft.world.phys.AABB; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import net.neoforged.bus.api.SubscribeEvent; public class BlockOakGenerator extends BlockContainerImpl implements IVisualizable, ICustomBlockState { @@ -31,11 +31,11 @@ public class BlockOakGenerator extends BlockContainerImpl implements IVisualizab } @SubscribeEvent - public void onTreeGrow(SaplingGrowTreeEvent event) { + public void onTreeGrow(BlockGrowFeatureEvent event) { var level = event.getLevel(); var pos = event.getPos(); if (level instanceof Level && !level.isClientSide() && IAuraType.forLevel((Level) level).isSimilar(NaturesAuraAPI.TYPE_OVERWORLD) - && level.getBlockState(pos).getBlock() instanceof SaplingBlock) { + && level.getBlockState(pos).getBlock() instanceof SaplingBlock) { Helper.getBlockEntitiesInArea(level, pos, 10, tile -> { if (!(tile instanceof BlockEntityOakGenerator oak)) return false; @@ -64,13 +64,13 @@ public class BlockOakGenerator extends BlockContainerImpl implements IVisualizab @Override public void generateCustomBlockState(BlockStateGenerator generator) { generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), - generator.modLoc("block/" + this.getBaseName()), - generator.modLoc("block/" + this.getBaseName() + "_bottom"), - generator.modLoc("block/" + this.getBaseName() + "_top"))); + generator.modLoc("block/" + this.getBaseName()), + generator.modLoc("block/" + this.getBaseName() + "_bottom"), + generator.modLoc("block/" + this.getBaseName() + "_top"))); } private static ResourceKey> getReplacement(Holder> holder) { - if(holder == null || !holder.unwrapKey().isPresent()) + if (holder == null || !holder.unwrapKey().isPresent()) return null; ResourceKey> feature = holder.unwrapKey().get(); @@ -86,4 +86,5 @@ public class BlockOakGenerator extends BlockContainerImpl implements IVisualizab return null; } } + } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java index 15cb62ec..2e6d6eeb 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java @@ -14,8 +14,9 @@ import net.minecraft.world.phys.AABB; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.entity.player.EntityItemPickupEvent; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.common.util.TriState; +import net.neoforged.neoforge.event.entity.player.ItemEntityPickupEvent; public class BlockPickupStopper extends BlockContainerImpl implements IVisualizable, ICustomBlockState { @@ -26,10 +27,10 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza } @SubscribeEvent - public void onPickup(EntityItemPickupEvent event) { - var player = event.getEntity(); + public void onPickup(ItemEntityPickupEvent.Pre event) { + var player = event.getPlayer(); if (player != null && !player.isShiftKeyDown()) { - var item = event.getItem(); + var item = event.getItemEntity(); var pos = item.blockPosition(); Helper.getBlockEntitiesInArea(item.level(), pos, 8, tile -> { if (!(tile instanceof BlockEntityPickupStopper stopper)) @@ -41,11 +42,11 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza if (!new AABB(stopperPos).inflate(radius).intersects(item.getBoundingBox())) return false; - event.setCanceled(true); + event.setCanPickup(TriState.FALSE); if (item.level().getGameTime() % 3 == 0) PacketHandler.sendToAllAround(item.level(), pos, 32, - new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.PICKUP_STOPPER)); + new PacketParticles((float) item.getX(), (float) item.getY(), (float) item.getZ(), PacketParticles.Type.PICKUP_STOPPER)); return true; }); } @@ -72,8 +73,9 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza @Override public void generateCustomBlockState(BlockStateGenerator generator) { generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), - generator.modLoc("block/" + this.getBaseName()), - generator.modLoc("block/" + this.getBaseName() + "_top"), - generator.modLoc("block/" + this.getBaseName() + "_top"))); + generator.modLoc("block/" + this.getBaseName()), + generator.modLoc("block/" + this.getBaseName() + "_top"), + generator.modLoc("block/" + this.getBaseName() + "_top"))); } + } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java index 1afee2af..c02037e1 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java @@ -10,25 +10,25 @@ import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.reg.ICustomBlockState; import de.ellpeck.naturesaura.reg.ITESRProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; -import net.minecraft.core.Position; -import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; +import net.minecraft.core.dispenser.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.entity.projectile.ThrownEnderpearl; import net.minecraft.world.entity.projectile.ThrownTrident; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.ProjectileItem.DispenseConfig; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.phys.BlockHitResult; -import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.entity.ProjectileImpactEvent; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.util.ObfuscationReflectionHelper; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.ProjectileImpactEvent; public class BlockProjectileGenerator extends BlockContainerImpl implements ITESRProvider, ICustomBlockState { @@ -36,23 +36,34 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES super("projectile_generator", BlockEntityProjectileGenerator.class, Properties.of().strength(2.5F).sound(SoundType.STONE)); NeoForge.EVENT_BUS.register(this); - DispenserBlock.registerBehavior(Items.ENDER_PEARL, new AbstractProjectileDispenseBehavior() { - + DispenserBlock.registerBehavior(Items.ENDER_PEARL, new DefaultDispenseItemBehavior() { @Override - protected Projectile getProjectile(Level levelIn, Position position, ItemStack stackIn) { - var ret = new ThrownEnderpearl(EntityType.ENDER_PEARL, levelIn); - ret.setPos(position.x(), position.y(), position.z()); - return ret; + protected ItemStack execute(BlockSource blockSource, ItemStack item) { + Level level = blockSource.level(); + var direction = blockSource.state().getValue(DispenserBlock.FACING); + var position = DispenseConfig.DEFAULT.positionFunction().getDispensePosition(blockSource, direction); + var projectile = new ThrownEnderpearl(EntityType.ENDER_PEARL, level); + projectile.setPos(position.x(), position.y(), position.z()); + projectile.shoot(direction.getStepX(), direction.getStepY(), direction.getStepZ(), DispenseConfig.DEFAULT.power(), DispenseConfig.DEFAULT.uncertainty()); + level.addFreshEntity(projectile); + item.shrink(1); + return item; } }); - DispenserBlock.registerBehavior(Items.TRIDENT, new AbstractProjectileDispenseBehavior() { + DispenserBlock.registerBehavior(Items.TRIDENT, new DefaultDispenseItemBehavior() { @Override - protected Projectile getProjectile(Level levelIn, Position position, ItemStack stackIn) { - var ret = new ThrownTrident(EntityType.TRIDENT, levelIn); - ret.setPos(position.x(), position.y(), position.z()); - ObfuscationReflectionHelper.setPrivateValue(ThrownTrident.class, ret, stackIn.copy(), "pickupItemStack"); - ret.pickup = AbstractArrow.Pickup.ALLOWED; - return ret; + protected ItemStack execute(BlockSource blockSource, ItemStack item) { + Level level = blockSource.level(); + var direction = blockSource.state().getValue(DispenserBlock.FACING); + var position = DispenseConfig.DEFAULT.positionFunction().getDispensePosition(blockSource, direction); + var projectile = new ThrownTrident(EntityType.TRIDENT, level); + ObfuscationReflectionHelper.setPrivateValue(ThrownTrident.class, projectile, item.copy(), "pickupItemStack"); + projectile.pickup = AbstractArrow.Pickup.ALLOWED; + projectile.setPos(position.x(), position.y(), position.z()); + projectile.shoot(direction.getStepX(), direction.getStepY(), direction.getStepZ(), DispenseConfig.DEFAULT.power(), DispenseConfig.DEFAULT.uncertainty()); + level.addFreshEntity(projectile); + item.shrink(1); + return item; } }); } @@ -81,7 +92,7 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES generator.generateAura(amount); PacketHandler.sendToAllAround(entity.level(), pos, 32, - new PacketParticles((float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), PacketParticles.Type.PROJECTILE_GEN, pos.getX(), pos.getY(), pos.getZ())); + new PacketParticles((float) entity.getX(), (float) entity.getY(), (float) entity.getZ(), PacketParticles.Type.PROJECTILE_GEN, pos.getX(), pos.getY(), pos.getZ())); entity.level().playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENDER_EYE_LAUNCH, SoundSource.BLOCKS, 0.8F, 1F); generator.nextSide = generator.nextSide.getClockWise(); @@ -94,13 +105,14 @@ public class BlockProjectileGenerator extends BlockContainerImpl implements ITES @Override public void generateCustomBlockState(BlockStateGenerator generator) { generator.simpleBlock(this, generator.models().cubeBottomTop(this.getBaseName(), - generator.modLoc("block/" + this.getBaseName()), - generator.modLoc("block/" + this.getBaseName() + "_top"), - generator.modLoc("block/" + this.getBaseName() + "_top"))); + generator.modLoc("block/" + this.getBaseName()), + generator.modLoc("block/" + this.getBaseName() + "_top"), + generator.modLoc("block/" + this.getBaseName() + "_top"))); } @Override public void registerTESR() { BlockEntityRenderers.register(ModBlockEntities.PROJECTILE_GENERATOR, RenderProjectileGenerator::new); } + } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockWoodStand.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockWoodStand.java index 8ae8f850..33b443fe 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockWoodStand.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockWoodStand.java @@ -12,7 +12,7 @@ import de.ellpeck.naturesaura.reg.ITESRProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.core.BlockPos; 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.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -26,7 +26,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.common.NeoForge; -import net.neoforged.neoforge.event.level.SaplingGrowTreeEvent; +import net.neoforged.neoforge.event.level.BlockGrowFeatureEvent; import org.apache.commons.lang3.mutable.MutableObject; import java.util.ArrayList; @@ -53,7 +53,7 @@ public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider< } @SubscribeEvent - public void onTreeGrow(SaplingGrowTreeEvent event) { + public void onTreeGrow(BlockGrowFeatureEvent event) { var level = event.getLevel(); var pos = event.getPos(); if (!level.isClientSide() && level instanceof Level) { @@ -99,9 +99,8 @@ public class BlockWoodStand extends BlockContainerImpl implements ITESRProvider< } @Override - @SuppressWarnings("deprecation") - public InteractionResult use(BlockState state, Level levelIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { - return Helper.putStackOnTile(player, handIn, pos, 0, true); + protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) { + return Helper.putStackOnTile(player, hand, pos, 0, true); } @Override diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityPotionGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityPotionGenerator.java index 7bb9b82d..539ef669 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityPotionGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/BlockEntityPotionGenerator.java @@ -1,16 +1,22 @@ package de.ellpeck.naturesaura.blocks.tiles; +import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; import de.ellpeck.naturesaura.packet.PacketHandler; import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.AreaEffectCloud; -import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import net.neoforged.fml.util.ObfuscationReflectionHelper; + +import java.lang.reflect.Field; public class BlockEntityPotionGenerator extends BlockEntityImpl implements ITickableBlockEntity { + private static final Field POTION_CONTENTS_FIELD = ObfuscationReflectionHelper.findField(AreaEffectCloud.class, "potionContents"); + public BlockEntityPotionGenerator(BlockPos pos, BlockState state) { super(ModBlockEntities.POTION_GENERATOR, pos, state); } @@ -27,12 +33,17 @@ public class BlockEntityPotionGenerator extends BlockEntityImpl implements ITick continue; if (!addedOne) { - var type = cloud.getPotion(); - if (type == null) + PotionContents type; + try { + // TODO check if this new private value getter works + type = (PotionContents) BlockEntityPotionGenerator.POTION_CONTENTS_FIELD.get(cloud); + } catch (IllegalAccessException e) { + NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e); continue; + } - for (var effect : type.getEffects()) { - var potion = effect.getEffect(); + for (var effect : type.getAllEffects()) { + var potion = effect.getEffect().value(); if (!potion.isBeneficial() || potion.isInstantenous()) { continue; } @@ -43,8 +54,8 @@ public class BlockEntityPotionGenerator extends BlockEntityImpl implements ITick this.generateAura(toAdd); PacketHandler.sendToAllAround(this.level, this.worldPosition, 32, new PacketParticles( - this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.POTION_GEN, - PotionUtils.getColor(type), canGen ? 1 : 0)); + this.worldPosition.getX(), this.worldPosition.getY(), this.worldPosition.getZ(), PacketParticles.Type.POTION_GEN, + type.getColor(), canGen ? 1 : 0)); addedOne = true; break; @@ -66,4 +77,5 @@ public class BlockEntityPotionGenerator extends BlockEntityImpl implements ITick public boolean wantsLimitRemover() { return true; } + } diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java index 4f749ae7..900f82cf 100644 --- a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java @@ -132,10 +132,10 @@ public class AuraChunk implements IAuraChunk { this.drainSpots.put(spot.pos, spot); } - public void setSpots(Collection spots) { + public void setSpots(Collection spots) { this.drainSpots.clear(); for (var spot : spots) - this.addDrainSpot(spot); + this.addDrainSpot(new DrainSpot(spot)); this.addOrRemoveAsActive(); } diff --git a/src/main/java/de/ellpeck/naturesaura/compat/CuriosCompat.java b/src/main/java/de/ellpeck/naturesaura/compat/CuriosCompat.java index f65f96fc..3cf20503 100644 --- a/src/main/java/de/ellpeck/naturesaura/compat/CuriosCompat.java +++ b/src/main/java/de/ellpeck/naturesaura/compat/CuriosCompat.java @@ -1,3 +1,5 @@ +// TODO curios? +/* package de.ellpeck.naturesaura.compat; import com.google.common.collect.ImmutableMap; @@ -88,3 +90,4 @@ public class CuriosCompat implements ICompat { } } +*/ diff --git a/src/main/java/de/ellpeck/naturesaura/data/BiomeModifiers.java b/src/main/java/de/ellpeck/naturesaura/data/BiomeModifiers.java index c3217b10..486a3898 100644 --- a/src/main/java/de/ellpeck/naturesaura/data/BiomeModifiers.java +++ b/src/main/java/de/ellpeck/naturesaura/data/BiomeModifiers.java @@ -4,7 +4,7 @@ import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.gen.ModFeatures; import net.minecraft.core.HolderSet; import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BiomeTags; @@ -23,37 +23,37 @@ public class BiomeModifiers { public static final ResourceKey AURA_MUSHROOM = BiomeModifiers.createKey("aura_mushroom"); private static ResourceKey createKey(String id) { - return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, new ResourceLocation(NaturesAura.MOD_ID, id)); + return ResourceKey.create(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, id)); } - public static void bootstrap(BootstapContext context) { + public static void bootstrap(BootstrapContext context) { var biomeGetter = context.lookup(Registries.BIOME); var placedGetter = context.lookup(Registries.PLACED_FEATURE); context.register(BiomeModifiers.AURA_BLOOM, new AddFeaturesBiomeModifier( - biomeGetter.getOrThrow(BiomeTags.IS_OVERWORLD), - HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_BLOOM)), - GenerationStep.Decoration.VEGETAL_DECORATION)); + biomeGetter.getOrThrow(BiomeTags.IS_OVERWORLD), + HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_BLOOM)), + GenerationStep.Decoration.VEGETAL_DECORATION)); context.register(BiomeModifiers.AURA_CACTUS, new AddFeaturesBiomeModifier( - biomeGetter.getOrThrow(Tags.Biomes.IS_SANDY), - HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_CACTUS)), - GenerationStep.Decoration.VEGETAL_DECORATION)); + biomeGetter.getOrThrow(Tags.Biomes.IS_SANDY), + HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_CACTUS)), + GenerationStep.Decoration.VEGETAL_DECORATION)); context.register(BiomeModifiers.AURA_MUSHROOM, new AddFeaturesBiomeModifier( - biomeGetter.getOrThrow(Tags.Biomes.IS_MUSHROOM), - HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_MUSHROOM)), - GenerationStep.Decoration.VEGETAL_DECORATION)); + biomeGetter.getOrThrow(Tags.Biomes.IS_MUSHROOM), + HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.AURA_MUSHROOM)), + GenerationStep.Decoration.VEGETAL_DECORATION)); context.register(BiomeModifiers.CRIMSON_AURA_MUSHROOM, new AddFeaturesBiomeModifier( - biomeGetter.getOrThrow(BiomeTags.IS_NETHER), - HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.CRIMSON_AURA_MUSHROOM)), - GenerationStep.Decoration.VEGETAL_DECORATION)); + biomeGetter.getOrThrow(BiomeTags.IS_NETHER), + HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.CRIMSON_AURA_MUSHROOM)), + GenerationStep.Decoration.VEGETAL_DECORATION)); context.register(BiomeModifiers.WARPED_AURA_MUSHROOM, new AddFeaturesBiomeModifier( - biomeGetter.getOrThrow(BiomeTags.IS_NETHER), - HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.WARPED_AURA_MUSHROOM)), - GenerationStep.Decoration.VEGETAL_DECORATION)); + biomeGetter.getOrThrow(BiomeTags.IS_NETHER), + HolderSet.direct(placedGetter.getOrThrow(ModFeatures.Placed.WARPED_AURA_MUSHROOM)), + GenerationStep.Decoration.VEGETAL_DECORATION)); } } diff --git a/src/main/java/de/ellpeck/naturesaura/data/ModData.java b/src/main/java/de/ellpeck/naturesaura/data/ModData.java index 36d09712..e267f193 100644 --- a/src/main/java/de/ellpeck/naturesaura/data/ModData.java +++ b/src/main/java/de/ellpeck/naturesaura/data/ModData.java @@ -12,6 +12,7 @@ import net.minecraft.data.loot.LootTableProvider; import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.data.event.GatherDataEvent; @@ -22,7 +23,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; -@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public final class ModData { @SubscribeEvent diff --git a/src/main/java/de/ellpeck/naturesaura/items/ItemPetReviver.java b/src/main/java/de/ellpeck/naturesaura/items/ItemPetReviver.java index 95153d54..34880e82 100644 --- a/src/main/java/de/ellpeck/naturesaura/items/ItemPetReviver.java +++ b/src/main/java/de/ellpeck/naturesaura/items/ItemPetReviver.java @@ -20,6 +20,7 @@ import net.neoforged.neoforge.event.entity.living.LivingEvent; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.event.tick.EntityTickEvent; public class ItemPetReviver extends ItemImpl { @@ -31,7 +32,7 @@ public class ItemPetReviver extends ItemImpl { private static class Events { @SubscribeEvent - public void onEntityTick(LivingEvent.LivingTickEvent event) { + public void onEntityTick(EntityTickEvent event) { var entity = event.getEntity(); if (entity.level().isClientSide || entity.level().getGameTime() % 20 != 0 || !(entity instanceof TamableAnimal tameable)) return; @@ -42,10 +43,10 @@ public class ItemPetReviver extends ItemImpl { return; if (entity.level().random.nextFloat() >= 0.65F) { ((ServerLevel) entity.level()).sendParticles(ParticleTypes.HEART, - entity.getX() + entity.level().random.nextGaussian() * 0.25F, - entity.getEyeY() + entity.level().random.nextGaussian() * 0.25F, - entity.getZ() + entity.level().random.nextGaussian() * 0.25F, - entity.level().random.nextInt(2) + 1, 0, 0, 0, 0); + entity.getX() + entity.level().random.nextGaussian() * 0.25F, + entity.getEyeY() + entity.level().random.nextGaussian() * 0.25F, + entity.getZ() + entity.level().random.nextGaussian() * 0.25F, + entity.level().random.nextInt(2) + 1, 0, 0, 0, 0); } } @@ -129,5 +130,7 @@ public class ItemPetReviver extends ItemImpl { owner.sendSystemMessage(Component.translatable("info." + NaturesAura.MOD_ID + ".pet_reviver", spawnedPet.getDisplayName()).withStyle(ChatFormatting.ITALIC, ChatFormatting.GRAY)); event.setCanceled(true); } + } + } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java index 104e7179..3fa3cb08 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java @@ -4,56 +4,36 @@ import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.chunk.AuraChunk; import de.ellpeck.naturesaura.events.ClientEvents; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; 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.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; import java.util.ArrayList; import java.util.Collection; -public class PacketAuraChunk implements CustomPacketPayload { +public record PacketAuraChunk(int chunkX, int chunkZ, Collection drainSpots) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(NaturesAura.MOD_ID, "aura_chunk"); - - private final int chunkX; - private final int chunkZ; - private final Collection drainSpots; - - public PacketAuraChunk(int chunkX, int chunkZ, Collection drainSpots) { - this.chunkX = chunkX; - this.chunkZ = chunkZ; - this.drainSpots = drainSpots; - } - - public PacketAuraChunk(FriendlyByteBuf buf) { - this.chunkX = buf.readInt(); - this.chunkZ = buf.readInt(); - - this.drainSpots = new ArrayList<>(); - var amount = buf.readInt(); - for (var i = 0; i < amount; i++) - this.drainSpots.add(new AuraChunk.DrainSpot(buf.readNbt())); - } + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "aura_chunk")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, PacketAuraChunk::chunkX, + ByteBufCodecs.INT, PacketAuraChunk::chunkZ, + ByteBufCodecs.collection(ArrayList::new, ByteBufCodecs.COMPOUND_TAG), PacketAuraChunk::drainSpots, + PacketAuraChunk::new); @Override - public void write(FriendlyByteBuf buf) { - buf.writeInt(this.chunkX); - buf.writeInt(this.chunkZ); - - buf.writeInt(this.drainSpots.size()); - for (var entry : this.drainSpots) - buf.writeNbt(entry.serializeNBT()); + public Type type() { + return PacketAuraChunk.TYPE; } - @Override - public ResourceLocation id() { - return PacketAuraChunk.ID; - } - - public static void onMessage(PacketAuraChunk message, PlayPayloadContext ctx) { - ctx.workHandler().execute(() -> ClientEvents.PENDING_AURA_CHUNKS.add(message)); + public static void onMessage(PacketAuraChunk message, IPayloadContext ctx) { + ClientEvents.PENDING_AURA_CHUNKS.add(message); } public boolean tryHandle(Level level) { @@ -62,8 +42,6 @@ public class PacketAuraChunk implements CustomPacketPayload { if (chunk.isEmpty()) return false; var auraChunk = (AuraChunk) chunk.getData(NaturesAuraAPI.AURA_CHUNK_ATTACHMENT); - if (auraChunk == null) - return false; auraChunk.setSpots(this.drainSpots); return true; } catch (Exception e) { diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java index 1daaba7d..ce4a3a18 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java @@ -8,63 +8,46 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; 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.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; -public class PacketClient implements CustomPacketPayload { +import java.util.ArrayList; - public static final ResourceLocation ID = new ResourceLocation(NaturesAura.MOD_ID, "client"); +public record PacketClient(int packetType, CompoundTag data) implements CustomPacketPayload { - private final int type; - private final CompoundTag data; - - public PacketClient(int type, CompoundTag data) { - this.type = type; - this.data = data; - } - - public PacketClient(FriendlyByteBuf buf) { - this.type = buf.readByte(); - this.data = buf.readNbt(); - } + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "client")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, PacketClient::packetType, + ByteBufCodecs.COMPOUND_TAG, PacketClient::data, + PacketClient::new); @Override - public void write(FriendlyByteBuf buf) { - buf.writeByte(this.type); - buf.writeNbt(this.data); + public Type type() { + return PacketClient.TYPE; } - @Override - public ResourceLocation id() { - return PacketClient.ID; - } - - @SuppressWarnings("Convert2Lambda") - public static void onMessage(PacketClient message, PlayPayloadContext ctx) { - ctx.workHandler().execute(new Runnable() { - @Override - public void run() { - var mc = Minecraft.getInstance(); - if (mc.level != null) { - switch (message.type) { - case 0: // dimension rail visualization - var goalDim = new ResourceLocation(message.data.getString("dim")); - var goalPos = BlockPos.of(message.data.getLong("pos")); - ItemRangeVisualizer.visualize(mc.player, ItemRangeVisualizer.VISUALIZED_RAILS, goalDim, goalPos); - case 1: - var entity = mc.level.getEntity(message.data.getInt("id")); - mc.particleEngine.createTrackingEmitter(entity, ParticleTypes.TOTEM_OF_UNDYING, 30); - mc.level.playLocalSound(entity.getX(), entity.getY(), entity.getZ(), SoundEvents.TOTEM_USE, entity.getSoundSource(), 1.0F, 1.0F, false); - if (entity == mc.player) { - mc.gameRenderer.displayItemActivation(new ItemStack(ModItems.DEATH_RING)); - } - } - } + public static void onMessage(PacketClient message, IPayloadContext ctx) { + var mc = Minecraft.getInstance(); + if (mc.level != null) { + switch (message.packetType) { + case 0: // dimension rail visualization + var goalDim = ResourceLocation.parse(message.data.getString("dim")); + var goalPos = BlockPos.of(message.data.getLong("pos")); + ItemRangeVisualizer.visualize(mc.player, ItemRangeVisualizer.VISUALIZED_RAILS, goalDim, goalPos); + case 1: + var entity = mc.level.getEntity(message.data.getInt("id")); + mc.particleEngine.createTrackingEmitter(entity, ParticleTypes.TOTEM_OF_UNDYING, 30); + mc.level.playLocalSound(entity.getX(), entity.getY(), entity.getZ(), SoundEvents.TOTEM_USE, entity.getSoundSource(), 1.0F, 1.0F, false); + if (entity == mc.player) + mc.gameRenderer.displayItemActivation(new ItemStack(ModItems.DEATH_RING)); } - }); + } } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java index d3293188..bf87b2fe 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java @@ -3,33 +3,34 @@ package de.ellpeck.naturesaura.packet; import de.ellpeck.naturesaura.NaturesAura; import net.minecraft.core.BlockPos; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod.EventBusSubscriber; -import net.neoforged.fml.common.Mod.EventBusSubscriber.Bus; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.network.PacketDistributor; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; -@EventBusSubscriber(bus = Bus.MOD) +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public final class PacketHandler { @SubscribeEvent - public static void onPayloadRegister(RegisterPayloadHandlerEvent event) { + public static void onPayloadRegister(RegisterPayloadHandlersEvent event) { var registrar = event.registrar(NaturesAura.MOD_ID); - registrar.play(PacketAuraChunk.ID, PacketAuraChunk::new, PacketAuraChunk::onMessage); - registrar.play(PacketClient.ID, PacketClient::new, PacketClient::onMessage); - registrar.play(PacketParticles.ID, PacketParticles::new, PacketParticles::onMessage); - registrar.play(PacketParticleStream.ID, PacketParticleStream::new, PacketParticleStream::onMessage); + registrar.playBidirectional(PacketAuraChunk.TYPE, PacketAuraChunk.CODEC, PacketAuraChunk::onMessage); + registrar.playBidirectional(PacketClient.TYPE, PacketClient.CODEC, PacketClient::onMessage); + registrar.playBidirectional(PacketParticles.TYPE, PacketParticles.CODEC, PacketParticles::onMessage); + registrar.playBidirectional(PacketParticleStream.TYPE, PacketParticleStream.CODEC, PacketParticleStream::onMessage); } public static void sendToAllLoaded(Level level, BlockPos pos, CustomPacketPayload message) { - PacketDistributor.TRACKING_CHUNK.with(level.getChunkAt(pos)).send(message); + PacketDistributor.sendToPlayersTrackingChunk((ServerLevel) level, new ChunkPos(pos), message); } public static void sendToAllAround(Level level, BlockPos pos, int range, CustomPacketPayload message) { - PacketDistributor.NEAR.with(new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), range, level.dimension())).send(message); + PacketDistributor.sendToPlayersNear((ServerLevel) level, null, pos.getX(), pos.getY(), pos.getZ(), range, message); } public static void sendTo(Player player, CustomPacketPayload message) { diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java index 11a6b044..d7afb09e 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java @@ -2,74 +2,39 @@ package de.ellpeck.naturesaura.packet; import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; -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.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.joml.Vector3f; -public class PacketParticleStream implements CustomPacketPayload { +public record PacketParticleStream(Vector3f start, Vector3f end, float speed, int color, float scale) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(NaturesAura.MOD_ID, "particle_stream"); - - private final float startX; - private final float startY; - private final float startZ; - - private final float endX; - private final float endY; - private final float endZ; - - private final float speed; - private final int color; - private final float scale; + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "particle_stream")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.VECTOR3F, PacketParticleStream::start, + ByteBufCodecs.VECTOR3F, PacketParticleStream::end, + ByteBufCodecs.FLOAT, PacketParticleStream::speed, + ByteBufCodecs.INT, PacketParticleStream::color, + ByteBufCodecs.FLOAT, PacketParticleStream::scale, + PacketParticleStream::new); public PacketParticleStream(float startX, float startY, float startZ, float endX, float endY, float endZ, float speed, int color, float scale) { - this.startX = startX; - this.startY = startY; - this.startZ = startZ; - this.endX = endX; - this.endY = endY; - this.endZ = endZ; - this.speed = speed; - this.color = color; - this.scale = scale; - } - - public PacketParticleStream(FriendlyByteBuf buf) { - this.startX = buf.readFloat(); - this.startY = buf.readFloat(); - this.startZ = buf.readFloat(); - this.endX = buf.readFloat(); - this.endY = buf.readFloat(); - this.endZ = buf.readFloat(); - this.speed = buf.readFloat(); - this.color = buf.readInt(); - this.scale = buf.readFloat(); + this(new Vector3f(startX, startY, startZ), new Vector3f(endX, endY, endZ), speed, color, scale); } @Override - public void write(FriendlyByteBuf buf) { - buf.writeFloat(this.startX); - buf.writeFloat(this.startY); - buf.writeFloat(this.startZ); - buf.writeFloat(this.endX); - buf.writeFloat(this.endY); - buf.writeFloat(this.endZ); - buf.writeFloat(this.speed); - buf.writeInt(this.color); - buf.writeFloat(this.scale); + public Type type() { + return PacketParticleStream.TYPE; } - @Override - public ResourceLocation id() { - return PacketParticleStream.ID; - } - - public static void onMessage(PacketParticleStream message, PlayPayloadContext ctx) { - ctx.workHandler().execute(() -> NaturesAuraAPI.instance().spawnParticleStream( - message.startX, message.startY, message.startZ, - message.endX, message.endY, message.endZ, - message.speed, message.color, message.scale)); + public static void onMessage(PacketParticleStream message, IPayloadContext ctx) { + NaturesAuraAPI.instance().spawnParticleStream( + message.start.x, message.start.y, message.start.z, + message.end.x, message.end.y, message.end.z, + message.speed, message.color, message.scale); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java index 6bd0e6b1..a43bc7d7 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java @@ -11,66 +11,43 @@ import net.minecraft.client.renderer.BiomeColors; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ItemParticleOption; import net.minecraft.core.particles.ParticleTypes; -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.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.function.BiConsumer; -public class PacketParticles implements CustomPacketPayload { +public record PacketParticles(float posX, float posY, float posZ, int particleType, List data) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(NaturesAura.MOD_ID, "particles"); + public static final CustomPacketPayload.Type TYPE = new CustomPacketPayload.Type<>(ResourceLocation.fromNamespaceAndPath(NaturesAura.MOD_ID, "particles")); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.FLOAT, PacketParticles::posX, + ByteBufCodecs.FLOAT, PacketParticles::posY, + ByteBufCodecs.FLOAT, PacketParticles::posZ, + ByteBufCodecs.INT, PacketParticles::particleType, + ByteBufCodecs.collection(ArrayList::new, ByteBufCodecs.INT), PacketParticles::data, + PacketParticles::new); - private final float posX; - private final float posY; - private final float posZ; - private final Type type; - private final int[] data; - - public PacketParticles(float posX, float posY, float posZ, Type type, int... data) { - this.posX = posX; - this.posY = posY; - this.posZ = posZ; - this.type = type; - this.data = data; - } - - public PacketParticles(FriendlyByteBuf buf) { - this.posX = buf.readFloat(); - this.posY = buf.readFloat(); - this.posZ = buf.readFloat(); - this.type = Type.values()[buf.readByte()]; - - this.data = new int[buf.readByte()]; - for (var i = 0; i < this.data.length; i++) - this.data[i] = buf.readInt(); + public PacketParticles(float posX, float posY, float posZ, Type particleType, int... data) { + this(posX, posY, posZ, particleType.ordinal(), Arrays.stream(data).boxed().toList()); } @Override - public void write(FriendlyByteBuf buf) { - buf.writeFloat(this.posX); - buf.writeFloat(this.posY); - buf.writeFloat(this.posZ); - buf.writeByte(this.type.ordinal()); - - buf.writeByte(this.data.length); - for (var i : this.data) - buf.writeInt(i); + public CustomPacketPayload.Type type() { + return PacketParticles.TYPE; } - @Override - public ResourceLocation id() { - return null; - } - - public static void onMessage(PacketParticles message, PlayPayloadContext ctx) { - ctx.workHandler().execute(() -> { - var level = ctx.level().orElseThrow(); - if (level != null) - message.type.action.accept(message, level); - }); + public static void onMessage(PacketParticles message, IPayloadContext ctx) { + var level = Minecraft.getInstance().level; + if (level != null) + Type.values()[message.particleType].action.accept(message, level); } public enum Type { @@ -80,107 +57,107 @@ public class PacketParticles implements CustomPacketPayload { var state = level.getBlockState(dustPos); var box = state.getShape(level, dustPos).bounds(); NaturesAuraAPI.instance().spawnMagicParticle( - dustPos.getX() + box.minX + (box.maxX - box.minX) * level.random.nextFloat(), - dustPos.getY() + 0.1F, - dustPos.getZ() + box.minZ + (box.maxZ - box.minZ) * level.random.nextFloat(), - (float) level.random.nextGaussian() * 0.02F, - level.random.nextFloat() * 0.01F + 0.02F, - (float) level.random.nextGaussian() * 0.02F, - 0xf4cb42, 2F, 50, 0F, false, true); + dustPos.getX() + box.minX + (box.maxX - box.minX) * level.random.nextFloat(), + dustPos.getY() + 0.1F, + dustPos.getZ() + box.minZ + (box.maxZ - box.minZ) * level.random.nextFloat(), + (float) level.random.nextGaussian() * 0.02F, + level.random.nextFloat() * 0.01F + 0.02F, + (float) level.random.nextGaussian() * 0.02F, + 0xf4cb42, 2F, 50, 0F, false, true); return true; }); }), TR_CONSUME_ITEM((message, level) -> { for (var i = level.random.nextInt(20) + 10; i >= 0; i--) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.5F, message.posY + 0.9F, message.posZ + 0.5F, - (float) level.random.nextGaussian() * 0.04F, level.random.nextFloat() * 0.04F, (float) level.random.nextGaussian() * 0.04F, - 0x89cc37, 1.5F, 25, 0F, false, true); + message.posX + 0.5F, message.posY + 0.9F, message.posZ + 0.5F, + (float) level.random.nextGaussian() * 0.04F, level.random.nextFloat() * 0.04F, (float) level.random.nextGaussian() * 0.04F, + 0x89cc37, 1.5F, 25, 0F, false, true); } }), TR_DISAPPEAR((message, level) -> { for (var i = level.random.nextInt(5) + 3; i >= 0; i--) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat(), message.posY + level.random.nextFloat(), message.posZ + level.random.nextFloat(), - 0F, 0F, 0F, - 0x33FF33, 1F, 50, 0F, false, true); + message.posX + level.random.nextFloat(), message.posY + level.random.nextFloat(), message.posZ + level.random.nextFloat(), + 0F, 0F, 0F, + 0x33FF33, 1F, 50, 0F, false, true); } }), TR_SPAWN_RESULT((message, level) -> { for (var i = level.random.nextInt(10) + 10; i >= 0; i--) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY, message.posZ, - level.random.nextGaussian() * 0.1F, level.random.nextGaussian() * 0.1F, level.random.nextGaussian() * 0.1F, - 0x89cc37, 2F, 100, 0F, true, true); + message.posX, message.posY, message.posZ, + level.random.nextGaussian() * 0.1F, level.random.nextGaussian() * 0.1F, level.random.nextGaussian() * 0.1F, + 0x89cc37, 2F, 100, 0F, true, true); } }), ALTAR_CONVERSION((message, level) -> { - var color = message.data[0]; + var color = message.data.getFirst(); for (var i = level.random.nextInt(5) + 2; i >= 0; i--) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 0.9F + 0.25F * level.random.nextFloat(), - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.02F, level.random.nextFloat() * 0.02F, level.random.nextGaussian() * 0.02F, - color, level.random.nextFloat() * 1.5F + 0.75F, 20, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 0.9F + 0.25F * level.random.nextFloat(), + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.02F, level.random.nextFloat() * 0.02F, level.random.nextGaussian() * 0.02F, + color, level.random.nextFloat() * 1.5F + 0.75F, 20, 0F, false, true); } }), POTION_GEN((message, level) -> { - var color = message.data[0]; - var releaseAura = message.data[1] > 0; + var color = message.data.getFirst(); + var releaseAura = message.data.get(1) > 0; for (var i = level.random.nextInt(5) + 5; i >= 0; i--) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat(), - message.posY + 1.1F, - message.posZ + level.random.nextFloat(), - level.random.nextGaussian() * 0.01F, level.random.nextFloat() * 0.1F, level.random.nextGaussian() * 0.01F, - color, 2F + level.random.nextFloat(), 40, 0F, true, true); + message.posX + level.random.nextFloat(), + message.posY + 1.1F, + message.posZ + level.random.nextFloat(), + level.random.nextGaussian() * 0.01F, level.random.nextFloat() * 0.1F, level.random.nextGaussian() * 0.01F, + color, 2F + level.random.nextFloat(), 40, 0F, true, true); if (releaseAura) for (var x = -1; x <= 1; x += 2) for (var z = -1; z <= 1; z += 2) { NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + x * 3 + 0.5F, - message.posY + 2.5, - message.posZ + z * 3 + 0.5F, - level.random.nextGaussian() * 0.02F, - level.random.nextFloat() * 0.04F, - level.random.nextGaussian() * 0.02F, - 0xd6340c, 1F + level.random.nextFloat() * 2F, 75, 0F, true, true); + message.posX + x * 3 + 0.5F, + message.posY + 2.5, + message.posZ + z * 3 + 0.5F, + level.random.nextGaussian() * 0.02F, + level.random.nextFloat() * 0.04F, + level.random.nextGaussian() * 0.02F, + 0xd6340c, 1F + level.random.nextFloat() * 2F, 75, 0F, true, true); } } }), PLANT_BOOST((message, level) -> { for (var i = level.random.nextInt(20) + 15; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat(), - message.posY + 0.25F + level.random.nextFloat() * 0.5F, - message.posZ + level.random.nextFloat(), - 0F, level.random.nextFloat() * 0.02F, 0F, - 0x5ccc30, 1F + level.random.nextFloat() * 2F, 50, 0F, false, true); + message.posX + level.random.nextFloat(), + message.posY + 0.25F + level.random.nextFloat() * 0.5F, + message.posZ + level.random.nextFloat(), + 0F, level.random.nextFloat() * 0.02F, 0F, + 0x5ccc30, 1F + level.random.nextFloat() * 2F, 50, 0F, false, true); }), FLOWER_GEN_CONSUME((message, level) -> { - var color = message.data[0]; + var color = message.data.getFirst(); for (var i = level.random.nextInt(10) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 0.25F + level.random.nextFloat() * 0.5F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.02F, - level.random.nextGaussian() * 0.02F, - level.random.nextGaussian() * 0.02F, - color, level.random.nextFloat() * 2F + 1F, 25, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 0.25F + level.random.nextFloat() * 0.5F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.02F, + level.random.nextGaussian() * 0.02F, + level.random.nextGaussian() * 0.02F, + color, level.random.nextFloat() * 2F + 1F, 25, 0F, false, true); }), FLOWER_GEN_AURA_CREATION((message, level) -> { for (var i = level.random.nextInt(10) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); }), PLACER_PLACING((message, level) -> { for (var i = level.random.nextInt(20) + 20; i >= 0; i--) { @@ -188,181 +165,181 @@ public class PacketParticles implements CustomPacketPayload { var x = side ? level.random.nextFloat() : level.random.nextBoolean() ? 1.1F : -0.1F; var z = !side ? level.random.nextFloat() : level.random.nextBoolean() ? 1.1F : -0.1F; NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + x, message.posY + 0.1F + level.random.nextFloat() * 0.98F, message.posZ + z, - 0F, 0F, 0F, - 0xad7a37, level.random.nextFloat() + 1F, 50, 0F, true, true); + message.posX + x, message.posY + 0.1F + level.random.nextFloat() * 0.98F, message.posZ + z, + 0F, 0F, 0F, + 0xad7a37, level.random.nextFloat() + 1F, 50, 0F, true, true); } }), HOPPER_UPGRADE((message, level) -> { for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.45F, message.posZ, - level.random.nextGaussian() * 0.015F, - level.random.nextGaussian() * 0.015F, - level.random.nextGaussian() * 0.015F, - 0xdde7ff, level.random.nextFloat() + 1F, 30, -0.06F, true, true); + message.posX, message.posY + 0.45F, message.posZ, + level.random.nextGaussian() * 0.015F, + level.random.nextGaussian() * 0.015F, + level.random.nextGaussian() * 0.015F, + 0xdde7ff, level.random.nextFloat() + 1F, 30, -0.06F, true, true); }), SHOCKWAVE_CREATOR((message, level) -> { for (var i = 0; i < 360; i += 2) { var rad = Math.toRadians(i); NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.01F, message.posZ, - (float) Math.sin(rad) * 0.65F, - 0F, - (float) Math.cos(rad) * 0.65F, - 0x911b07, 3F, 10, 0F, false, true); + message.posX, message.posY + 0.01F, message.posZ, + (float) Math.sin(rad) * 0.65F, + 0F, + (float) Math.cos(rad) * 0.65F, + 0x911b07, 3F, 10, 0F, false, true); } }), OAK_GENERATOR((message, level) -> { - var sapX = message.data[0]; - var sapY = message.data[1]; - var sapZ = message.data[2]; - var releaseAura = message.data[3] > 0; + var sapX = message.data.getFirst(); + var sapY = message.data.get(1); + var sapZ = message.data.get(2); + var releaseAura = message.data.get(3) > 0; for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnParticleStream( - sapX + 0.5F + (float) level.random.nextGaussian() * 3F, - sapY + 0.5F + level.random.nextFloat() * 4F, - sapZ + 0.5F + (float) level.random.nextGaussian() * 3F, - message.posX + 0.5F, - message.posY + 0.5F, - message.posZ + 0.5F, - 0.6F, BiomeColors.getAverageGrassColor(level, new BlockPos(sapX, sapY, sapZ)), 1.5F); + sapX + 0.5F + (float) level.random.nextGaussian() * 3F, + sapY + 0.5F + level.random.nextFloat() * 4F, + sapZ + 0.5F + (float) level.random.nextGaussian() * 3F, + message.posX + 0.5F, + message.posY + 0.5F, + message.posZ + 0.5F, + 0.6F, BiomeColors.getAverageGrassColor(level, new BlockPos(sapX, sapY, sapZ)), 1.5F); if (releaseAura) for (var i = level.random.nextInt(10) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.03F, - level.random.nextFloat() * 0.04F + 0.04F, - level.random.nextGaussian() * 0.03F, - 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 60, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.03F, + level.random.nextFloat() * 0.04F + 0.04F, + level.random.nextGaussian() * 0.03F, + 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 60, 0F, false, true); }), OFFERING_TABLE((message, level) -> { - var genX = message.data[0]; - var genY = message.data[1]; - var genZ = message.data[2]; + var genX = message.data.getFirst(); + var genY = message.data.get(1); + var genZ = message.data.get(2); for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - level.random.nextGaussian() * 0.02F, - level.random.nextFloat() * 0.25F, - level.random.nextGaussian() * 0.02F, - 0xffadfd, 1.5F, 40, 0F, false, true); + message.posX, message.posY + 0.5F, message.posZ, + level.random.nextGaussian() * 0.02F, + level.random.nextFloat() * 0.25F, + level.random.nextGaussian() * 0.02F, + 0xffadfd, 1.5F, 40, 0F, false, true); for (var i = level.random.nextInt(50) + 30; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - genX + 0.5F + level.random.nextGaussian() * 2.5F, - genY + 0.1F, - genZ + 0.5F + level.random.nextGaussian() * 2.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.01F, - level.random.nextGaussian() * 0.01F, - 0xd3e4ff, 1.5F, 150, 0F, false, true); + genX + 0.5F + level.random.nextGaussian() * 2.5F, + genY + 0.1F, + genZ + 0.5F + level.random.nextGaussian() * 2.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.01F, + level.random.nextGaussian() * 0.01F, + 0xd3e4ff, 1.5F, 150, 0F, false, true); }), PICKUP_STOPPER((message, level) -> NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.4F, message.posZ, - level.random.nextGaussian() * 0.005F, - level.random.nextFloat() * 0.005F, - level.random.nextGaussian() * 0.005F, - 0xcc3116, 1.5F, 40, 0F, false, true)), + message.posX, message.posY + 0.4F, message.posZ, + level.random.nextGaussian() * 0.005F, + level.random.nextFloat() * 0.005F, + level.random.nextGaussian() * 0.005F, + 0xcc3116, 1.5F, 40, 0F, false, true)), SPAWN_LAMP((message, level) -> { for (var i = level.random.nextInt(5) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.3F + level.random.nextFloat() * 0.4F, - message.posY + 0.15F + level.random.nextFloat() * 0.5F, - message.posZ + 0.3F + level.random.nextFloat() * 0.4F, - 0F, 0F, 0F, - 0xf4a142, 1F, 30, 0F, false, true); + message.posX + 0.3F + level.random.nextFloat() * 0.4F, + message.posY + 0.15F + level.random.nextFloat() * 0.5F, + message.posZ + 0.3F + level.random.nextFloat() * 0.4F, + 0F, 0F, 0F, + 0xf4a142, 1F, 30, 0F, false, true); }), ANIMAL_GEN_CREATE((message, level) -> { for (var i = level.random.nextInt(5) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - 0xd13308, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + 0xd13308, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); }), ANIMAL_GEN_CONSUME((message, level) -> { - var child = message.data[0] > 0; - var height = message.data[1] / 10F; - var genX = message.data[2]; - var genY = message.data[3]; - var genZ = message.data[4]; + var child = message.data.getFirst() > 0; + var height = message.data.get(1) / 10F; + var genX = message.data.get(2); + var genY = message.data.get(3); + var genZ = message.data.get(4); for (var i = child ? level.random.nextInt(10) + 10 : level.random.nextInt(20) + 20; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextGaussian() * 0.25F, - message.posY + height * 0.75F + level.random.nextGaussian() * 0.25F, - message.posZ + level.random.nextGaussian() * 0.25F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.01F, - level.random.nextGaussian() * 0.01F, - 0x42f4c8, level.random.nextFloat() * (child ? 0.5F : 2F) + 1F, level.random.nextInt(30) + 40, 0F, true, true); + message.posX + level.random.nextGaussian() * 0.25F, + message.posY + height * 0.75F + level.random.nextGaussian() * 0.25F, + message.posZ + level.random.nextGaussian() * 0.25F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.01F, + level.random.nextGaussian() * 0.01F, + 0x42f4c8, level.random.nextFloat() * (child ? 0.5F : 2F) + 1F, level.random.nextInt(30) + 40, 0F, true, true); NaturesAuraAPI.instance().spawnParticleStream( - message.posX, message.posY + height * 0.75F, message.posZ, - genX + 0.5F, genY + 0.5F, genZ + 0.5F, - 0.15F, 0x41c4f4, child ? 1.5F : 3F); + message.posX, message.posY + height * 0.75F, message.posZ, + genX + 0.5F, genY + 0.5F, genZ + 0.5F, + 0.15F, 0x41c4f4, child ? 1.5F : 3F); }), END_FLOWER_DECAY((message, level) -> { - var color = message.data[0]; + var color = message.data.getFirst(); for (var i = level.random.nextInt(10) + 20; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat(), - message.posY + level.random.nextFloat(), - message.posZ + level.random.nextFloat(), - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.01F, - level.random.nextGaussian() * 0.01F, - color, 1.5F, 80, 0F, true, true); + message.posX + level.random.nextFloat(), + message.posY + level.random.nextFloat(), + message.posZ + level.random.nextFloat(), + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.01F, + level.random.nextGaussian() * 0.01F, + color, 1.5F, 80, 0F, true, true); }), ANIMAL_SPAWNER((message, level) -> { for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - level.random.nextGaussian() * 0.02F, - level.random.nextFloat() * 0.02F, - level.random.nextGaussian() * 0.02F, - 0x16b7b2, 1.5F, 40, 0F, false, true); + message.posX, message.posY + 0.5F, message.posZ, + level.random.nextGaussian() * 0.02F, + level.random.nextFloat() * 0.02F, + level.random.nextGaussian() * 0.02F, + 0x16b7b2, 1.5F, 40, 0F, false, true); }), RF_CONVERTER((message, level) -> { for (var i = level.random.nextInt(5) + 2; i >= 0; i--) Multiblocks.RF_CONVERTER.forEach(BlockPos.containing(message.posX, message.posY, message.posZ), 'R', (blockPos, matcher) -> { if (level.random.nextFloat() < 0.35F) { NaturesAuraAPI.instance().spawnParticleStream( - blockPos.getX() + level.random.nextFloat(), - blockPos.getY() + level.random.nextFloat(), - blockPos.getZ() + level.random.nextFloat(), - message.posX + level.random.nextFloat(), - message.posY + level.random.nextFloat(), - message.posZ + level.random.nextFloat(), - 0.05F, 0xff1a05, 1.5F); + blockPos.getX() + level.random.nextFloat(), + blockPos.getY() + level.random.nextFloat(), + blockPos.getZ() + level.random.nextFloat(), + message.posX + level.random.nextFloat(), + message.posY + level.random.nextFloat(), + message.posZ + level.random.nextFloat(), + 0.05F, 0xff1a05, 1.5F); } return true; }); }), END_FLOWER_CONSUME((message, level) -> { - var color = message.data[0]; + var color = message.data.getFirst(); for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.01F, - level.random.nextGaussian() * 0.01F, - color, 1.5F, 40, 0F, false, true); + message.posX, message.posY + 0.5F, message.posZ, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.01F, + level.random.nextGaussian() * 0.01F, + color, 1.5F, 40, 0F, false, true); }), MOVER_CART((message, level) -> { - var motionX = message.data[0] / 100F; - var motionY = message.data[1] / 100F; - var motionZ = message.data[2] / 100F; + var motionX = message.data.getFirst() / 100F; + var motionY = message.data.get(1) / 100F; + var motionZ = message.data.get(2) / 100F; for (var i = level.random.nextInt(60) + 30; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextGaussian() * 10F, - message.posY + level.random.nextGaussian() * 10F, - message.posZ + level.random.nextGaussian() * 10F, - motionX * 0.2F, motionY * 0.2F, motionZ * 0.2F, - IAuraType.forLevel(level).getColor(), 2F, 30, 0F, false, true); + message.posX + level.random.nextGaussian() * 10F, + message.posY + level.random.nextGaussian() * 10F, + message.posZ + level.random.nextGaussian() * 10F, + motionX * 0.2F, motionY * 0.2F, motionZ * 0.2F, + IAuraType.forLevel(level).getColor(), 2F, 30, 0F, false, true); }), MOSS_GENERATOR((message, level) -> { for (var i = level.random.nextInt(30) + 30; i >= 0; i--) { @@ -371,100 +348,100 @@ public class PacketParticles implements CustomPacketPayload { var y = side != 1 ? level.random.nextFloat() : level.random.nextBoolean() ? 1.1F : -0.1F; var z = side != 2 ? level.random.nextFloat() : level.random.nextBoolean() ? 1.1F : -0.1F; NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + x, - message.posY + y, - message.posZ + z, - 0F, 0F, 0F, - 0x184c0d, level.random.nextFloat() + 1F, 30, 0F, true, true); + message.posX + x, + message.posY + y, + message.posZ + z, + 0F, 0F, 0F, + 0x184c0d, level.random.nextFloat() + 1F, 30, 0F, true, true); } for (var i = level.random.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat(), - message.posY + 1F, - message.posZ + level.random.nextFloat(), - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, true, true); + message.posX + level.random.nextFloat(), + message.posY + 1F, + message.posZ + level.random.nextFloat(), + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, true, true); }), FIREWORK_GEN((message, level) -> { - var goalX = message.data[0]; - var goalY = message.data[1]; - var goalZ = message.data[2]; + var goalX = message.data.getFirst(); + var goalY = message.data.get(1); + var goalZ = message.data.get(2); NaturesAuraAPI.instance().setParticleSpawnRange(64); for (var i = level.random.nextInt(30) + 30; i >= 0; i--) NaturesAuraAPI.instance().spawnParticleStream( - message.posX + (float) level.random.nextGaussian(), - message.posY + (float) level.random.nextGaussian(), - message.posZ + (float) level.random.nextGaussian(), - goalX + 0.25F + level.random.nextFloat() * 0.5F, - goalY + 0.25F + level.random.nextFloat() * 0.5F, - goalZ + 0.25F + level.random.nextFloat() * 0.5F, - 0.65F, message.data[3 + level.random.nextInt(message.data.length - 3)], 1F); + message.posX + (float) level.random.nextGaussian(), + message.posY + (float) level.random.nextGaussian(), + message.posZ + (float) level.random.nextGaussian(), + goalX + 0.25F + level.random.nextFloat() * 0.5F, + goalY + 0.25F + level.random.nextFloat() * 0.5F, + goalZ + 0.25F + level.random.nextFloat() * 0.5F, + 0.65F, message.data.get(3 + level.random.nextInt(message.data.size() - 3)), 1F); NaturesAuraAPI.instance().setParticleSpawnRange(32); }), DIMENSION_RAIL((message, level) -> { - var width = message.data[0] / 100F; - var height = message.data[1] / 100F; - var depth = message.data[2] / 100F; + var width = message.data.getFirst() / 100F; + var height = message.data.get(1) / 100F; + var depth = message.data.get(2) / 100F; for (var i = level.random.nextInt(100) + 50; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextFloat() * width, - message.posY + level.random.nextFloat() * height, - message.posZ + level.random.nextFloat() * depth, - 0F, 0F, 0F, 0xd60cff, 1F + level.random.nextFloat(), 60, 0F, false, true); + message.posX + level.random.nextFloat() * width, + message.posY + level.random.nextFloat() * height, + message.posZ + level.random.nextFloat() * depth, + 0F, 0F, 0F, 0xd60cff, 1F + level.random.nextFloat(), 60, 0F, false, true); }), PROJECTILE_GEN((message, level) -> { - var x = message.data[0]; - var y = message.data[1]; - var z = message.data[2]; + var x = message.data.getFirst(); + var y = message.data.get(1); + var z = message.data.get(2); for (var i = level.random.nextInt(10) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - x + 0.25F + level.random.nextFloat() * 0.5F, - y + 1.01F, - z + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); + x + 0.25F + level.random.nextFloat() * 0.5F, + y + 1.01F, + z + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + 0x5ccc30, 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); for (var i = level.random.nextInt(10) + 10; i >= 0; i--) level.addParticle(ParticleTypes.FIREWORK, - message.posX, message.posY, message.posZ, - level.random.nextGaussian() * 0.03F, - level.random.nextGaussian() * 0.03F, - level.random.nextGaussian() * 0.03F); + message.posX, message.posY, message.posZ, + level.random.nextGaussian() * 0.03F, + level.random.nextGaussian() * 0.03F, + level.random.nextGaussian() * 0.03F); }), BLAST_FURNACE_BOOSTER((message, level) -> { - var worked = message.data[0] > 0; + var worked = message.data.getFirst() > 0; for (var i = level.random.nextInt(10) + 5; i >= 0; i--) level.addParticle(ParticleTypes.CAMPFIRE_COSY_SMOKE, - message.posX + 5 / 16F + level.random.nextInt(6) / 16F, - message.posY + 0.6F, - message.posZ + 5 / 16F + level.random.nextInt(6) / 16F, - level.random.nextGaussian() * 0.005F, - level.random.nextFloat() * 0.02F + 0.01F, - level.random.nextGaussian() * 0.005F); + message.posX + 5 / 16F + level.random.nextInt(6) / 16F, + message.posY + 0.6F, + message.posZ + 5 / 16F + level.random.nextInt(6) / 16F, + level.random.nextGaussian() * 0.005F, + level.random.nextFloat() * 0.02F + 0.01F, + level.random.nextGaussian() * 0.005F); if (worked) { var pos = BlockPos.containing(message.posX, message.posY, message.posZ); var color = IAuraChunk.getAuraChunk(level, pos).getType().getColor(); for (var i = level.random.nextInt(10) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnParticleStream( - message.posX + (float) level.random.nextGaussian() * 5, - message.posY + level.random.nextFloat() * 5, - message.posZ + (float) level.random.nextGaussian() * 5, - message.posX + 0.5F, message.posY + 0.5F, message.posZ + 0.5F, - 0.25F, color, 0.5F + level.random.nextFloat() + message.posX + (float) level.random.nextGaussian() * 5, + message.posY + level.random.nextFloat() * 5, + message.posZ + (float) level.random.nextGaussian() * 5, + message.posX + 0.5F, message.posY + 0.5F, message.posZ + 0.5F, + 0.25F, color, 0.5F + level.random.nextFloat() ); } }), ANIMAL_CONTAINER((message, level) -> { for (var i = level.random.nextInt(2) + 1; i > 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + level.random.nextGaussian() * 0.15F, - message.posY - level.random.nextFloat() * 0.5F, - message.posZ + level.random.nextGaussian() * 0.15F, - 0, 0, 0, 0x42e9f5, 1 + level.random.nextFloat() * 2, 40, 0, false, true + message.posX + level.random.nextGaussian() * 0.15F, + message.posY - level.random.nextFloat() * 0.5F, + message.posZ + level.random.nextGaussian() * 0.15F, + 0, 0, 0, 0x42e9f5, 1 + level.random.nextFloat() * 2, 40, 0, false, true ); }), SNOW_CREATOR((message, level) -> { @@ -472,43 +449,43 @@ public class PacketParticles implements CustomPacketPayload { var color = IAuraChunk.getAuraChunk(level, pos).getType().getColor(); for (var i = level.random.nextInt(3) + 1; i > 0; i--) NaturesAuraAPI.instance().spawnParticleStream( - message.posX + (float) level.random.nextGaussian() * 5, - message.posY + level.random.nextFloat() * 5, - message.posZ + (float) level.random.nextGaussian() * 5, - message.posX + 0.5F, message.posY + 0.5F, message.posZ + 0.5F, - 0.25F, color, 0.5F + level.random.nextFloat() + message.posX + (float) level.random.nextGaussian() * 5, + message.posY + level.random.nextFloat() * 5, + message.posZ + (float) level.random.nextGaussian() * 5, + message.posX + 0.5F, message.posY + 0.5F, message.posZ + 0.5F, + 0.25F, color, 0.5F + level.random.nextFloat() ); }), CHORUS_GENERATOR((message, level) -> { - var chorusX = message.data[0]; - var chorusY = message.data[1]; - var chorusZ = message.data[2]; + var chorusX = message.data.getFirst(); + var chorusY = message.data.get(1); + var chorusZ = message.data.get(2); for (var i = level.random.nextInt(5) + 3; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - chorusX + level.random.nextFloat(), chorusY + level.random.nextFloat(), chorusZ + level.random.nextFloat(), - 0F, 0F, 0F, - 0xbb0be3, 1F + level.random.nextFloat(), 50, 0F, false, true); + chorusX + level.random.nextFloat(), chorusY + level.random.nextFloat(), chorusZ + level.random.nextFloat(), + 0F, 0F, 0F, + 0xbb0be3, 1F + level.random.nextFloat(), 50, 0F, false, true); for (var i = level.random.nextInt(5) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - IAuraType.forLevel(level).getColor(), 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + IAuraType.forLevel(level).getColor(), 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); }), TIMER_RESET((message, level) -> { - var color = message.data[0]; + var color = message.data.getFirst(); for (var i = level.random.nextInt(10) + 15; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 5 / 16F + level.random.nextFloat() * 6 / 16F, - message.posY + 2 / 16F + level.random.nextFloat() * 8 / 16F, - message.posZ + 5 / 16F + level.random.nextFloat() * 6 / 16F, - 0, 0, 0, color, 2, 40 + level.random.nextInt(20), 0, false, true); + message.posX + 5 / 16F + level.random.nextFloat() * 6 / 16F, + message.posY + 2 / 16F + level.random.nextFloat() * 8 / 16F, + message.posZ + 5 / 16F + level.random.nextFloat() * 6 / 16F, + 0, 0, 0, color, 2, 40 + level.random.nextInt(20), 0, false, true); }), STRUCTURE_FINDER((message, level) -> { - var entity = (EntityStructureFinder) level.getEntity(message.data[0]); + var entity = (EntityStructureFinder) level.getEntity(message.data.getFirst()); var renderer = Minecraft.getInstance().levelRenderer; var d0 = message.posX + 0.5D; @@ -526,45 +503,45 @@ public class PacketParticles implements CustomPacketPayload { SLIME_SPLIT_GEN_CREATE((message, level) -> { for (var i = level.random.nextInt(5) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + level.random.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + level.random.nextFloat() * 0.5F, - level.random.nextGaussian() * 0.01F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.01F, - message.data[0], 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); + message.posX + 0.25F + level.random.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + level.random.nextFloat() * 0.5F, + level.random.nextGaussian() * 0.01F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.01F, + message.data.getFirst(), 1F + level.random.nextFloat() * 1.5F, 40, 0F, false, true); }), SLIME_SPLIT_GEN_START((message, level) -> { - var x = message.data[0]; - var y = message.data[1]; - var z = message.data[2]; - var color = message.data[3]; + var x = message.data.getFirst(); + var y = message.data.get(1); + var z = message.data.get(2); + var color = message.data.get(3); for (var i = level.random.nextInt(10) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + (float) level.random.nextGaussian() * 0.5F, - message.posY + (float) level.random.nextGaussian() * 0.5F, - message.posZ + (float) level.random.nextGaussian() * 0.5F, - level.random.nextGaussian() * 0.02F, - level.random.nextFloat() * 0.04F + 0.02F, - level.random.nextGaussian() * 0.02F, - color, level.random.nextFloat() + 1, level.random.nextInt(20) + 20, 0, false, true); + message.posX + (float) level.random.nextGaussian() * 0.5F, + message.posY + (float) level.random.nextGaussian() * 0.5F, + message.posZ + (float) level.random.nextGaussian() * 0.5F, + level.random.nextGaussian() * 0.02F, + level.random.nextFloat() * 0.04F + 0.02F, + level.random.nextGaussian() * 0.02F, + color, level.random.nextFloat() + 1, level.random.nextInt(20) + 20, 0, false, true); for (var i = level.random.nextInt(10) + 5; i >= 0; i--) NaturesAuraAPI.instance().spawnParticleStream( - message.posX + (float) level.random.nextGaussian() * 0.5F, - message.posY + (float) level.random.nextGaussian() * 0.5F, - message.posZ + (float) level.random.nextGaussian() * 0.5F, - x + 0.5F, y + 0.5F, z + 0.5F, 0.2F, color, level.random.nextFloat() + 1); + message.posX + (float) level.random.nextGaussian() * 0.5F, + message.posY + (float) level.random.nextGaussian() * 0.5F, + message.posZ + (float) level.random.nextGaussian() * 0.5F, + x + 0.5F, y + 0.5F, z + 0.5F, 0.2F, color, level.random.nextFloat() + 1); }), PET_REVIVER((message, level) -> { for (var i = level.random.nextInt(50) + 150; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + (float) level.random.nextGaussian() * 0.4F, - message.posY + (float) level.random.nextGaussian() * 0.4F, - message.posZ + (float) level.random.nextGaussian() * 0.4F, - level.random.nextGaussian() * 0.002F, - level.random.nextFloat() * 0.001F + 0.002F, - level.random.nextGaussian() * 0.002F, - message.data[0], level.random.nextFloat() * 2 + 1, level.random.nextInt(50) + 50, 0, false, true); + message.posX + (float) level.random.nextGaussian() * 0.4F, + message.posY + (float) level.random.nextGaussian() * 0.4F, + message.posZ + (float) level.random.nextGaussian() * 0.4F, + level.random.nextGaussian() * 0.002F, + level.random.nextFloat() * 0.001F + 0.002F, + level.random.nextGaussian() * 0.002F, + message.data.getFirst(), level.random.nextFloat() * 2 + 1, level.random.nextInt(50) + 50, 0, false, true); }); public final BiConsumer action;