diff --git a/src/main/java/de/ellpeck/naturesaura/Helper.java b/src/main/java/de/ellpeck/naturesaura/Helper.java index 20e74004..fa77af6e 100644 --- a/src/main/java/de/ellpeck/naturesaura/Helper.java +++ b/src/main/java/de/ellpeck/naturesaura/Helper.java @@ -88,7 +88,7 @@ public final class Helper { List frames = world.getEntitiesWithinAABB(ItemFrameEntity.class, new AxisAlignedBB(pos).grow(0.25)); for (int i = frames.size() - 1; i >= 0; i--) { ItemFrameEntity frame = frames.get(i); - BlockPos framePos = frame.getHangingPosition().offset(frame.getHorizontalFacing()); + BlockPos framePos = frame.getHangingPosition().offset(frame.getHorizontalFacing().getOpposite()); if (!pos.equals(framePos)) frames.remove(i); } diff --git a/src/main/java/de/ellpeck/naturesaura/ModConfig.java b/src/main/java/de/ellpeck/naturesaura/ModConfig.java index edb8d12a..71ba4368 100644 --- a/src/main/java/de/ellpeck/naturesaura/ModConfig.java +++ b/src/main/java/de/ellpeck/naturesaura/ModConfig.java @@ -84,7 +84,7 @@ public final class ModConfig { //@Comment("If debug information about Aura around the player should be displayed in the F3 debug menu if the player is in creative mode") public boolean debugText = true; //@Comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the world for debug purposes") - public boolean debugWorld = false; + public boolean debugWorld = true; } public static void initOrReload(boolean reload) { diff --git a/src/main/java/de/ellpeck/naturesaura/api/multiblock/Matcher.java b/src/main/java/de/ellpeck/naturesaura/api/multiblock/Matcher.java index 136538db..eef65f25 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/multiblock/Matcher.java +++ b/src/main/java/de/ellpeck/naturesaura/api/multiblock/Matcher.java @@ -3,6 +3,7 @@ package de.ellpeck.naturesaura.api.multiblock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.tags.Tag; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; @@ -28,31 +29,8 @@ public class Matcher { return new Matcher(Blocks.AIR.getDefaultState(), null); } - public static Matcher oreDict(Block defaultBlock, String name) { - return new Matcher(defaultBlock.getDefaultState(), - (world, start, offset, pos, state, otherC) -> state.getBlock() == defaultBlock); - /* TODO return new Matcher(defaultBlock.getDefaultState(), new ICheck() { - private List states; - - @Override - public boolean matches(World world, BlockPos start, BlockPos offset, BlockPos pos, BlockState state, char c) { - if (this.states == null) { - this.states = new ArrayList<>(); - for (ItemStack stack : OreDictionary.getOres(name)) { - Block block = Block.getBlockFromItem(stack.getItem()); - if (block != null && block != Blocks.AIR) { - int damage = stack.getItemDamage(); - if (damage == OreDictionary.WILDCARD_VALUE) - this.states.addAll(block.getBlockState().getValidStates()); - else - this.states.add(block.getStateFromMeta(damage)); - } - } - } - - return this.states.isEmpty() || this.states.contains(state); - } - });*/ + public static Matcher tag(Block defaultBlock, Tag tag) { + return new Matcher(defaultBlock.getDefaultState(), (world, start, offset, pos, state, c) -> state.getBlock().getTags().contains(tag.getId())); } public interface ICheck { diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java index 54b81854..6d1c9d8e 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockDimensionRail.java @@ -2,6 +2,9 @@ package de.ellpeck.naturesaura.blocks; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.items.ModItems; +import de.ellpeck.naturesaura.packet.PacketClient; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import de.ellpeck.naturesaura.reg.IModItem; import de.ellpeck.naturesaura.reg.IModelProvider; import de.ellpeck.naturesaura.reg.ModRegistry; @@ -60,7 +63,7 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I if (stack.getItem() == ModItems.RANGE_VISUALIZER) { if (!worldIn.isRemote) { BlockPos goalPos = this.getGoalCoords(worldIn, pos); - // TODO PacketHandler.sendTo(player, new PacketClient(0, this.goalDim, goalPos.getX(), goalPos.getY(), goalPos.getZ())); + PacketHandler.sendTo(player, new PacketClient(0, this.goalDim, goalPos.getX(), goalPos.getY(), goalPos.getZ())); } return true; } @@ -77,7 +80,7 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I return; AxisAlignedBB box = cart.getCollisionBoundingBox(); - // TODO PacketHandler.sendToAllAround(world, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, 25, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F))); + PacketHandler.sendToAllAround(world, pos, 32, new PacketParticles((float) box.minX, (float) box.minY, (float) box.minZ, 25, (int) ((box.maxX - box.minX) * 100F), (int) ((box.maxY - box.minY) * 100F), (int) ((box.maxZ - box.minZ) * 100F))); world.playSound(null, pos, SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.BLOCKS, 1F, 1F); BlockPos goalCoords = this.getGoalCoords(world, pos); @@ -118,7 +121,6 @@ public class BlockDimensionRail extends AbstractRailBlock implements IModItem, I return SHAPE; } - public boolean isFlexibleRail(BlockState state, IBlockReader world, BlockPos pos) { return false; } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldenLeaves.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldenLeaves.java index 2cb063e6..9471eb67 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldenLeaves.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockGoldenLeaves.java @@ -98,10 +98,9 @@ public class BlockGoldenLeaves extends LeavesBlock implements } */ - @Override - public void tick(BlockState state, World worldIn, BlockPos pos, Random random) { - super.tick(state, worldIn, pos, random); + public void randomTick(BlockState state, World worldIn, BlockPos pos, Random random) { + super.randomTick(state, worldIn, pos, random); if (!worldIn.isRemote) { int stage = state.get(STAGE); if (stage < HIGHEST_STAGE) { @@ -118,8 +117,7 @@ public class BlockGoldenLeaves extends LeavesBlock implements public static boolean convert(World world, BlockPos pos) { BlockState state = world.getBlockState(pos); - if (state.getBlock().isFoliage(state, world, pos) && - !(state.getBlock() instanceof BlockAncientLeaves || state.getBlock() instanceof BlockGoldenLeaves)) { + if ((state.getBlock().isFoliage(state, world, pos) || state.getBlock() instanceof LeavesBlock) && !(state.getBlock() instanceof BlockAncientLeaves || state.getBlock() instanceof BlockGoldenLeaves)) { if (!world.isRemote) { world.setBlockState(pos, ModBlocks.GOLDEN_LEAVES.getDefaultState() .with(DISTANCE, state.has(DISTANCE) ? state.get(DISTANCE) : 1) diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java index 3042cb8e..287d4220 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockPickupStopper.java @@ -3,6 +3,8 @@ package de.ellpeck.naturesaura.blocks; import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.api.render.IVisualizable; import de.ellpeck.naturesaura.blocks.tiles.TileEntityPickupStopper; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.item.ItemEntity; @@ -43,9 +45,9 @@ public class BlockPickupStopper extends BlockContainerImpl implements IVisualiza event.setCanceled(true); - /* if (item.world.getGameTime() % 3 == 0) TODO particles + if (item.world.getGameTime() % 3 == 0) PacketHandler.sendToAllAround(item.world, pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 14));*/ + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 14)); return true; }); } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java index f893e8b3..d3514467 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockProjectileGenerator.java @@ -2,8 +2,9 @@ package de.ellpeck.naturesaura.blocks; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; -import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities; import de.ellpeck.naturesaura.blocks.tiles.TileEntityProjectileGenerator; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; @@ -13,6 +14,7 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.ProjectileImpactEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -30,15 +32,18 @@ public class BlockProjectileGenerator extends BlockContainerImpl/* implements IT Entity entity = event.getEntity(); if (entity.world.isRemote) return; - BlockRayTraceResult ray = (BlockRayTraceResult) event.getRayTraceResult(); - BlockPos pos = ray.getPos(); + RayTraceResult ray = event.getRayTraceResult(); + if (!(ray instanceof BlockRayTraceResult)) + return; + BlockRayTraceResult blockRay = (BlockRayTraceResult) ray; + BlockPos pos = blockRay.getPos(); if (pos == null) return; TileEntity tile = entity.world.getTileEntity(pos); if (!(tile instanceof TileEntityProjectileGenerator)) return; TileEntityProjectileGenerator generator = (TileEntityProjectileGenerator) tile; - if (generator.nextSide != ray.getFace()) + if (generator.nextSide != blockRay.getFace()) return; ResourceLocation name = ForgeRegistries.ENTITIES.getKey(entity.getType()); Integer amount = NaturesAuraAPI.PROJECTILE_GENERATIONS.get(name); @@ -48,9 +53,8 @@ public class BlockProjectileGenerator extends BlockContainerImpl/* implements IT BlockPos spot = IAuraChunk.getLowestSpot(entity.world, pos, 35, pos); IAuraChunk.getAuraChunk(entity.world, spot).storeAura(spot, amount); - // TODO particles - /* PacketHandler.sendToAllAround(entity.world, pos, 32, - new PacketParticles((float) entity.posX, (float) entity.posY, (float) entity.posZ, 26, pos.getX(), pos.getY(), pos.getZ()));*/ + PacketHandler.sendToAllAround(entity.world, pos, 32, + new PacketParticles((float) entity.posX, (float) entity.posY, (float) entity.posZ, 26, pos.getX(), pos.getY(), pos.getZ())); entity.world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.ENTITY_ENDER_EYE_LAUNCH, SoundCategory.BLOCKS, 0.8F, 1F); generator.nextSide = generator.nextSide.rotateY(); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/BlockSpawnLamp.java b/src/main/java/de/ellpeck/naturesaura/blocks/BlockSpawnLamp.java index a3c00ed4..57b2e0ec 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/BlockSpawnLamp.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/BlockSpawnLamp.java @@ -5,6 +5,8 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.render.IVisualizable; import de.ellpeck.naturesaura.blocks.tiles.ModTileEntities; import de.ellpeck.naturesaura.blocks.tiles.TileEntitySpawnLamp; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.entity.MobEntity; @@ -55,9 +57,8 @@ public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizable BlockPos spot = IAuraChunk.getHighestSpot(world, lampPos, 32, lampPos); IAuraChunk.getAuraChunk(world, spot).drainAura(spot, 200); - // TODO particles - /*PacketHandler.sendToAllAround(world, lampPos, 32, - new PacketParticles(lampPos.getX(), lampPos.getY(), lampPos.getZ(), 15));*/ + PacketHandler.sendToAllAround(world, lampPos, 32, + new PacketParticles(lampPos.getX(), lampPos.getY(), lampPos.getZ(), 15)); } event.setResult(Event.Result.DENY); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/multi/Multiblocks.java b/src/main/java/de/ellpeck/naturesaura/blocks/multi/Multiblocks.java index 5afbaa2c..75897fca 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/multi/Multiblocks.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/multi/Multiblocks.java @@ -10,6 +10,7 @@ import net.minecraft.block.Blocks; import net.minecraft.block.LogBlock; import net.minecraft.block.SaplingBlock; import net.minecraft.item.ItemStack; +import net.minecraft.tags.BlockTags; import net.minecraft.util.ResourceLocation; public final class Multiblocks { @@ -23,7 +24,7 @@ public final class Multiblocks { {" ", " WBW ", " WBW ", " WWCWCWW ", " BBW WBB ", " WWCWCWW ", " WBW ", " WBW ", " "}}, 'C', Blocks.CHISELED_STONE_BRICKS, 'B', Blocks.STONE_BRICKS, - 'W', Blocks.OAK_PLANKS, // TODO create a matcher that matches by tag for planks + 'W', Matcher.tag(Blocks.OAK_PLANKS, BlockTags.PLANKS), 'M', ModBlocks.GOLD_BRICK, '0', ModBlocks.NATURE_ALTAR, ' ', Matcher.wildcard()); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalGenerator.java index df615393..62216a23 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalGenerator.java @@ -1,6 +1,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.math.BlockPos; @@ -28,8 +30,8 @@ public class TileEntityAnimalGenerator extends TileEntityImpl implements ITickab remain -= IAuraChunk.getAuraChunk(this.world, spot).storeAura(spot, remain); } - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, TODO particles - new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 16));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 16)); } this.timeRemaining -= 10; diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalSpawner.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalSpawner.java index c5cb16c4..94113172 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalSpawner.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAnimalSpawner.java @@ -6,6 +6,8 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.recipes.AnimalSpawnerRecipe; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -87,9 +89,8 @@ public class TileEntityAnimalSpawner extends TileEntityImpl implements ITickable for (ItemEntity item : items) { item.remove(); - // TODO particles - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 19));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 19)); } this.currentRecipe = recipe; diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java index 77f49c4f..94b4a3cc 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityAutoCrafter.java @@ -2,6 +2,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.blocks.BlockAutoCrafter; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -107,9 +109,8 @@ public class TileEntityAutoCrafter extends TileEntityImpl implements ITickableTi this.world.addEntity(remItem); } - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 19));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 19)); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEndFlower.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEndFlower.java index 89f52a0e..674eaba2 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEndFlower.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityEndFlower.java @@ -4,6 +4,8 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.container.BasicAuraContainer; import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -70,9 +72,8 @@ public class TileEntityEndFlower extends TileEntityImpl implements ITickableTile this.isDrainMode = true; item.remove(); - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 21, this.container.getAuraColor()));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 21, this.container.getAuraColor())); break; } } else { diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFieldCreator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFieldCreator.java index 9fe47e28..e2b4e6a5 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFieldCreator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFieldCreator.java @@ -3,6 +3,9 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemFrameEntity; @@ -154,8 +157,7 @@ public class TileEntityFieldCreator extends TileEntityImpl implements ITickableT private void sendParticles() { for (int j = 0; j < 2; j++) { BlockPos p = j == 0 ? this.pos : this.getConnectedPos(); - // TODO particles - /* PacketHandler.sendToAllAround(this.world, p, 32, new PacketParticleStream( + PacketHandler.sendToAllAround(this.world, p, 32, new PacketParticleStream( p.getX() + (float) this.world.rand.nextGaussian() * 3F, p.getY() + 1 + this.world.rand.nextFloat() * 3F, p.getZ() + (float) this.world.rand.nextGaussian() * 3F, @@ -163,7 +165,7 @@ public class TileEntityFieldCreator extends TileEntityImpl implements ITickableT p.getY() + 0.5F, p.getZ() + 0.5F, this.world.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forWorld(this.world).getColor(), this.world.rand.nextFloat() + 0.5F - ));*/ + )); } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFireworkGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFireworkGenerator.java index bd851e90..172e2b58 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFireworkGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFireworkGenerator.java @@ -1,6 +1,9 @@ package de.ellpeck.naturesaura.blocks.tiles; +import com.google.common.primitives.Ints; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.entity.item.FireworkRocketEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -105,10 +108,9 @@ public class TileEntityFireworkGenerator extends TileEntityImpl implements ITick data.add(this.pos.getY()); data.add(this.pos.getZ()); data.addAll(usedColors); - // TODO particles - /* PacketHandler.sendToAllLoaded(this.world, this.pos, new PacketParticles( + PacketHandler.sendToAllLoaded(this.world, this.pos, new PacketParticles( (float) this.trackedEntity.posX, (float) this.trackedEntity.posY, (float) this.trackedEntity.posZ, - 24, Ints.toArray(data)));*/ + 24, Ints.toArray(data))); } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFlowerGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFlowerGenerator.java index 5fd7a5fd..f8dcc1e6 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFlowerGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFlowerGenerator.java @@ -4,13 +4,15 @@ import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.ITickableTileEntity; -import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraftforge.registries.ForgeRegistries; @@ -77,10 +79,9 @@ public class TileEntityFlowerGenerator extends TileEntityImpl implements ITickab this.world.removeBlock(pos, false); - // TODO particles int color = Helper.blendColors(0x5ccc30, 0xe53c16, toAdd / (float) addAmount); if (toAdd > 0) { - /*for (int i = this.world.rand.nextInt(5) + 5; i >= 0; i--) + for (int i = this.world.rand.nextInt(5) + 5; i >= 0; i--) PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( pos.getX() + 0.25F + this.world.rand.nextFloat() * 0.5F, pos.getY() + 0.25F + this.world.rand.nextFloat() * 0.5F, @@ -90,9 +91,9 @@ public class TileEntityFlowerGenerator extends TileEntityImpl implements ITickab this.pos.getZ() + 0.25F + this.world.rand.nextFloat() * 0.5F, this.world.rand.nextFloat() * 0.02F + 0.1F, color, 1F )); - PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 8));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 8)); } - //PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), 7, color)); + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), 7, color)); } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java index 13daa0db..76893f4a 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityFurnaceHeater.java @@ -1,7 +1,10 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.blocks.BlockFurnaceHeater; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.FurnaceTileEntity; @@ -44,8 +47,7 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable did = true; if (this.world.getGameTime() % 15 == 0) { - // TODO particles - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( this.pos.getX() + (float) this.world.rand.nextGaussian() * 5F, this.pos.getY() + 1 + this.world.rand.nextFloat() * 5F, this.pos.getZ() + (float) this.world.rand.nextGaussian() * 5F, @@ -53,7 +55,7 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable tilePos.getY() + this.world.rand.nextFloat(), tilePos.getZ() + this.world.rand.nextFloat(), this.world.rand.nextFloat() * 0.07F + 0.07F, IAuraType.forWorld(this.world).getColor(), this.world.rand.nextFloat() + 0.5F - ));*/ + )); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityHopperUpgrade.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityHopperUpgrade.java index ba0aea5d..80bf9759 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityHopperUpgrade.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityHopperUpgrade.java @@ -1,6 +1,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.HopperBlock; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -60,9 +62,8 @@ public class TileEntityHopperUpgrade extends TileEntityImpl implements ITickable BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 25, this.pos); IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, 500); - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 10));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 10)); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityImpl.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityImpl.java index 4218dcc9..b39b3e5a 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityImpl.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityImpl.java @@ -6,6 +6,7 @@ import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.blocks.ModBlocks; import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; +import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.NetworkManager; @@ -13,8 +14,8 @@ import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; @@ -22,6 +23,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nullable; +import java.util.stream.Stream; public class TileEntityImpl extends TileEntity { @@ -31,12 +33,6 @@ public class TileEntityImpl extends TileEntity { super(tileEntityTypeIn); } - // TODO figure out if this was still needed -/* @Override - public boolean shouldRefresh(World world, BlockPos pos, BlockState oldState, BlockState newState) { - return oldState.getBlock() != newState.getBlock(); - }*/ - @Override public CompoundNBT write(CompoundNBT compound) { this.writeNBT(compound, SaveType.TILE); @@ -92,11 +88,10 @@ public class TileEntityImpl extends TileEntity { } public void sendToClients() { - // TODO send this shit to the client somehow - /* ServerWorld world = (ServerWorld) this.getWorld(); - Stream entities = world.getChunkProvider().chunkManager.getTrackingPlayers(new ChunkPos(this.getPos().getX() >> 4, this.getPos().getZ() >> 4), false); + ServerWorld world = (ServerWorld) this.getWorld(); + Stream entities = world.getChunkProvider().chunkManager.getTrackingPlayers(new ChunkPos(this.getPos()), false); SUpdateTileEntityPacket packet = this.getUpdatePacket(); - entities.forEach(()-> packet.packet);*/ + entities.forEach(e -> e.connection.sendPacket(packet)); } public IItemHandlerModifiable getItemHandler(Direction facing) { diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityMossGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityMossGenerator.java index 02bd102e..d799694e 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityMossGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityMossGenerator.java @@ -2,6 +2,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.tileentity.ITickableTileEntity; @@ -46,9 +48,8 @@ public class TileEntityMossGenerator extends TileEntityImpl implements ITickable toAdd -= IAuraChunk.getAuraChunk(this.world, spot).storeAura(spot, toAdd); } - // TODO particles - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles(offset.getX(), offset.getY(), offset.getZ(), 23));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles(offset.getX(), offset.getY(), offset.getZ(), 23)); } this.world.playEvent(2001, offset, Block.getStateId(state)); diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityNatureAltar.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityNatureAltar.java index 74e69a0c..b6b6331c 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityNatureAltar.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityNatureAltar.java @@ -7,6 +7,9 @@ import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.api.aura.type.IAuraType; import de.ellpeck.naturesaura.api.recipes.AltarRecipe; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.Ingredient; @@ -100,15 +103,14 @@ public class TileEntityNatureAltar extends TileEntityImpl implements ITickableTi chunk.drainAura(spot, toStore); this.container.storeAura(toStore, false); - // TODO particles - /*if (this.world.getGameTime() % 3 == 0) + if (this.world.getGameTime() % 3 == 0) PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( this.pos.getX() + (float) rand.nextGaussian() * 10F, this.pos.getY() + rand.nextFloat() * 10F, this.pos.getZ() + (float) rand.nextGaussian() * 10F, this.pos.getX() + 0.5F, this.pos.getY() + 0.5F, this.pos.getZ() + 0.5F, rand.nextFloat() * 0.1F + 0.1F, 0x89cc37, rand.nextFloat() * 1F + 1F - ));*/ + )); } } @@ -121,10 +123,8 @@ public class TileEntityNatureAltar extends TileEntityImpl implements ITickableTi if (stored > 0) { this.container.drainAura(stored, false); - // TODO particles - /*if (this.world.getGameTime() % 4 == 0) + if (this.world.getGameTime() % 4 == 0) PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 4)); - */ } } } else { @@ -141,10 +141,8 @@ public class TileEntityNatureAltar extends TileEntityImpl implements ITickableTi if (this.container.getStoredAura() >= req) { this.container.drainAura(req, false); - // TODO particles - /*if (this.timer % 4 == 0) + if (this.timer % 4 == 0) PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 4)); - */ this.timer++; if (this.timer >= this.currentRecipe.time) { diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOakGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOakGenerator.java index 60f38a2f..53781564 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOakGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOakGenerator.java @@ -1,6 +1,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.LogBlock; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntityType; @@ -31,10 +33,9 @@ public class TileEntityOakGenerator extends TileEntityImpl implements ITickableT toAdd -= IAuraChunk.getAuraChunk(this.world, spot).storeAura(spot, toAdd); } - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( this.pos.getX(), this.pos.getY(), this.pos.getZ(), 12, - pos.getX(), pos.getY(), pos.getZ(), canGen ? 1 : 0));*/ + pos.getX(), pos.getY(), pos.getZ(), canGen ? 1 : 0)); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOfferingTable.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOfferingTable.java index 48545174..555266d5 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOfferingTable.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityOfferingTable.java @@ -4,6 +4,8 @@ import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.recipes.OfferingRecipe; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -74,10 +76,9 @@ public class TileEntityOfferingTable extends TileEntityImpl implements ITickable // TODO weather effects //this.world.addWeatherEffect(new LightningBoltEntity(this.world, this.pos.getX(), this.pos.getY(), this.pos.getZ(), true)); - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( (float) item.posX, (float) item.posY, (float) item.posZ, 13, - this.pos.getX(), this.pos.getY(), this.pos.getZ()));*/ + this.pos.getX(), this.pos.getY(), this.pos.getZ())); break; } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPlacer.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPlacer.java index 6aa8b126..ddcdd3ba 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPlacer.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPlacer.java @@ -3,6 +3,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.Helper; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.items.ModItems; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemFrameEntity; @@ -74,8 +76,7 @@ public class TileEntityPlacer extends TileEntityImpl implements ITickableTileEnt BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 10, this.pos); IAuraChunk.getAuraChunk(this.world, spot).drainAura(spot, 1000); - // TODO particles - // PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), 9)); + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(pos.getX(), pos.getY(), pos.getZ(), 9)); return; } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPotionGenerator.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPotionGenerator.java index 4f88d872..39b9d546 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPotionGenerator.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityPotionGenerator.java @@ -2,10 +2,13 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.entity.AreaEffectCloudEntity; import net.minecraft.potion.Effect; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionUtils; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -49,10 +52,9 @@ public class TileEntityPotionGenerator extends TileEntityImpl implements ITickab toAdd -= IAuraChunk.getAuraChunk(this.world, spot).storeAura(spot, toAdd); } - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles( this.pos.getX(), this.pos.getY(), this.pos.getZ(), 5, - PotionUtils.getPotionColor(type), canGen ? 1 : 0));*/ + PotionUtils.getPotionColor(type), canGen ? 1 : 0)); addedOne = true; break; diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityRFConverter.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityRFConverter.java index 915d23d5..08da30a9 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityRFConverter.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityRFConverter.java @@ -3,6 +3,8 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; @@ -82,9 +84,8 @@ public class TileEntityRFConverter extends TileEntityImpl implements ITickableTi BlockPos pos = IAuraChunk.getHighestSpot(this.world, this.pos, 45, this.pos); IAuraChunk.getAuraChunk(this.world, pos).drainAura(pos, amountToUse); - // TODO particles - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 20));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles(this.pos.getX(), this.pos.getY(), this.pos.getZ(), 20)); } } diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityTimeChanger.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityTimeChanger.java index 430b0ca3..7c0f312b 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityTimeChanger.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityTimeChanger.java @@ -40,7 +40,7 @@ public class TileEntityTimeChanger extends TileEntityImpl implements ITickableTi continue; if (this.goalTime > 0) { - long current = this.world.getGameTime(); + long current = this.world.getDayTime(); long toAdd = Math.min(75, this.goalTime - current); if (toAdd <= 0) { this.goalTime = 0; @@ -93,7 +93,7 @@ public class TileEntityTimeChanger extends TileEntityImpl implements ITickableTi this.sendToClients(); } } else if (this.goalTime > 0 && this.world.rand.nextFloat() >= 0.25F) { - double angle = Math.toRadians(this.world.getGameTime() * 5F % 360); + double angle = Math.toRadians(this.world.getDayTime() * 5F % 360); double x = this.pos.getX() + 0.5 + Math.sin(angle) * 3F; double z = this.pos.getZ() + 0.5 + Math.cos(angle) * 3F; int color = this.goalTime % 24000 > 12000 ? 0xe2e2e2 : 0xffe926; diff --git a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityWoodStand.java b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityWoodStand.java index b5684a24..245a6a47 100644 --- a/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityWoodStand.java +++ b/src/main/java/de/ellpeck/naturesaura/blocks/tiles/TileEntityWoodStand.java @@ -3,6 +3,9 @@ package de.ellpeck.naturesaura.blocks.tiles; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.recipes.TreeRitualRecipe; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticleStream; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.LeavesBlock; @@ -61,20 +64,19 @@ public class TileEntityWoodStand extends TileEntityImpl implements ITickableTile Multiblocks.TREE_RITUAL.forEach(this.ritualPos, 'W', (pos, matcher) -> { TileEntity tile = this.world.getTileEntity(pos); if (tile instanceof TileEntityWoodStand && !((TileEntityWoodStand) tile).items.getStackInSlot(0).isEmpty()) { - // TODO particles - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticleStream( (float) pos.getX() + 0.2F + this.world.rand.nextFloat() * 0.6F, (float) pos.getY() + 0.85F, (float) pos.getZ() + 0.2F + this.world.rand.nextFloat() * 0.6F, this.ritualPos.getX() + 0.5F, this.ritualPos.getY() + this.world.rand.nextFloat() * 3F + 2F, this.ritualPos.getZ() + 0.5F, this.world.rand.nextFloat() * 0.04F + 0.04F, 0x89cc37, this.world.rand.nextFloat() * 1F + 1F - ));*/ + )); } return true; }); - /* PacketHandler.sendToAllAround(this.world, this.ritualPos, 32, - new PacketParticles(this.ritualPos.getX(), this.ritualPos.getY(), this.ritualPos.getZ(), 0));*/ + PacketHandler.sendToAllAround(this.world, this.ritualPos, 32, + new PacketParticles(this.ritualPos.getX(), this.ritualPos.getY(), this.ritualPos.getZ(), 0)); if (this.timer >= this.recipe.time) { this.recurseTreeDestruction(this.ritualPos, this.ritualPos); @@ -88,8 +90,8 @@ public class TileEntityWoodStand extends TileEntityImpl implements ITickableTile this.recipe.result.copy()); this.world.addEntity(item); - /*PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 3));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 3)); this.world.playSound(null, this.pos.getX() + 0.5, this.pos.getY() + 0.5, this.pos.getZ() + 0.5, SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.BLOCKS, 0.65F, 1F); @@ -102,8 +104,8 @@ public class TileEntityWoodStand extends TileEntityImpl implements ITickableTile if (tile instanceof TileEntityWoodStand) { TileEntityWoodStand stand = (TileEntityWoodStand) tile; if (!stand.items.getStackInSlot(0).isEmpty()) { - /* PacketHandler.sendToAllAround(this.world, this.pos, 32, - new PacketParticles(stand.pos.getX(), stand.pos.getY(), stand.pos.getZ(), 1));*/ + PacketHandler.sendToAllAround(this.world, this.pos, 32, + new PacketParticles(stand.pos.getX(), stand.pos.getY(), stand.pos.getZ(), 1)); this.world.playSound(null, stand.pos.getX() + 0.5, stand.pos.getY() + 0.5, stand.pos.getZ() + 0.5, SoundEvents.BLOCK_WOOD_STEP, SoundCategory.BLOCKS, 0.5F, 1F); @@ -139,7 +141,7 @@ public class TileEntityWoodStand extends TileEntityImpl implements ITickableTile BlockState state = this.world.getBlockState(offset); if (state.getBlock() instanceof LogBlock || state.getBlock() instanceof LeavesBlock) { this.world.setBlockState(offset, Blocks.AIR.getDefaultState()); - //PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(offset.getX(), offset.getY(), offset.getZ(), 2)); + PacketHandler.sendToAllAround(this.world, this.pos, 32, new PacketParticles(offset.getX(), offset.getY(), offset.getZ(), 2)); this.recurseTreeDestruction(offset, start); } diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java index 57510074..6c7248c7 100644 --- a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java @@ -4,6 +4,8 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.packet.PacketAuraChunk; +import de.ellpeck.naturesaura.packet.PacketHandler; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; @@ -12,6 +14,7 @@ import net.minecraft.nbt.ListNBT; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Tuple; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; import org.apache.commons.lang3.mutable.MutableInt; @@ -113,8 +116,9 @@ public class AuraChunk implements IAuraChunk { private void addDrainSpot(BlockPos pos, MutableInt spot) { int expX = pos.getX() >> 4; int expZ = pos.getZ() >> 4; - if (expX != this.chunk.getPos().x || expZ != this.chunk.getPos().z) - throw new IllegalArgumentException("Tried to add drain spot " + pos + " to chunk at " + this.chunk.getPos().x + ", " + this.chunk.getPos().z + " when it should've been added to chunk at " + expX + ", " + expZ); + ChunkPos myPos = this.chunk.getPos(); + if (expX != myPos.x || expZ != myPos.z) + throw new IllegalArgumentException("Tried to add drain spot " + pos + " to chunk at " + myPos.x + ", " + myPos.z + " when it should've been added to chunk at " + expX + ", " + expZ); this.drainSpots.put(pos, spot); } @@ -147,19 +151,18 @@ public class AuraChunk implements IAuraChunk { } if (this.needsSync) { - // TODO packets - /*PacketHandler.sendToAllLoaded(world, - new BlockPos(this.chunk.x * 16, 0, this.chunk.z * 16), - this.makePacket());*/ + ChunkPos pos = this.chunk.getPos(); + PacketHandler.sendToAllLoaded(world, + new BlockPos(pos.x * 16, 0, pos.z * 16), + this.makePacket()); this.needsSync = false; } } -/* - public IMessage makePacket() { - return new PacketAuraChunk(this.chunk.x, this.chunk.z, this.drainSpots); + public PacketAuraChunk makePacket() { + ChunkPos pos = this.chunk.getPos(); + return new PacketAuraChunk(pos.x, pos.z, this.drainSpots); } -*/ public void getSpotsInArea(BlockPos pos, int radius, BiConsumer consumer) { for (Map.Entry entry : this.drainSpots.entrySet()) { diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java index 9f21da44..b501862b 100644 --- a/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java @@ -6,6 +6,8 @@ import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -75,9 +77,8 @@ public class PlantBoostEffect implements IDrainSpotEffect { BlockPos closestSpot = IAuraChunk.getHighestSpot(world, plantPos, 25, pos); IAuraChunk.getAuraChunk(world, closestSpot).drainAura(closestSpot, 3500); - // TODO particles - /* PacketHandler.sendToAllAround(world, plantPos, 32, - new PacketParticles(plantPos.getX(), plantPos.getY(), plantPos.getZ(), 6));*/ + PacketHandler.sendToAllAround(world, plantPos, 32, + new PacketParticles(plantPos.getX(), plantPos.getY(), plantPos.getZ(), 6)); } } } diff --git a/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java b/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java index 6283e9fe..adaf2c92 100644 --- a/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java +++ b/src/main/java/de/ellpeck/naturesaura/entities/EntityMoverMinecart.java @@ -2,6 +2,8 @@ package de.ellpeck.naturesaura.entities; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.items.ModItems; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; @@ -48,13 +50,12 @@ public class EntityMoverMinecart extends AbstractMinecartEntity { BlockPos pos = this.getPosition(); if (!this.spotOffsets.isEmpty() && this.world.getGameTime() % 10 == 0) - // TODO particles - /*PacketHandler.sendToAllAround(this.world, pos, 32, new PacketParticles( + PacketHandler.sendToAllAround(this.world, pos, 32, new PacketParticles( (float) this.posX, (float) this.posY, (float) this.posZ, 22, - MathHelper.floor(this.motionX * 100F), MathHelper.floor(this.motionY * 100F), MathHelper.floor(this.motionZ * 100F)));*/ + MathHelper.floor(this.getMotion().getX() * 100F), MathHelper.floor(this.getMotion().getY() * 100F), MathHelper.floor(this.getMotion().getZ() * 100F))); - if (pos.distanceSq(this.lastPosition) < 8 * 8) - return; + if (pos.distanceSq(this.lastPosition) < 8 * 8) + return; this.moveAura(this.world, this.lastPosition, this.world, pos); this.lastPosition = pos; diff --git a/src/main/java/de/ellpeck/naturesaura/events/ClientEvents.java b/src/main/java/de/ellpeck/naturesaura/events/ClientEvents.java index 52ff3d72..4c79496a 100644 --- a/src/main/java/de/ellpeck/naturesaura/events/ClientEvents.java +++ b/src/main/java/de/ellpeck/naturesaura/events/ClientEvents.java @@ -16,6 +16,7 @@ import de.ellpeck.naturesaura.compat.Compat; import de.ellpeck.naturesaura.items.AuraCache; import de.ellpeck.naturesaura.items.ModItems; import de.ellpeck.naturesaura.items.RangeVisualizer; +import de.ellpeck.naturesaura.packet.PacketAuraChunk; import de.ellpeck.naturesaura.particles.ParticleHandler; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -54,6 +55,7 @@ import org.apache.commons.lang3.mutable.MutableInt; import org.lwjgl.opengl.GL11; import java.text.NumberFormat; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -65,9 +67,12 @@ public class ClientEvents { public static final ResourceLocation BOOK_GUI = new ResourceLocation(NaturesAura.MOD_ID, "textures/gui/book.png"); private static final ItemStack ITEM_FRAME = new ItemStack(Items.ITEM_FRAME); private static final Map> SHOWING_EFFECTS = new HashMap<>(); + public static final List PENDING_AURA_CHUNKS = new ArrayList<>(); private static ItemStack heldCache = ItemStack.EMPTY; private static ItemStack heldEye = ItemStack.EMPTY; private static ItemStack heldOcular = ItemStack.EMPTY; + private float height; + private float previousHeight; @SubscribeEvent public void onDebugRender(RenderGameOverlayEvent.Text event) { @@ -97,13 +102,12 @@ public class ClientEvents { @SubscribeEvent public void onRenderLast(RenderWorldLastEvent event) { - Minecraft mc = Minecraft.getInstance(); ParticleHandler.renderParticles(event.getPartialTicks()); } @SubscribeEvent public void onClientTick(TickEvent.ClientTickEvent event) { - if (event.phase == TickEvent.Phase.END) { + if (event.phase != TickEvent.Phase.END) { heldCache = ItemStack.EMPTY; heldEye = ItemStack.EMPTY; heldOcular = ItemStack.EMPTY; @@ -112,55 +116,64 @@ public class ClientEvents { if (mc.world == null) { ParticleHandler.clearParticles(); RangeVisualizer.clear(); - } else if (!mc.isGamePaused()) { - if (mc.world.getGameTime() % 20 == 0) { - int amount = MathHelper.floor(190 * ModConfig.client.excessParticleAmount); - for (int i = 0; i < amount; i++) { - int x = MathHelper.floor(mc.player.posX) + mc.world.rand.nextInt(64) - 32; - int z = MathHelper.floor(mc.player.posZ) + mc.world.rand.nextInt(64) - 32; - BlockPos pos = new BlockPos(x, mc.world.getHeight(Heightmap.Type.WORLD_SURFACE, x, z) - 1, z); - BlockState state = mc.world.getBlockState(pos); - Block block = state.getBlock(); - if (block instanceof IGrowable || block instanceof IPlantable || block instanceof LeavesBlock) { - int excess = IAuraChunk.triangulateAuraInArea(mc.world, pos, 45) - IAuraChunk.DEFAULT_AURA; - if (excess > 0) { - int chance = Math.max(10, 50 - excess / 25000); - if (mc.world.rand.nextInt(chance) <= 0) - NaturesAuraAPI.instance().spawnMagicParticle( - pos.getX() + mc.world.rand.nextFloat(), - pos.getY() + 0.5F, - pos.getZ() + mc.world.rand.nextFloat(), - mc.world.rand.nextGaussian() * 0.01F, - mc.world.rand.nextFloat() * 0.025F, - mc.world.rand.nextGaussian() * 0.01F, - BiomeColors.getFoliageColor(mc.world, pos), - Math.min(2F, 1F + mc.world.rand.nextFloat() * (excess / 30000F)), - Math.min(300, 100 + mc.world.rand.nextInt(excess / 3000 + 1)), - 0F, false, true); + PENDING_AURA_CHUNKS.clear(); + } else { + PENDING_AURA_CHUNKS.removeIf(next -> next.tryHandle(mc.world)); + + if (mc.player != null) { + this.previousHeight = this.height; + this.height += (mc.player.getEyeHeight() - this.height) * 0.5F; + } + + if (!mc.isGamePaused()) { + if (mc.world.getGameTime() % 20 == 0) { + int amount = MathHelper.floor(190 * ModConfig.client.excessParticleAmount); + for (int i = 0; i < amount; i++) { + int x = MathHelper.floor(mc.player.posX) + mc.world.rand.nextInt(64) - 32; + int z = MathHelper.floor(mc.player.posZ) + mc.world.rand.nextInt(64) - 32; + BlockPos pos = new BlockPos(x, mc.world.getHeight(Heightmap.Type.WORLD_SURFACE, x, z) - 1, z); + BlockState state = mc.world.getBlockState(pos); + Block block = state.getBlock(); + if (block instanceof IGrowable || block instanceof IPlantable || block instanceof LeavesBlock) { + int excess = IAuraChunk.triangulateAuraInArea(mc.world, pos, 45) - IAuraChunk.DEFAULT_AURA; + if (excess > 0) { + int chance = Math.max(10, 50 - excess / 25000); + if (mc.world.rand.nextInt(chance) <= 0) + NaturesAuraAPI.instance().spawnMagicParticle( + pos.getX() + mc.world.rand.nextFloat(), + pos.getY() + 0.5F, + pos.getZ() + mc.world.rand.nextFloat(), + mc.world.rand.nextGaussian() * 0.01F, + mc.world.rand.nextFloat() * 0.025F, + mc.world.rand.nextGaussian() * 0.01F, + BiomeColors.getFoliageColor(mc.world, pos), + Math.min(2F, 1F + mc.world.rand.nextFloat() * (excess / 30000F)), + Math.min(300, 100 + mc.world.rand.nextInt(excess / 3000 + 1)), + 0F, false, true); + } } } } - } - if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER) && mc.world.getGameTime() % 5 == 0) { - NaturesAuraAPI.IInternalHooks inst = NaturesAuraAPI.instance(); - inst.setParticleSpawnRange(512); - inst.setParticleDepth(false); - for (BlockPos pos : RangeVisualizer.VISUALIZED_RAILS.get(mc.world.getDimension().getType())) { - NaturesAuraAPI.instance().spawnMagicParticle( - pos.getX() + mc.world.rand.nextFloat(), - pos.getY() + mc.world.rand.nextFloat(), - pos.getZ() + mc.world.rand.nextFloat(), - 0F, 0F, 0F, 0xe0faff, mc.world.rand.nextFloat() * 5 + 1, 100, 0F, false, true); + if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER) && mc.world.getGameTime() % 5 == 0) { + NaturesAuraAPI.IInternalHooks inst = NaturesAuraAPI.instance(); + inst.setParticleSpawnRange(512); + inst.setParticleDepth(false); + for (BlockPos pos : RangeVisualizer.VISUALIZED_RAILS.get(mc.world.getDimension().getType())) { + NaturesAuraAPI.instance().spawnMagicParticle( + pos.getX() + mc.world.rand.nextFloat(), + pos.getY() + mc.world.rand.nextFloat(), + pos.getZ() + mc.world.rand.nextFloat(), + 0F, 0F, 0F, 0xe0faff, mc.world.rand.nextFloat() * 5 + 1, 100, 0F, false, true); + } + inst.setParticleDepth(true); + inst.setParticleSpawnRange(32); } - inst.setParticleDepth(true); - inst.setParticleSpawnRange(32); - } - ParticleHandler.updateParticles(); + ParticleHandler.updateParticles(); - if (Compat.baubles) { - // TODO baubles + if (Compat.baubles) { + // TODO baubles /*IItemHandler baubles = BaublesApi.getBaublesHandler(mc.player); for (int i = 0; i < baubles.getSlots(); i++) { ItemStack slot = baubles.getStackInSlot(i); @@ -173,24 +186,25 @@ public class ClientEvents { heldOcular = slot; } }*/ - } - - for (int i = 0; i < mc.player.inventory.getSizeInventory(); i++) { - ItemStack slot = mc.player.inventory.getStackInSlot(i); - if (!slot.isEmpty()) { - if (slot.getItem() instanceof AuraCache) - heldCache = slot; - else if (slot.getItem() == ModItems.EYE && i <= 8) - heldEye = slot; - else if (slot.getItem() == ModItems.EYE_IMPROVED) - heldOcular = slot; } - } - if (!heldOcular.isEmpty() && mc.world.getGameTime() % 20 == 0) { - SHOWING_EFFECTS.clear(); - Helper.getAuraChunksInArea(mc.world, mc.player.getPosition(), 100, - chunk -> chunk.getActiveEffectIcons(mc.player, SHOWING_EFFECTS)); + for (int i = 0; i < mc.player.inventory.getSizeInventory(); i++) { + ItemStack slot = mc.player.inventory.getStackInSlot(i); + if (!slot.isEmpty()) { + if (slot.getItem() instanceof AuraCache) + heldCache = slot; + else if (slot.getItem() == ModItems.EYE && i <= 8) + heldEye = slot; + else if (slot.getItem() == ModItems.EYE_IMPROVED) + heldOcular = slot; + } + } + + if (!heldOcular.isEmpty() && mc.world.getGameTime() % 20 == 0) { + SHOWING_EFFECTS.clear(); + Helper.getAuraChunksInArea(mc.world, mc.player.getPosition(), 100, + chunk -> chunk.getActiveEffectIcons(mc.player, SHOWING_EFFECTS)); + } } } } @@ -203,7 +217,7 @@ public class ClientEvents { float partial = event.getPartialTicks(); GL11.glTranslated( -mc.player.prevPosX - (mc.player.posX - mc.player.prevPosX) * partial, - -mc.player.prevPosY - (mc.player.posY - mc.player.prevPosY) * partial, + -mc.player.prevPosY - (mc.player.posY - mc.player.prevPosY) * partial - (double) MathHelper.lerp(partial, this.previousHeight, this.height), -mc.player.prevPosZ - (mc.player.posZ - mc.player.prevPosZ) * partial); if (mc.gameSettings.showDebugInfo && mc.player.isCreative() && ModConfig.client.debugWorld) { @@ -271,7 +285,8 @@ public class ClientEvents { GL11.glPopMatrix(); } - private void renderVisualize(IVisualizable visualize, World world, BlockPos pos) { + private void renderVisualize(IVisualizable visualize, World + world, BlockPos pos) { AxisAlignedBB box = visualize.getVisualizationBounds(world, pos); if (box == null) return; @@ -306,7 +321,7 @@ public class ClientEvents { float scale = 0.75F; GlStateManager.scalef(scale, scale, scale); String s = heldCache.getDisplayName().getFormattedText(); - mc.fontRenderer.drawString(s, (x + 80) / scale - mc.fontRenderer.getStringWidth(s), (y - 7) / scale, color); + mc.fontRenderer.drawStringWithShadow(s, (x + 80) / scale - mc.fontRenderer.getStringWidth(s), (y - 7) / scale, color); GlStateManager.color3f(1F, 1F, 1F); GlStateManager.popMatrix(); @@ -357,13 +372,13 @@ public class ClientEvents { int color = heldOcular.isEmpty() ? 0x53a008 : 0xa05308; if (totalPercentage > (heldOcular.isEmpty() ? 1F : 1.5F)) - mc.fontRenderer.drawString("+", startX + plusOffX, startY - 0.5F, color); + mc.fontRenderer.drawStringWithShadow("+", startX + plusOffX, startY - 0.5F, color); if (totalPercentage < (heldOcular.isEmpty() ? 0F : -0.5F)) - mc.fontRenderer.drawString("-", startX + plusOffX, startY - 0.5F + (heldOcular.isEmpty() ? 44 : 70), color); + mc.fontRenderer.drawStringWithShadow("-", startX + plusOffX, startY - 0.5F + (heldOcular.isEmpty() ? 44 : 70), color); GlStateManager.pushMatrix(); GlStateManager.scalef(textScale, textScale, textScale); - mc.fontRenderer.drawString(text, textX / textScale, textY / textScale, 0x53a008); + mc.fontRenderer.drawStringWithShadow(text, textX / textScale, textY / textScale, 0x53a008); GlStateManager.popMatrix(); if (!heldOcular.isEmpty()) { @@ -398,7 +413,7 @@ public class ClientEvents { BlockState state = mc.world.getBlockState(pos); ItemStack blockStack = state.getBlock().getPickBlock(state, mc.objectMouseOver, mc.world, pos, mc.player); this.drawContainerInfo(container.getStoredAura(), container.getMaxAura(), container.getAuraColor(), - mc, res, 35, blockStack.getDisplayName().toString(), null); + mc, res, 35, blockStack.getDisplayName().getFormattedText(), null); if (tile instanceof TileEntityNatureAltar) { ItemStack tileStack = ((TileEntityNatureAltar) tile).getItemHandler(null).getStackInSlot(0); @@ -406,7 +421,7 @@ public class ClientEvents { IAuraContainer stackCont = tileStack.getCapability(NaturesAuraAPI.capAuraContainer, null).orElse(null); if (stackCont != null) { this.drawContainerInfo(stackCont.getStoredAura(), stackCont.getMaxAura(), stackCont.getAuraColor(), - mc, res, 55, tileStack.getDisplayName().toString(), null); + mc, res, 55, tileStack.getDisplayName().getFormattedText(), null); } } } @@ -422,7 +437,7 @@ public class ClientEvents { int x = res.getScaledWidth() / 2; int y = res.getScaledHeight() / 2; if (stack.isEmpty()) - mc.fontRenderer.drawString( + mc.fontRenderer.drawStringWithShadow( TextFormatting.GRAY.toString() + TextFormatting.ITALIC + I18n.format("info.naturesaura.empty"), x + 5, y - 11, 0xFFFFFF); else @@ -445,7 +460,9 @@ public class ClientEvents { } } - private void drawContainerInfo(int stored, int max, int color, Minecraft mc, MainWindow res, int yOffset, String name, String textBelow) { + private void drawContainerInfo(int stored, int max, + int color, Minecraft mc, MainWindow res, int yOffset, String name, String + textBelow) { GlStateManager.color3f((color >> 16 & 255) / 255F, (color >> 8 & 255) / 255F, (color & 255) / 255F); int x = res.getScaledWidth() / 2 - 40; @@ -458,9 +475,9 @@ public class ClientEvents { if (width > 0) AbstractGui.blit(x, y, 0, 6, width, 6, 256, 256); - mc.fontRenderer.drawString(name, x + 40 - mc.fontRenderer.getStringWidth(name) / 2F, y - 9, color); + mc.fontRenderer.drawStringWithShadow(name, x + 40 - mc.fontRenderer.getStringWidth(name) / 2F, y - 9, color); if (textBelow != null) - mc.fontRenderer.drawString(textBelow, x + 40 - mc.fontRenderer.getStringWidth(textBelow) / 2F, y + 7, color); + mc.fontRenderer.drawStringWithShadow(textBelow, x + 40 - mc.fontRenderer.getStringWidth(textBelow) / 2F, y + 7, color); } } diff --git a/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java b/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java index 69324da3..30e96125 100644 --- a/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java +++ b/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java @@ -7,16 +7,26 @@ import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.chunk.AuraChunk; import de.ellpeck.naturesaura.chunk.AuraChunkProvider; import de.ellpeck.naturesaura.misc.WorldData; +import de.ellpeck.naturesaura.packet.PacketHandler; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.server.ChunkHolder; +import net.minecraft.world.server.ChunkManager; +import net.minecraft.world.server.ServerChunkProvider; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.world.ChunkWatchEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; public class CommonEvents { + private static final Method GET_LOADED_CHUNKS_METHOD = ObfuscationReflectionHelper.findMethod(ChunkManager.class, "func_223491_f"); + @SubscribeEvent public void onChunkCapsAttach(AttachCapabilitiesEvent event) { Chunk chunk = event.getObject(); @@ -32,13 +42,22 @@ public class CommonEvents { public void onWorldTick(TickEvent.WorldTickEvent event) { if (!event.world.isRemote && event.phase == TickEvent.Phase.END) { if (event.world.getGameTime() % 20 == 0) { - // TODO update loaded aura chunks - /*Iterator chunks = event.world.getPersistentChunkIterable(((ServerWorld) event.world).getPlayerChunkMap().getChunkIterator()); - while (chunks.hasNext()) { - Chunk chunk = chunks.next(); - AuraChunk auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.capAuraChunk, null).orElse(null); - auraChunk.update(); - }*/ + event.world.getProfiler().startSection(NaturesAura.MOD_ID + ":onWorldTick"); + try { + ChunkManager manager = ((ServerChunkProvider) event.world.getChunkProvider()).chunkManager; + Iterable chunks = (Iterable) GET_LOADED_CHUNKS_METHOD.invoke(manager); + for (ChunkHolder holder : chunks) { + Chunk chunk = holder.func_219298_c(); + if (chunk == null) + continue; + AuraChunk auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.capAuraChunk, null).orElse(null); + if (auraChunk != null) + auraChunk.update(); + } + } catch (IllegalAccessException | InvocationTargetException e) { + NaturesAura.LOGGER.fatal(e); + } + event.world.getProfiler().endSection(); } } } @@ -62,9 +81,8 @@ public class CommonEvents { Chunk chunk = event.getWorld().getChunk(event.getPos().x, event.getPos().z); if (!chunk.getWorld().isRemote) { AuraChunk auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.capAuraChunk, null).orElse(null); - // TODO packets - /*if (auraChunk != null) - PacketHandler.sendTo(event.getPlayer(), auraChunk.makePacket());*/ + if (auraChunk != null) + PacketHandler.sendTo(event.getPlayer(), auraChunk.makePacket()); } } diff --git a/src/main/java/de/ellpeck/naturesaura/items/ShockwaveCreator.java b/src/main/java/de/ellpeck/naturesaura/items/ShockwaveCreator.java index 06e39e3e..fc416ce2 100644 --- a/src/main/java/de/ellpeck/naturesaura/items/ShockwaveCreator.java +++ b/src/main/java/de/ellpeck/naturesaura/items/ShockwaveCreator.java @@ -5,6 +5,8 @@ import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.render.ITrinketItem; import de.ellpeck.naturesaura.items.tools.Armor; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; import net.minecraft.block.BlockState; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; @@ -105,7 +107,7 @@ public class ShockwaveCreator extends ItemImpl implements ITrinketItem { if (worldIn instanceof ServerWorld) ((ServerWorld) worldIn).spawnParticle(ParticleTypes.POOF, living.posX, living.posY + 0.01F, living.posZ, 15, 0D, 0D, 0D, 0.15D); - // TODO PacketHandler.sendToAllAround(worldIn, pos, 32, new PacketParticles((float) living.posX, (float) living.posY, (float) living.posZ, 11)); + PacketHandler.sendToAllAround(worldIn, pos, 32, new PacketParticles((float) living.posX, (float) living.posY, (float) living.posZ, 11)); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/IPacket.java b/src/main/java/de/ellpeck/naturesaura/packet/IPacket.java deleted file mode 100644 index fb78775a..00000000 --- a/src/main/java/de/ellpeck/naturesaura/packet/IPacket.java +++ /dev/null @@ -1,4 +0,0 @@ -package de.ellpeck.naturesaura.packet; - -public interface IPacket { -} diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java index f422faf7..053522ab 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java @@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.packet; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.chunk.AuraChunk; -import net.minecraft.client.Minecraft; +import de.ellpeck.naturesaura.events.ClientEvents; import net.minecraft.network.PacketBuffer; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -16,12 +16,21 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; -public class PacketAuraChunk implements IPacket { +public class PacketAuraChunk { private int chunkX; private int chunkZ; private Map drainSpots; + public PacketAuraChunk(int chunkX, int chunkZ, Map drainSpots) { + this.chunkX = chunkX; + this.chunkZ = chunkZ; + this.drainSpots = drainSpots; + } + + private PacketAuraChunk() { + } + public static PacketAuraChunk fromBytes(PacketBuffer buf) { PacketAuraChunk packet = new PacketAuraChunk(); packet.chunkX = buf.readInt(); @@ -50,22 +59,20 @@ public class PacketAuraChunk implements IPacket { } } - public static class Handler { + public boolean tryHandle(World world) { + Chunk chunk = world.getChunk(this.chunkX, this.chunkZ); + if (chunk.isEmpty()) + return false; + AuraChunk auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.capAuraChunk).orElse(null); + if (auraChunk == null) + return false; + auraChunk.setSpots(this.drainSpots); + return true; + } - @OnlyIn(Dist.CLIENT) - public static void onMessage(PacketAuraChunk message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - World world = Minecraft.getInstance().world; - if (world != null) { - Chunk chunk = world.getChunk(message.chunkX, message.chunkZ); - - if (chunk.getCapability(NaturesAuraAPI.capAuraChunk).isPresent()) { - AuraChunk auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.capAuraChunk).orElse(null); - auraChunk.setSpots(message.drainSpots); - } - } - }); - ctx.get().setPacketHandled(true); - } + @OnlyIn(Dist.CLIENT) + public static void onMessage(PacketAuraChunk message, Supplier ctx) { + ctx.get().enqueueWork(() -> ClientEvents.PENDING_AURA_CHUNKS.add(message)); + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java index cdb27a4a..ae2ed7ea 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketClient.java @@ -11,11 +11,19 @@ import net.minecraftforge.fml.network.NetworkEvent; import java.util.function.Supplier; -public class PacketClient implements IPacket { - +public class PacketClient { private int type; private int[] data; + public PacketClient(int type, int... data) { + this.type = type; + this.data = data; + } + + private PacketClient() { + + } + public static PacketClient fromBytes(PacketBuffer buf) { PacketClient client = new PacketClient(); client.type = buf.readByte(); @@ -33,23 +41,19 @@ public class PacketClient implements IPacket { buf.writeInt(i); } - public static class Handler { - - @OnlyIn(Dist.CLIENT) - public static void onMessage(PacketClient message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - Minecraft mc = Minecraft.getInstance(); - if (mc.world != null) { - switch (message.type) { - case 0: // dimension rail visualization - int goalDim = message.data[0]; - BlockPos goalPos = new BlockPos(message.data[1], message.data[2], message.data[3]); - RangeVisualizer.visualize(mc.player, RangeVisualizer.VISUALIZED_RAILS, DimensionType.getById(goalDim), goalPos); - } + @OnlyIn(Dist.CLIENT) + public static void onMessage(PacketClient message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + Minecraft mc = Minecraft.getInstance(); + if (mc.world != null) { + switch (message.type) { + case 0: // dimension rail visualization + int goalDim = message.data[0]; + BlockPos goalPos = new BlockPos(message.data[1], message.data[2], message.data[3]); + RangeVisualizer.visualize(mc.player, RangeVisualizer.VISUALIZED_RAILS, DimensionType.getById(goalDim), goalPos); } - }); - - ctx.get().setPacketHandled(true); - } + } + }); + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java index d3633ab7..5a677ef9 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketHandler.java @@ -12,37 +12,26 @@ import net.minecraftforge.fml.network.simple.SimpleChannel; public final class PacketHandler { - private static String version = "1"; + private static final String VERSION = "1"; private static SimpleChannel network; public static void init() { - network = NetworkRegistry.newSimpleChannel( - NaturesAura.createRes("network"), - () -> version, - version::equals, - version::equals); - network.registerMessage(0, PacketParticleStream.class, PacketParticleStream::toBytes, PacketParticleStream::fromBytes, PacketParticleStream.Handler::onMessage); - network.registerMessage(1, PacketParticles.class, PacketParticles::toBytes, PacketParticles::fromBytes, PacketParticles.Handler::onMessage); - network.registerMessage(2, PacketAuraChunk.class, PacketAuraChunk::toBytes, PacketAuraChunk::fromBytes, PacketAuraChunk.Handler::onMessage); - network.registerMessage(3, PacketClient.class, PacketClient::toBytes, PacketClient::fromBytes, PacketClient.Handler::onMessage); + network = NetworkRegistry.newSimpleChannel(NaturesAura.createRes("network"), () -> VERSION, VERSION::equals, VERSION::equals); + network.registerMessage(0, PacketParticleStream.class, PacketParticleStream::toBytes, PacketParticleStream::fromBytes, PacketParticleStream::onMessage); + network.registerMessage(1, PacketParticles.class, PacketParticles::toBytes, PacketParticles::fromBytes, PacketParticles::onMessage); + network.registerMessage(2, PacketAuraChunk.class, PacketAuraChunk::toBytes, PacketAuraChunk::fromBytes, PacketAuraChunk::onMessage); + network.registerMessage(3, PacketClient.class, PacketClient::toBytes, PacketClient::fromBytes, PacketClient::onMessage); } - @Deprecated - public static void sendToAllLoaded(World world, BlockPos pos, IPacket message) { - sendToAllLoaded(message); + public static void sendToAllLoaded(World world, BlockPos pos, Object message) { + network.send(PacketDistributor.TRACKING_CHUNK.with(() -> world.getChunkAt(pos)), message); } - public static void sendToAllLoaded(IPacket message) { - network.send(PacketDistributor.ALL.noArg(), message); + public static void sendToAllAround(IWorld world, BlockPos pos, int range, Object message) { + network.send(PacketDistributor.NEAR.with(() -> new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), range, world.getDimension().getType())), message); } - public static void sendToAllAround(IWorld world, BlockPos pos, int range, IPacket message) { - network.send(PacketDistributor.NEAR.with( - () -> new PacketDistributor.TargetPoint(pos.getX(), pos.getY(), pos.getZ(), range, world.getDimension().getType())), - message); - } - - public static void sendTo(PlayerEntity player, IPacket message) { + public static void sendTo(PlayerEntity player, Object message) { network.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) player), message); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java index 51657627..b5b25895 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticleStream.java @@ -1,8 +1,6 @@ package de.ellpeck.naturesaura.packet; -import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; -import io.netty.buffer.ByteBuf; import net.minecraft.network.PacketBuffer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -10,7 +8,7 @@ import net.minecraftforge.fml.network.NetworkEvent; import java.util.function.Supplier; -public class PacketParticleStream implements IPacket { +public class PacketParticleStream { private float startX; private float startY; @@ -36,8 +34,7 @@ public class PacketParticleStream implements IPacket { this.scale = scale; } - public PacketParticleStream() { - + private PacketParticleStream() { } public static PacketParticleStream fromBytes(PacketBuffer buf) { @@ -68,16 +65,13 @@ public class PacketParticleStream implements IPacket { buf.writeFloat(packet.scale); } - public static class Handler { + @OnlyIn(Dist.CLIENT) + public static void onMessage(PacketParticleStream message, Supplier ctx) { + ctx.get().enqueueWork(() -> NaturesAuraAPI.instance().spawnParticleStream( + message.startX, message.startY, message.startZ, + message.endX, message.endY, message.endZ, + message.speed, message.color, message.scale)); - @OnlyIn(Dist.CLIENT) - public static void onMessage(PacketParticleStream message, Supplier ctx) { - ctx.get().enqueueWork(() -> NaturesAuraAPI.instance().spawnParticleStream( - message.startX, message.startY, message.startZ, - message.endX, message.endY, message.endZ, - message.speed, message.color, message.scale)); - - ctx.get().setPacketHandled(true); - } + ctx.get().setPacketHandled(true); } } diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java index 7e8070df..f2c6b428 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java @@ -18,7 +18,7 @@ import net.minecraftforge.fml.network.NetworkEvent; import java.util.function.Supplier; -public class PacketParticles implements IPacket { +public class PacketParticles { private float posX; private float posY; @@ -26,6 +26,17 @@ public class PacketParticles implements IPacket { private int type; private int[] data; + public PacketParticles(float posX, float posY, float posZ, int type, int... data) { + this.posX = posX; + this.posY = posY; + this.posZ = posZ; + this.type = type; + this.data = data; + } + + private PacketParticles() { + } + public static PacketParticles fromBytes(PacketBuffer buf) { PacketParticles packet = new PacketParticles(); @@ -54,380 +65,376 @@ public class PacketParticles implements IPacket { } } - public static class Handler { + @OnlyIn(Dist.CLIENT) + public static void onMessage(PacketParticles message, Supplier ctx) { + ctx.get().enqueueWork(() -> { + World world = Minecraft.getInstance().world; + if (world != null) { + switch (message.type) { + case 0: // Tree ritual: Gold powder + BlockPos pos = new BlockPos(message.posX, message.posY, message.posZ); + Multiblocks.TREE_RITUAL.forEach(pos, 'G', (dustPos, matcher) -> { + BlockState state = world.getBlockState(dustPos); + AxisAlignedBB box = state.getShape(world, dustPos).getBoundingBox(); + NaturesAuraAPI.instance().spawnMagicParticle( + dustPos.getX() + box.minX + (box.maxX - box.minX) * world.rand.nextFloat(), + dustPos.getY() + 0.1F, + dustPos.getZ() + box.minZ + (box.maxZ - box.minZ) * world.rand.nextFloat(), + (float) world.rand.nextGaussian() * 0.02F, + world.rand.nextFloat() * 0.01F + 0.02F, + (float) world.rand.nextGaussian() * 0.02F, + 0xf4cb42, 2F, 50, 0F, false, true); + return true; + }); + break; + case 1: // Tree ritual: Consuming item + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) { + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.5F, message.posY + 0.9F, message.posZ + 0.5F, + (float) world.rand.nextGaussian() * 0.04F, world.rand.nextFloat() * 0.04F, (float) world.rand.nextGaussian() * 0.04F, + 0x89cc37, 1.5F, 25, 0F, false, true); + } + break; + case 2: // Tree ritual: Tree disappearing + for (int i = world.rand.nextInt(5) + 3; i >= 0; i--) { + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), message.posY + world.rand.nextFloat(), message.posZ + world.rand.nextFloat(), + 0F, 0F, 0F, + 0x33FF33, 1F, 50, 0F, false, true); + } + break; + case 3: // Tree ritual: Spawn result item + for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) { + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX, message.posY, message.posZ, + world.rand.nextGaussian() * 0.1F, world.rand.nextGaussian() * 0.1F, world.rand.nextGaussian() * 0.1F, + 0x89cc37, 2F, 100, 0F, true, true); + } + break; + case 4: // Nature altar: Conversion + for (int i = world.rand.nextInt(5) + 2; i >= 0; i--) { + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.25F + world.rand.nextFloat() * 0.5F, + message.posY + 0.9F + 0.25F * world.rand.nextFloat(), + message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.02F, world.rand.nextFloat() * 0.02F, world.rand.nextGaussian() * 0.02F, + 0x00FF00, world.rand.nextFloat() * 1.5F + 0.75F, 20, 0F, false, true); + } + break; + case 5: // Potion generator + int color = message.data[0]; + boolean releaseAura = message.data[1] > 0; + for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) { + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), + message.posY + 1.1F, + message.posZ + world.rand.nextFloat(), + world.rand.nextGaussian() * 0.01F, world.rand.nextFloat() * 0.1F, world.rand.nextGaussian() * 0.01F, + color, 2F + world.rand.nextFloat(), 40, 0F, true, true); - @OnlyIn(Dist.CLIENT) - public static void onMessage(PacketParticles message, Supplier ctx) { - ctx.get().enqueueWork(() -> { - World world = Minecraft.getInstance().world; - if (world != null) { - switch (message.type) { - case 0: // Tree ritual: Gold powder - BlockPos pos = new BlockPos(message.posX, message.posY, message.posZ); - Multiblocks.TREE_RITUAL.forEach(pos, 'G', (dustPos, matcher) -> { - BlockState state = world.getBlockState(dustPos); - //AxisAlignedBB box = state.getBoundingBox(world, dustPos); // TODO - AxisAlignedBB box = state.getShape(world, dustPos).getBoundingBox(); + if (releaseAura) + for (int x = -1; x <= 1; x += 2) + for (int 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, + world.rand.nextGaussian() * 0.02F, + world.rand.nextFloat() * 0.04F, + world.rand.nextGaussian() * 0.02F, + 0xd6340c, 1F + world.rand.nextFloat() * 2F, 75, 0F, true, true); + } + } + break; + case 6: // Plant boost effect + for (int i = world.rand.nextInt(20) + 15; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), + message.posY + 0.25F + world.rand.nextFloat() * 0.5F, + message.posZ + world.rand.nextFloat(), + 0F, world.rand.nextFloat() * 0.02F, 0F, + 0x5ccc30, 1F + world.rand.nextFloat() * 2F, 50, 0F, false, true); + + break; + case 7: // Flower generator consumation + color = message.data[0]; + for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.25F + world.rand.nextFloat() * 0.5F, + message.posY + 0.25F + world.rand.nextFloat() * 0.5F, + message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.02F, + world.rand.nextGaussian() * 0.02F, + world.rand.nextGaussian() * 0.02F, + color, world.rand.nextFloat() * 2F + 1F, 25, 0F, false, true); + break; + case 8: // Flower generator, firework generator aura creation + for (int i = world.rand.nextInt(10) + 5; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.25F + world.rand.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.04F + 0.02F, + world.rand.nextGaussian() * 0.01F, + 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); + break; + case 9: // Placer placing + for (int i = world.rand.nextInt(20) + 20; i >= 0; i--) { + boolean side = world.rand.nextBoolean(); + float x = side ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); + float z = !side ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + x, message.posY + 0.1F + world.rand.nextFloat() * 0.98F, message.posZ + z, + 0F, 0F, 0F, + 0xad7a37, world.rand.nextFloat() + 1F, 50, 0F, true, true); + } + break; + case 10: // Hopper upgrade picking up + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX, message.posY + 0.45F, message.posZ, + world.rand.nextGaussian() * 0.015F, + world.rand.nextGaussian() * 0.015F, + world.rand.nextGaussian() * 0.015F, + 0xdde7ff, world.rand.nextFloat() + 1F, 30, -0.06F, true, true); + break; + case 11: // Shockwave creator particles + for (int i = 0; i < 360; i += 2) { + double 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); + } + break; + case 12: // Oak generator + int sapX = message.data[0]; + int sapY = message.data[1]; + int sapZ = message.data[2]; + releaseAura = message.data[3] > 0; + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnParticleStream( + sapX + 0.5F + (float) world.rand.nextGaussian() * 3F, + sapY + 0.5F + world.rand.nextFloat() * 4F, + sapZ + 0.5F + (float) world.rand.nextGaussian() * 3F, + message.posX + 0.5F, + message.posY + 0.5F, + message.posZ + 0.5F, + 0.6F, BiomeColors.getFoliageColor(world, new BlockPos(sapX, sapY, sapZ)), 1.5F); + if (releaseAura) + for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - dustPos.getX() + box.minX + (box.maxX - box.minX) * world.rand.nextFloat(), - dustPos.getY() + 0.1F, - dustPos.getZ() + box.minZ + (box.maxZ - box.minZ) * world.rand.nextFloat(), - (float) world.rand.nextGaussian() * 0.02F, - world.rand.nextFloat() * 0.01F + 0.02F, - (float) world.rand.nextGaussian() * 0.02F, - 0xf4cb42, 2F, 50, 0F, false, true); + message.posX + 0.25F + world.rand.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.03F, + world.rand.nextFloat() * 0.04F + 0.04F, + world.rand.nextGaussian() * 0.03F, + 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 60, 0F, false, true); + break; + case 13: // Offering table + int genX = message.data[0]; + int genY = message.data[1]; + int genZ = message.data[2]; + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX, message.posY + 0.5F, message.posZ, + world.rand.nextGaussian() * 0.02F, + world.rand.nextFloat() * 0.25F, + world.rand.nextGaussian() * 0.02F, + 0xffadfd, 1.5F, 40, 0F, false, true); + for (int i = world.rand.nextInt(50) + 30; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + genX + 0.5F + world.rand.nextGaussian() * 2.5F, + genY + 0.1F, + genZ + 0.5F + world.rand.nextGaussian() * 2.5F, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.01F, + world.rand.nextGaussian() * 0.01F, + 0xd3e4ff, 1.5F, 150, 0F, false, true); + break; + case 14: // Pickup stopper + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX, message.posY + 0.4F, message.posZ, + world.rand.nextGaussian() * 0.005F, + world.rand.nextFloat() * 0.005F, + world.rand.nextGaussian() * 0.005F, + 0xcc3116, 1.5F, 40, 0F, false, true); + break; + case 15: // Spawn lamp + for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.3F + world.rand.nextFloat() * 0.4F, + message.posY + 0.15F + world.rand.nextFloat() * 0.5F, + message.posZ + 0.3F + world.rand.nextFloat() * 0.4F, + 0F, 0F, 0F, + 0xf4a142, 1F, 30, 0F, false, true); + break; + case 16: // Animal generator aura creation + for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + 0.25F + world.rand.nextFloat() * 0.5F, + message.posY + 1.01F, + message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.04F + 0.02F, + world.rand.nextGaussian() * 0.01F, + 0xd13308, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); + break; + case 17: // Animal generator consuming + boolean child = message.data[0] > 0; + float height = message.data[1] / 10F; + genX = message.data[2]; + genY = message.data[3]; + genZ = message.data[4]; + for (int i = (child ? world.rand.nextInt(10) + 10 : world.rand.nextInt(20) + 20); i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextGaussian() * 0.25F, + message.posY + height * 0.75F + world.rand.nextGaussian() * 0.25F, + message.posZ + world.rand.nextGaussian() * 0.25F, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.01F, + world.rand.nextGaussian() * 0.01F, + 0x42f4c8, world.rand.nextFloat() * (child ? 0.5F : 2F) + 1F, world.rand.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); + break; + case 18: // End flower decay + color = message.data[0]; + for (int i = world.rand.nextInt(10) + 20; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), + message.posY + world.rand.nextFloat(), + message.posZ + world.rand.nextFloat(), + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.01F, + world.rand.nextGaussian() * 0.01F, + color, 1.5F, 80, 0F, true, true); + break; + case 19: // Animal spawner, auto crafter + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX, message.posY + 0.5F, message.posZ, + world.rand.nextGaussian() * 0.02F, + world.rand.nextFloat() * 0.02F, + world.rand.nextGaussian() * 0.02F, + 0x16b7b2, 1.5F, 40, 0F, false, true); + break; + case 20: // RF converter + for (int i = world.rand.nextInt(5) + 2; i >= 0; i--) + Multiblocks.RF_CONVERTER.forEach(new BlockPos(message.posX, message.posY, message.posZ), 'R', (blockPos, matcher) -> { + if (world.rand.nextFloat() < 0.35F) { + NaturesAuraAPI.instance().spawnParticleStream( + blockPos.getX() + world.rand.nextFloat(), + blockPos.getY() + world.rand.nextFloat(), + blockPos.getZ() + world.rand.nextFloat(), + message.posX + world.rand.nextFloat(), + message.posY + world.rand.nextFloat(), + message.posZ + world.rand.nextFloat(), + 0.05F, 0xff1a05, 1.5F); + } return true; }); - break; - case 1: // Tree ritual: Consuming item - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) { - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.5F, message.posY + 0.9F, message.posZ + 0.5F, - (float) world.rand.nextGaussian() * 0.04F, world.rand.nextFloat() * 0.04F, (float) world.rand.nextGaussian() * 0.04F, - 0x89cc37, 1.5F, 25, 0F, false, true); - } - break; - case 2: // Tree ritual: Tree disappearing - for (int i = world.rand.nextInt(5) + 3; i >= 0; i--) { - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat(), message.posY + world.rand.nextFloat(), message.posZ + world.rand.nextFloat(), - 0F, 0F, 0F, - 0x33FF33, 1F, 50, 0F, false, true); - } - break; - case 3: // Tree ritual: Spawn result item - for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) { - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY, message.posZ, - world.rand.nextGaussian() * 0.1F, world.rand.nextGaussian() * 0.1F, world.rand.nextGaussian() * 0.1F, - 0x89cc37, 2F, 100, 0F, true, true); - } - break; - case 4: // Nature altar: Conversion - for (int i = world.rand.nextInt(5) + 2; i >= 0; i--) { - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + world.rand.nextFloat() * 0.5F, - message.posY + 0.9F + 0.25F * world.rand.nextFloat(), - message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.02F, world.rand.nextFloat() * 0.02F, world.rand.nextGaussian() * 0.02F, - 0x00FF00, world.rand.nextFloat() * 1.5F + 0.75F, 20, 0F, false, true); - } - break; - case 5: // Potion generator - int color = message.data[0]; - boolean releaseAura = message.data[1] > 0; - for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) { - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat(), - message.posY + 1.1F, - message.posZ + world.rand.nextFloat(), - world.rand.nextGaussian() * 0.01F, world.rand.nextFloat() * 0.1F, world.rand.nextGaussian() * 0.01F, - color, 2F + world.rand.nextFloat(), 40, 0F, true, true); - - if (releaseAura) - for (int x = -1; x <= 1; x += 2) - for (int 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, - world.rand.nextGaussian() * 0.02F, - world.rand.nextFloat() * 0.04F, - world.rand.nextGaussian() * 0.02F, - 0xd6340c, 1F + world.rand.nextFloat() * 2F, 75, 0F, true, true); - } - } - break; - case 6: // Plant boost effect - for (int i = world.rand.nextInt(20) + 15; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat(), - message.posY + 0.25F + world.rand.nextFloat() * 0.5F, - message.posZ + world.rand.nextFloat(), - 0F, world.rand.nextFloat() * 0.02F, 0F, - 0x5ccc30, 1F + world.rand.nextFloat() * 2F, 50, 0F, false, true); - - break; - case 7: // Flower generator consumation - color = message.data[0]; - for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + world.rand.nextFloat() * 0.5F, - message.posY + 0.25F + world.rand.nextFloat() * 0.5F, - message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.02F, - world.rand.nextGaussian() * 0.02F, - world.rand.nextGaussian() * 0.02F, - color, world.rand.nextFloat() * 2F + 1F, 25, 0F, false, true); - break; - case 8: // Flower generator, firework generator aura creation - for (int i = world.rand.nextInt(10) + 5; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + world.rand.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.04F + 0.02F, - world.rand.nextGaussian() * 0.01F, - 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); - break; - case 9: // Placer placing - for (int i = world.rand.nextInt(20) + 20; i >= 0; i--) { - boolean side = world.rand.nextBoolean(); - float x = side ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); - float z = !side ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + x, message.posY + 0.1F + world.rand.nextFloat() * 0.98F, message.posZ + z, - 0F, 0F, 0F, - 0xad7a37, world.rand.nextFloat() + 1F, 50, 0F, true, true); - } - break; - case 10: // Hopper upgrade picking up - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.45F, message.posZ, - world.rand.nextGaussian() * 0.015F, - world.rand.nextGaussian() * 0.015F, - world.rand.nextGaussian() * 0.015F, - 0xdde7ff, world.rand.nextFloat() + 1F, 30, -0.06F, true, true); - break; - case 11: // Shockwave creator particles - for (int i = 0; i < 360; i += 2) { - double 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); - } - break; - case 12: // Oak generator - int sapX = message.data[0]; - int sapY = message.data[1]; - int sapZ = message.data[2]; - releaseAura = message.data[3] > 0; - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnParticleStream( - sapX + 0.5F + (float) world.rand.nextGaussian() * 3F, - sapY + 0.5F + world.rand.nextFloat() * 4F, - sapZ + 0.5F + (float) world.rand.nextGaussian() * 3F, - message.posX + 0.5F, - message.posY + 0.5F, - message.posZ + 0.5F, - 0.6F, BiomeColors.getFoliageColor(world, new BlockPos(sapX, sapY, sapZ)), 1.5F); - if (releaseAura) - for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + world.rand.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.03F, - world.rand.nextFloat() * 0.04F + 0.04F, - world.rand.nextGaussian() * 0.03F, - 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 60, 0F, false, true); - break; - case 13: // Offering table - int genX = message.data[0]; - int genY = message.data[1]; - int genZ = message.data[2]; - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - world.rand.nextGaussian() * 0.02F, - world.rand.nextFloat() * 0.25F, - world.rand.nextGaussian() * 0.02F, - 0xffadfd, 1.5F, 40, 0F, false, true); - for (int i = world.rand.nextInt(50) + 30; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - genX + 0.5F + world.rand.nextGaussian() * 2.5F, - genY + 0.1F, - genZ + 0.5F + world.rand.nextGaussian() * 2.5F, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.01F, - world.rand.nextGaussian() * 0.01F, - 0xd3e4ff, 1.5F, 150, 0F, false, true); - break; - case 14: // Pickup stopper + break; + case 21: // End flower item consuming + color = message.data[0]; + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.4F, message.posZ, - world.rand.nextGaussian() * 0.005F, - world.rand.nextFloat() * 0.005F, - world.rand.nextGaussian() * 0.005F, - 0xcc3116, 1.5F, 40, 0F, false, true); - break; - case 15: // Spawn lamp - for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.3F + world.rand.nextFloat() * 0.4F, - message.posY + 0.15F + world.rand.nextFloat() * 0.5F, - message.posZ + 0.3F + world.rand.nextFloat() * 0.4F, - 0F, 0F, 0F, - 0xf4a142, 1F, 30, 0F, false, true); - break; - case 16: // Animal generator aura creation - for (int i = world.rand.nextInt(5) + 5; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + 0.25F + world.rand.nextFloat() * 0.5F, - message.posY + 1.01F, - message.posZ + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.04F + 0.02F, - world.rand.nextGaussian() * 0.01F, - 0xd13308, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); - break; - case 17: // Animal generator consuming - boolean child = message.data[0] > 0; - float height = message.data[1] / 10F; - genX = message.data[2]; - genY = message.data[3]; - genZ = message.data[4]; - for (int i = (child ? world.rand.nextInt(10) + 10 : world.rand.nextInt(20) + 20); i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextGaussian() * 0.25F, - message.posY + height * 0.75F + world.rand.nextGaussian() * 0.25F, - message.posZ + world.rand.nextGaussian() * 0.25F, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.01F, - world.rand.nextGaussian() * 0.01F, - 0x42f4c8, world.rand.nextFloat() * (child ? 0.5F : 2F) + 1F, world.rand.nextInt(30) + 40, 0F, true, true); + message.posX, message.posY + 0.5F, message.posZ, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.01F, + world.rand.nextGaussian() * 0.01F, + color, 1.5F, 40, 0F, false, true); + break; + case 22: // Mover cart + float motionX = message.data[0] / 100F; + float motionY = message.data[1] / 100F; + float motionZ = message.data[2] / 100F; + for (int i = world.rand.nextInt(60) + 30; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextGaussian() * 10F, + message.posY + world.rand.nextGaussian() * 10F, + message.posZ + world.rand.nextGaussian() * 10F, + motionX * 0.2F, motionY * 0.2F, motionZ * 0.2F, + IAuraType.forWorld(world).getColor(), 2F, 30, 0F, false, true); + break; + case 23: // Moss generator + for (int i = world.rand.nextInt(30) + 30; i >= 0; i--) { + int side = world.rand.nextInt(3); + float x = side != 0 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); + float y = side != 1 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); + float z = side != 2 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + x, + message.posY + y, + message.posZ + z, + 0F, 0F, 0F, + 0x184c0d, world.rand.nextFloat() + 1F, 30, 0F, true, true); + } + for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), + message.posY + 1F, + message.posZ + world.rand.nextFloat(), + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.04F + 0.02F, + world.rand.nextGaussian() * 0.01F, + 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, true, true); + break; + case 24: // Firework generator + int goalX = message.data[0]; + int goalY = message.data[1]; + int goalZ = message.data[2]; + NaturesAuraAPI.instance().setParticleSpawnRange(64); + for (int i = world.rand.nextInt(30) + 30; i >= 0; i--) 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); - break; - case 18: // End flower decay - color = message.data[0]; - for (int i = world.rand.nextInt(10) + 20; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat(), - message.posY + world.rand.nextFloat(), - message.posZ + world.rand.nextFloat(), - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.01F, - world.rand.nextGaussian() * 0.01F, - color, 1.5F, 80, 0F, true, true); - break; - case 19: // Animal spawner, auto crafter - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - world.rand.nextGaussian() * 0.02F, - world.rand.nextFloat() * 0.02F, - world.rand.nextGaussian() * 0.02F, - 0x16b7b2, 1.5F, 40, 0F, false, true); - break; - case 20: // RF converter - for (int i = world.rand.nextInt(5) + 2; i >= 0; i--) - Multiblocks.RF_CONVERTER.forEach(new BlockPos(message.posX, message.posY, message.posZ), 'R', (blockPos, matcher) -> { - if (world.rand.nextFloat() < 0.35F) { - NaturesAuraAPI.instance().spawnParticleStream( - blockPos.getX() + world.rand.nextFloat(), - blockPos.getY() + world.rand.nextFloat(), - blockPos.getZ() + world.rand.nextFloat(), - message.posX + world.rand.nextFloat(), - message.posY + world.rand.nextFloat(), - message.posZ + world.rand.nextFloat(), - 0.05F, 0xff1a05, 1.5F); - } - return true; - }); - break; - case 21: // End flower item consuming - color = message.data[0]; - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX, message.posY + 0.5F, message.posZ, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.01F, - world.rand.nextGaussian() * 0.01F, - color, 1.5F, 40, 0F, false, true); - break; - case 22: // Mover cart - float motionX = message.data[0] / 100F; - float motionY = message.data[1] / 100F; - float motionZ = message.data[2] / 100F; - for (int i = world.rand.nextInt(60) + 30; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextGaussian() * 10F, - message.posY + world.rand.nextGaussian() * 10F, - message.posZ + world.rand.nextGaussian() * 10F, - motionX * 0.2F, motionY * 0.2F, motionZ * 0.2F, - IAuraType.forWorld(world).getColor(), 2F, 30, 0F, false, true); - break; - case 23: // Moss generator - for (int i = world.rand.nextInt(30) + 30; i >= 0; i--) { - int side = world.rand.nextInt(3); - float x = side != 0 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); - float y = side != 1 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); - float z = side != 2 ? world.rand.nextFloat() : (world.rand.nextBoolean() ? 1.1F : -0.1F); - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + x, - message.posY + y, - message.posZ + z, - 0F, 0F, 0F, - 0x184c0d, world.rand.nextFloat() + 1F, 30, 0F, true, true); - } - for (int i = world.rand.nextInt(20) + 10; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat(), - message.posY + 1F, - message.posZ + world.rand.nextFloat(), - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.04F + 0.02F, - world.rand.nextGaussian() * 0.01F, - 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, true, true); - break; - case 24: // Firework generator - int goalX = message.data[0]; - int goalY = message.data[1]; - int goalZ = message.data[2]; - NaturesAuraAPI.instance().setParticleSpawnRange(64); - for (int i = world.rand.nextInt(30) + 30; i >= 0; i--) - NaturesAuraAPI.instance().spawnParticleStream( - message.posX + (float) world.rand.nextGaussian(), - message.posY + (float) world.rand.nextGaussian(), - message.posZ + (float) world.rand.nextGaussian(), - goalX + 0.25F + world.rand.nextFloat() * 0.5F, - goalY + 0.25F + world.rand.nextFloat() * 0.5F, - goalZ + 0.25F + world.rand.nextFloat() * 0.5F, - 0.65F, message.data[3 + world.rand.nextInt(message.data.length - 3)], 1F); - NaturesAuraAPI.instance().setParticleSpawnRange(32); - break; - case 25: // Dimension rail - float width = message.data[0] / 100F; - height = message.data[1] / 100F; - float depth = message.data[2] / 100F; - for (int i = world.rand.nextInt(100) + 50; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - message.posX + world.rand.nextFloat() * width, - message.posY + world.rand.nextFloat() * height, - message.posZ + world.rand.nextFloat() * depth, - 0F, 0F, 0F, 0xd60cff, 1F + world.rand.nextFloat(), 60, 0F, false, true); - break; - case 26: // Projectile generator - int x = message.data[0]; - int y = message.data[1]; - int z = message.data[2]; - for (int i = world.rand.nextInt(10) + 5; i >= 0; i--) - NaturesAuraAPI.instance().spawnMagicParticle( - x + 0.25F + world.rand.nextFloat() * 0.5F, - y + 1.01F, - z + 0.25F + world.rand.nextFloat() * 0.5F, - world.rand.nextGaussian() * 0.01F, - world.rand.nextFloat() * 0.04F + 0.02F, - world.rand.nextGaussian() * 0.01F, - 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); - for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) - world.addParticle(ParticleTypes.FIREWORK, - message.posX, message.posY, message.posZ, - world.rand.nextGaussian() * 0.03F, - world.rand.nextGaussian() * 0.03F, - world.rand.nextGaussian() * 0.03F); - } + message.posX + (float) world.rand.nextGaussian(), + message.posY + (float) world.rand.nextGaussian(), + message.posZ + (float) world.rand.nextGaussian(), + goalX + 0.25F + world.rand.nextFloat() * 0.5F, + goalY + 0.25F + world.rand.nextFloat() * 0.5F, + goalZ + 0.25F + world.rand.nextFloat() * 0.5F, + 0.65F, message.data[3 + world.rand.nextInt(message.data.length - 3)], 1F); + NaturesAuraAPI.instance().setParticleSpawnRange(32); + break; + case 25: // Dimension rail + float width = message.data[0] / 100F; + height = message.data[1] / 100F; + float depth = message.data[2] / 100F; + for (int i = world.rand.nextInt(100) + 50; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat() * width, + message.posY + world.rand.nextFloat() * height, + message.posZ + world.rand.nextFloat() * depth, + 0F, 0F, 0F, 0xd60cff, 1F + world.rand.nextFloat(), 60, 0F, false, true); + break; + case 26: // Projectile generator + int x = message.data[0]; + int y = message.data[1]; + int z = message.data[2]; + for (int i = world.rand.nextInt(10) + 5; i >= 0; i--) + NaturesAuraAPI.instance().spawnMagicParticle( + x + 0.25F + world.rand.nextFloat() * 0.5F, + y + 1.01F, + z + 0.25F + world.rand.nextFloat() * 0.5F, + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.04F + 0.02F, + world.rand.nextGaussian() * 0.01F, + 0x5ccc30, 1F + world.rand.nextFloat() * 1.5F, 40, 0F, false, true); + for (int i = world.rand.nextInt(10) + 10; i >= 0; i--) + world.addParticle(ParticleTypes.FIREWORK, + message.posX, message.posY, message.posZ, + world.rand.nextGaussian() * 0.03F, + world.rand.nextGaussian() * 0.03F, + world.rand.nextGaussian() * 0.03F); } - }); - ctx.get().setPacketHandled(true); - } + } + }); + ctx.get().setPacketHandled(true); } }