added mystical magnifier

This commit is contained in:
Ellpeck 2019-01-27 13:57:34 +01:00
parent fc1723a78d
commit b983246ef9
19 changed files with 313 additions and 48 deletions

View file

@ -16,6 +16,7 @@ import net.minecraft.entity.item.EntityItemFrame;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.nbt.NBTBase;
@ -254,4 +255,41 @@ public final class Helper {
highestAmount = stack.getCount();
return highestAmount;
}
@SideOnly(Side.CLIENT)
public static void renderWeirdBox(double x, double y, double z, double width, double height, double depth) {
GL11.glVertex3d(x, y + height, z);
GL11.glVertex3d(x + width, y + height, z);
GL11.glVertex3d(x + width, y, z);
GL11.glVertex3d(x, y, z);
GL11.glVertex3d(x + width, y, z + depth);
GL11.glVertex3d(x + width, y, z);
GL11.glVertex3d(x + width, y + height, z);
GL11.glVertex3d(x + width, y + height, z + depth);
GL11.glVertex3d(x + width, y + height, z + depth);
GL11.glVertex3d(x, y + height, z + depth);
GL11.glVertex3d(x, y, z + depth);
GL11.glVertex3d(x + width, y, z + depth);
GL11.glVertex3d(x, y + height, z + depth);
GL11.glVertex3d(x, y + height, z);
GL11.glVertex3d(x, y, z);
GL11.glVertex3d(x, y, z + depth);
GL11.glVertex3d(x, y + height, z);
GL11.glVertex3d(x, y + height, z + depth);
GL11.glVertex3d(x + width, y + height, z + depth);
GL11.glVertex3d(x + width, y + height, z);
GL11.glVertex3d(x + width, y, z);
GL11.glVertex3d(x + width, y, z + depth);
GL11.glVertex3d(x, y, z + depth);
GL11.glVertex3d(x, y, z);
}
public static boolean isHoldingItem(EntityPlayer player, Item item) {
for (EnumHand hand : EnumHand.values()) {
ItemStack stack = player.getHeldItem(hand);
if (!stack.isEmpty() && stack.getItem() == item)
return true;
}
return false;
}
}

View file

@ -0,0 +1,16 @@
package de.ellpeck.naturesaura.api.render;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public interface IVisualizableBlock {
@SideOnly(Side.CLIENT)
AxisAlignedBB getVisualizationBounds(World world, BlockPos pos);
@SideOnly(Side.CLIENT)
int getVisualizationColor(World world, BlockPos pos);
}

View file

@ -2,6 +2,7 @@ package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAnimalGenerator;
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
@ -12,16 +13,20 @@ import net.minecraft.entity.INpc;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.IAnimals;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingDropsEvent;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.event.entity.living.LivingExperienceDropEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class BlockAnimalGenerator extends BlockContainerImpl {
public class BlockAnimalGenerator extends BlockContainerImpl implements IVisualizableBlock {
public BlockAnimalGenerator() {
super(Material.ROCK, "animal_generator", TileEntityAnimalGenerator.class, "animal_generator");
this.setSoundType(SoundType.STONE);
@ -91,4 +96,16 @@ public class BlockAnimalGenerator extends BlockContainerImpl {
if (entity.getEntityData().getBoolean(NaturesAura.MOD_ID + ":no_drops"))
event.setCanceled(true);
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
return new AxisAlignedBB(pos).grow(5);
}
@Override
@SideOnly(Side.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return 0x11377a;
}
}

View file

@ -130,7 +130,11 @@ public class BlockContainerImpl extends BlockContainer implements IModItem, ICre
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityImpl) {
TileEntityImpl impl = (TileEntityImpl) tile;
impl.redstonePower = world.getRedstonePowerFromNeighbors(pos);
int newPower = world.getRedstonePowerFromNeighbors(pos);
if (impl.redstonePower != newPower) {
impl.redstonePower = newPower;
impl.onRedstonePowerChange();
}
}
}
}

View file

@ -1,13 +1,31 @@
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityHopperUpgrade;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class BlockHopperUpgrade extends BlockContainerImpl {
public class BlockHopperUpgrade extends BlockContainerImpl implements IVisualizableBlock {
public BlockHopperUpgrade() {
super(Material.IRON, "hopper_upgrade", TileEntityHopperUpgrade.class, "hopper_upgrade");
this.setSoundType(SoundType.METAL);
this.setHardness(2.5F);
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
return new AxisAlignedBB(pos).grow(7);
}
@Override
@SideOnly(Side.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return 0x434f3f;
}
}

View file

@ -2,19 +2,23 @@ package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityOakGenerator;
import net.minecraft.block.BlockSapling;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.terraingen.SaplingGrowTreeEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Random;
public class BlockOakGenerator extends BlockContainerImpl {
public class BlockOakGenerator extends BlockContainerImpl implements IVisualizableBlock {
public BlockOakGenerator() {
super(Material.WOOD, "oak_generator", TileEntityOakGenerator.class, "oak_generator");
@ -50,4 +54,16 @@ public class BlockOakGenerator extends BlockContainerImpl {
});
}
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
return new AxisAlignedBB(pos).grow(10);
}
@Override
@SideOnly(Side.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return 0x2e7a11;
}
}

View file

@ -1,6 +1,7 @@
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityPickupStopper;
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
@ -8,12 +9,17 @@ import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class BlockPickupStopper extends BlockContainerImpl {
public class BlockPickupStopper extends BlockContainerImpl implements IVisualizableBlock {
public BlockPickupStopper() {
super(Material.ROCK, "pickup_stopper", TileEntityPickupStopper.class, "pickup_stopper");
this.setSoundType(SoundType.STONE);
@ -36,7 +42,7 @@ public class BlockPickupStopper extends BlockContainerImpl {
if (radius <= 0F)
return false;
BlockPos stopperPos = stopper.getPos();
if (item.getDistanceSq(stopperPos.getX() + 0.5F, stopperPos.getY() + 0.5F, stopperPos.getZ() + 0.5F) > radius * radius)
if (!new AxisAlignedBB(stopperPos).grow(radius).intersects(item.getEntityBoundingBox()))
return false;
event.setCanceled(true);
@ -48,4 +54,22 @@ public class BlockPickupStopper extends BlockContainerImpl {
});
}
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntityPickupStopper) {
double radius = ((TileEntityPickupStopper) tile).getRadius();
if (radius > 0)
return new AxisAlignedBB(pos).grow(radius);
}
return null;
}
@Override
@SideOnly(Side.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return 0xf4aa42;
}
}

View file

@ -2,6 +2,7 @@ package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntitySpawnLamp;
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
@ -10,10 +11,12 @@ import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLiving;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
@ -23,7 +26,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class BlockSpawnLamp extends BlockContainerImpl {
public class BlockSpawnLamp extends BlockContainerImpl implements IVisualizableBlock {
private static final AxisAlignedBB AABB = new AxisAlignedBB(4 / 16F, 0F, 4 / 16F, 12 / 16F, 13 / 16F, 12 / 16F);
@ -50,7 +53,7 @@ public class BlockSpawnLamp extends BlockContainerImpl {
return false;
BlockPos lampPos = lamp.getPos();
if (pos.distanceSq(lampPos.getX() + 0.5F, lampPos.getY() + 0.5F, lampPos.getZ() + 0.5F) > range * range)
if (!new AxisAlignedBB(lampPos).grow(range).contains(new Vec3d(pos)))
return false;
EntityLiving entity = (EntityLiving) event.getEntityLiving();
@ -102,4 +105,23 @@ public class BlockSpawnLamp extends BlockContainerImpl {
public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
return BlockFaceShape.UNDEFINED;
}
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileEntitySpawnLamp) {
int radius = ((TileEntitySpawnLamp) tile).getRadius();
if (radius > 0)
return new AxisAlignedBB(pos).grow(radius);
System.out.println(radius);
}
return null;
}
@Override
@SideOnly(Side.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return 0x825ee5;
}
}

View file

@ -56,6 +56,10 @@ public class TileEntityImpl extends TileEntity {
}
}
public void onRedstonePowerChange(){
}
@Override
public final SPacketUpdateTileEntity getUpdatePacket() {
NBTTagCompound compound = new NBTTagCompound();

View file

@ -5,4 +5,10 @@ public class TileEntityPickupStopper extends TileEntityImpl {
public float getRadius() {
return this.redstonePower / 2F;
}
@Override
public void onRedstonePowerChange() {
if (!this.world.isRemote)
this.sendToClients();
}
}

View file

@ -6,4 +6,9 @@ public class TileEntitySpawnLamp extends TileEntityImpl {
return this.redstonePower * 3;
}
@Override
public void onRedstonePowerChange() {
if (!this.world.isRemote)
this.sendToClients();
}
}

View file

@ -1,18 +1,22 @@
package de.ellpeck.naturesaura.events;
import baubles.api.BaublesApi;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
import de.ellpeck.naturesaura.api.aura.container.IAuraContainer;
import de.ellpeck.naturesaura.api.aura.type.IAuraType;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityNatureAltar;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityRFConverter;
import de.ellpeck.naturesaura.compat.Compat;
import de.ellpeck.naturesaura.items.ItemRangeVisualizer;
import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.particles.ParticleHandler;
import de.ellpeck.naturesaura.particles.ParticleMagic;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Gui;
@ -22,6 +26,7 @@ import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.TextFormatting;
@ -102,19 +107,18 @@ public class ClientEvents {
public void onWorldRender(RenderWorldLastEvent event) {
Minecraft mc = Minecraft.getMinecraft();
mc.profiler.func_194340_a(() -> NaturesAura.MOD_ID + ":onWorldRender");
if (mc.gameSettings.showDebugInfo && mc.player.capabilities.isCreativeMode && ModConfig.client.debugWorld) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_DEPTH_TEST);
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.prevPosZ - (mc.player.posZ - mc.player.prevPosZ) * partial);
if (mc.gameSettings.showDebugInfo && mc.player.capabilities.isCreativeMode && ModConfig.client.debugWorld) {
Map<BlockPos, Integer> spots = new HashMap<>();
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBegin(GL11.GL_QUADS);
@ -122,40 +126,11 @@ public class ClientEvents {
spots.put(pos, spot);
GlStateManager.color(spot > 0 ? 0F : 1F, spot > 0 ? 1F : 0F, 0F, 0.35F);
int x = pos.getX();
int y = pos.getY();
int z = pos.getZ();
GL11.glVertex3d(x, y + 1, z);
GL11.glVertex3d(x + 1, y + 1, z);
GL11.glVertex3d(x + 1, y, z);
GL11.glVertex3d(x, y, z);
GL11.glVertex3d(x + 1, y, z + 1);
GL11.glVertex3d(x + 1, y, z);
GL11.glVertex3d(x + 1, y + 1, z);
GL11.glVertex3d(x + 1, y + 1, z + 1);
GL11.glVertex3d(x + 1, y + 1, z + 1);
GL11.glVertex3d(x, y + 1, z + 1);
GL11.glVertex3d(x, y, z + 1);
GL11.glVertex3d(x + 1, y, z + 1);
GL11.glVertex3d(x, y + 1, z + 1);
GL11.glVertex3d(x, y + 1, z);
GL11.glVertex3d(x, y, z);
GL11.glVertex3d(x, y, z + 1);
GL11.glVertex3d(x, y + 1, z);
GL11.glVertex3d(x, y + 1, z + 1);
GL11.glVertex3d(x + 1, y + 1, z + 1);
GL11.glVertex3d(x + 1, y + 1, z);
GL11.glVertex3d(x + 1, y, z);
GL11.glVertex3d(x + 1, y, z + 1);
GL11.glVertex3d(x, y, z + 1);
GL11.glVertex3d(x, y, z);
Helper.renderWeirdBox(pos.getX(), pos.getY(), pos.getZ(), 1, 1, 1);
});
GL11.glEnd();
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glPopMatrix();
GL11.glPopAttrib();
GL11.glPushMatrix();
float scale = 0.03F;
GlStateManager.scale(scale, scale, scale);
for (Map.Entry<BlockPos, Integer> spot : spots.entrySet()) {
@ -166,11 +141,43 @@ public class ClientEvents {
mc.fontRenderer.drawString(spot.getValue().toString(), 0, 0, 0);
GlStateManager.popMatrix();
}
GL11.glPopMatrix();
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glPopMatrix();
}
if (mc.objectMouseOver != null) {
if (Helper.isHoldingItem(mc.player, ModItems.RANGE_VISUALIZER)) {
GL11.glPushMatrix();
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBegin(GL11.GL_QUADS);
for (BlockPos pos : ItemRangeVisualizer.VISUALIZED_POSITIONS) {
if (!mc.world.isBlockLoaded(pos))
continue;
IBlockState state = mc.world.getBlockState(pos);
Block block = state.getBlock();
if (!(block instanceof IVisualizableBlock))
continue;
IVisualizableBlock visualize = (IVisualizableBlock) block;
AxisAlignedBB box = visualize.getVisualizationBounds(mc.world, pos);
if (box == null)
continue;
box = box.grow(0.05F);
int color = visualize.getVisualizationColor(mc.world, pos);
GlStateManager.color(((color >> 16) & 255) / 255F, ((color >> 8) & 255) / 255F, (color & 255) / 255F, 0.5F);
Helper.renderWeirdBox(box.minX, box.minY, box.minZ, box.maxX - box.minX, box.maxY - box.minY, box.maxZ - box.minZ);
}
GL11.glEnd();
GL11.glPopAttrib();
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();
}
}
GL11.glPopMatrix();
mc.profiler.endSection();
}

View file

@ -0,0 +1,38 @@
package de.ellpeck.naturesaura.items;
import de.ellpeck.naturesaura.api.render.IVisualizableBlock;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import java.util.HashSet;
import java.util.Set;
public class ItemRangeVisualizer extends ItemImpl {
public static final Set<BlockPos> VISUALIZED_POSITIONS = new HashSet<>();
public ItemRangeVisualizer() {
super("range_visualizer");
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
IBlockState state = worldIn.getBlockState(pos);
Block block = state.getBlock();
if (block instanceof IVisualizableBlock) {
if (worldIn.isRemote)
if (VISUALIZED_POSITIONS.contains(pos))
VISUALIZED_POSITIONS.remove(pos);
else
VISUALIZED_POSITIONS.add(pos);
return EnumActionResult.SUCCESS;
}
return EnumActionResult.PASS;
}
}

View file

@ -44,4 +44,5 @@ public final class ModItems {
public static final Item EFFECT_POWDER = new ItemEffectPowder();
public static final Item BIRTH_SPIRIT = new ItemBirthSpirit();
public static final Item MOVER_MINECART = new ItemMoverMinecart();
public static final Item RANGE_VISUALIZER = new ItemRangeVisualizer();
}

View file

@ -75,6 +75,7 @@ item.naturesaura.effect_powder.naturesaura:plant_boost.name=Powder of Steady Gro
item.naturesaura.effect_powder.naturesaura:cache_recharge.name=Powder of no Storage
item.naturesaura.effect_powder.naturesaura:animal.name=Powder of Chastity
item.naturesaura.mover_cart.name=Aura Attraction Cart
item.naturesaura.range_visualizer.name=Mystical Magnifier
container.naturesaura.tree_ritual.name=Ritual of the Forest
container.naturesaura.altar.name=Natural Altar Infusion

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "naturesaura:items/range_visualizer"
}
}

View file

@ -0,0 +1,17 @@
{
"name": "Mystical Magnifier",
"icon": "naturesaura:range_visualizer",
"category": "items",
"advancement": "naturesaura:infused_materials",
"pages": [
{
"type": "text",
"text": "The $(item)Mystical Magnifier$() is a $(t:is a mod by vazkii)neat$() device for any magical botanist working with machinery. When equipped in either hand, and interacting with a compatible device, its $(thing)range of operation$() will be displayed around it, allowing any contraptions built with it to be inspected easily and precisely. To stop a device from displaying its range, simply interact with it a second time."
},
{
"type": "crafting",
"text": "Creating the $(item)Mystical Magnifier$()",
"recipe": "naturesaura:range_visualizer"
}
]
}

View file

@ -0,0 +1,25 @@
{
"type": "forge:ore_shaped",
"pattern": [
"IA ",
"AGA",
" AS"
],
"key": {
"A": {
"item": "naturesaura:ancient_planks"
},
"I": {
"item": "naturesaura:infused_iron"
},
"G": {
"item": "minecraft:glass"
},
"S": {
"item": "naturesaura:ancient_stick"
}
},
"result": {
"item": "naturesaura:range_visualizer"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B