mirror of
https://github.com/Ellpeck/NaturesAura.git
synced 2024-12-22 22:59:23 +01:00
more fixes, woop de doop
This commit is contained in:
parent
a208887b25
commit
8ebe165a28
10 changed files with 123 additions and 63 deletions
|
@ -84,7 +84,7 @@ public class InternalHooks implements NaturesAuraAPI.IInternalHooks {
|
|||
Vec3d dir = new Vec3d(endX - startX, endY - startY, endZ - startZ);
|
||||
double length = dir.length();
|
||||
if (length > 0) {
|
||||
dir.normalize();
|
||||
dir = dir.normalize();
|
||||
this.spawnMagicParticle(startX, startY, startZ,
|
||||
dir.x * speed, dir.y * speed, dir.z * speed,
|
||||
color, scale, (int) (length / speed), 0F, false, false);
|
||||
|
|
|
@ -10,22 +10,19 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.item.ItemFrameEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ShearsItem;
|
||||
import net.minecraft.item.Items;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.NonNullList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraft.world.storage.loot.LootContext;
|
||||
import net.minecraft.world.storage.loot.LootParameters;
|
||||
import net.minecraftforge.common.IShearable;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
||||
import net.minecraftforge.event.ForgeEventFactory;
|
||||
import net.minecraftforge.event.world.BlockEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -97,7 +94,7 @@ public class TileEntityFieldCreator extends TileEntityImpl implements ITickableT
|
|||
if (this.world.getGameTime() % 40 == 0)
|
||||
chunk.drainAura(spot, 100);
|
||||
|
||||
boolean shears = this.shears() || creator.shears();
|
||||
ItemStack tool = this.getToolUsed(creator);
|
||||
Vec3d dist = new Vec3d(
|
||||
this.pos.getX() - connectedPos.getX(),
|
||||
this.pos.getY() - connectedPos.getY(),
|
||||
|
@ -105,7 +102,7 @@ public class TileEntityFieldCreator extends TileEntityImpl implements ITickableT
|
|||
);
|
||||
double length = dist.length();
|
||||
Vec3d normal = new Vec3d(dist.x / length, dist.y / length, dist.z / length);
|
||||
for (int i = MathHelper.floor(length); i > 0; i--) {
|
||||
for (float i = MathHelper.floor(length); i > 0; i -= 0.5F) {
|
||||
Vec3d scaled = normal.scale(i);
|
||||
BlockPos pos = connectedPos.add(
|
||||
MathHelper.floor(scaled.x + 0.5F),
|
||||
|
@ -120,38 +117,38 @@ public class TileEntityFieldCreator extends TileEntityImpl implements ITickableT
|
|||
if (!block.isAir(state, this.world, pos) && state.getBlockHardness(this.world, pos) >= 0F) {
|
||||
FakePlayer fake = FakePlayerFactory.getMinecraft((ServerWorld) this.world);
|
||||
if (!MinecraftForge.EVENT_BUS.post(new BlockEvent.BreakEvent(this.world, pos, state, fake))) {
|
||||
boolean shearBlock = shears && block instanceof IShearable;
|
||||
List<ItemStack> drops;
|
||||
if (shearBlock && ((IShearable) block).isShearable(ItemStack.EMPTY, this.world, pos))
|
||||
drops = ((IShearable) block).onSheared(ItemStack.EMPTY, this.world, pos, 0);
|
||||
else {
|
||||
drops = state.getDrops(new LootContext.Builder((ServerWorld) this.world)
|
||||
.withParameter(LootParameters.POSITION, pos)
|
||||
.withParameter(LootParameters.BLOCK_STATE, state));
|
||||
}
|
||||
float chance = ForgeEventFactory.fireBlockHarvesting((NonNullList<ItemStack>) drops, this.world, pos, state, 0, 1, false, fake);
|
||||
if (chance > 0 && this.world.rand.nextFloat() <= chance) {
|
||||
this.world.destroyBlock(pos, false);
|
||||
for (ItemStack stack : drops)
|
||||
Block.spawnAsEntity(this.world, pos, stack);
|
||||
|
||||
chunk.drainAura(spot, shearBlock ? 1000 : 300);
|
||||
this.sendParticles();
|
||||
}
|
||||
List<ItemStack> drops = state.getDrops(new LootContext.Builder((ServerWorld) this.world)
|
||||
.withParameter(LootParameters.POSITION, pos)
|
||||
.withParameter(LootParameters.BLOCK_STATE, state)
|
||||
.withParameter(LootParameters.TOOL, tool == null ? new ItemStack(Items.DIAMOND_PICKAXE) : tool)
|
||||
.withNullableParameter(LootParameters.BLOCK_ENTITY, this.world.getTileEntity(pos)));
|
||||
this.world.destroyBlock(pos, false);
|
||||
for (ItemStack stack : drops)
|
||||
Block.spawnAsEntity(this.world, pos, stack);
|
||||
chunk.drainAura(spot, tool != null ? 1000 : 300);
|
||||
this.sendParticles();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean shears() {
|
||||
private ItemStack getToolUsed(TileEntityFieldCreator other) {
|
||||
ItemStack myTool = this.getMyTool();
|
||||
ItemStack otherTool = other.getMyTool();
|
||||
if (myTool != null && otherTool != null)
|
||||
return this.world.rand.nextBoolean() ? myTool : otherTool;
|
||||
return myTool;
|
||||
}
|
||||
|
||||
private ItemStack getMyTool() {
|
||||
List<ItemFrameEntity> frames = Helper.getAttachedItemFrames(this.world, this.pos);
|
||||
for (ItemFrameEntity frame : frames) {
|
||||
ItemStack stack = frame.getDisplayedItem();
|
||||
if (!stack.isEmpty() && stack.getItem() instanceof ShearsItem)
|
||||
return true;
|
||||
if (!stack.isEmpty())
|
||||
return stack;
|
||||
}
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
|
||||
private void sendParticles() {
|
||||
|
|
|
@ -1,21 +1,29 @@
|
|||
package de.ellpeck.naturesaura.blocks.tiles;
|
||||
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
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.block.AbstractFurnaceBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.AbstractCookingRecipe;
|
||||
import net.minecraft.item.crafting.IRecipeType;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.tileentity.FurnaceTileEntity;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.tileentity.*;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.IIntArray;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickableTileEntity {
|
||||
|
||||
private static final Field FURNACE_DATA_FIELD = ObfuscationReflectionHelper.findField(AbstractFurnaceTileEntity.class, "field_214013_b");
|
||||
public boolean isActive;
|
||||
|
||||
public TileEntityFurnaceHeater() {
|
||||
|
@ -30,20 +38,29 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable
|
|||
Direction facing = this.world.getBlockState(this.pos).get(BlockFurnaceHeater.FACING);
|
||||
BlockPos tilePos = this.pos.offset(facing.getOpposite());
|
||||
TileEntity tile = this.world.getTileEntity(tilePos);
|
||||
if (tile instanceof FurnaceTileEntity) {
|
||||
FurnaceTileEntity furnace = (FurnaceTileEntity) tile;
|
||||
if (isReady(furnace)) {
|
||||
// TODO furnace heater
|
||||
/* int time = furnace.getField(0);
|
||||
if (time <= 0)
|
||||
FurnaceBlock.setState(true, this.world, furnace.getPos());
|
||||
furnace.setField(0, 200);
|
||||
if (tile instanceof AbstractFurnaceTileEntity) {
|
||||
AbstractFurnaceTileEntity furnace = (AbstractFurnaceTileEntity) tile;
|
||||
if (this.isReady(furnace)) {
|
||||
IIntArray data;
|
||||
try {
|
||||
data = (IIntArray) FURNACE_DATA_FIELD.get(furnace);
|
||||
} catch (IllegalAccessException e) {
|
||||
NaturesAura.LOGGER.fatal("Couldn't reflect furnace field", e);
|
||||
return;
|
||||
}
|
||||
|
||||
int burnTime = data.get(0);
|
||||
if (burnTime <= 0)
|
||||
this.world.setBlockState(tilePos, this.world.getBlockState(tilePos).with(AbstractFurnaceBlock.LIT, true));
|
||||
|
||||
int totalCookTime = data.get(3);
|
||||
data.set(0, totalCookTime);
|
||||
//if set higher than 199, it'll never finish because the furnace does ++ and then ==
|
||||
furnace.setField(2, Math.min(199, furnace.getField(2) + 5));*/
|
||||
data.set(2, Math.min(totalCookTime - 1, data.get(2) + 5));
|
||||
|
||||
BlockPos spot = IAuraChunk.getHighestSpot(this.world, this.pos, 20, this.pos);
|
||||
IAuraChunk chunk = IAuraChunk.getAuraChunk(this.world, spot);
|
||||
//chunk.drainAura(spot, MathHelper.ceil((200 - time) * 16.6F));
|
||||
chunk.drainAura(spot, MathHelper.ceil((totalCookTime - burnTime) * 16.6F));
|
||||
did = true;
|
||||
|
||||
if (this.world.getGameTime() % 15 == 0) {
|
||||
|
@ -67,23 +84,32 @@ public class TileEntityFurnaceHeater extends TileEntityImpl implements ITickable
|
|||
}
|
||||
}
|
||||
|
||||
private static boolean isReady(FurnaceTileEntity furnace) {
|
||||
private boolean isReady(AbstractFurnaceTileEntity furnace) {
|
||||
if (!furnace.getStackInSlot(1).isEmpty())
|
||||
return false;
|
||||
|
||||
ItemStack input = furnace.getStackInSlot(0);
|
||||
if (!input.isEmpty()) {
|
||||
/*ItemStack output = FurnaceRecipes.instance().getSmeltingResult(input);
|
||||
if (output.isEmpty())*/
|
||||
return false;
|
||||
|
||||
/*ItemStack currOutput = furnace.getStackInSlot(2);
|
||||
return currOutput.isEmpty() ||
|
||||
Helper.areItemsEqual(currOutput, output, true) && currOutput.getCount() + output.getCount() <= output.getMaxStackSize();*/
|
||||
AbstractCookingRecipe recipe = this.world.getRecipeManager().getRecipe(getRecipeType(furnace), furnace, this.world).orElse(null);
|
||||
if (recipe == null)
|
||||
return false;
|
||||
ItemStack output = recipe.getRecipeOutput();
|
||||
ItemStack currOutput = furnace.getStackInSlot(2);
|
||||
return currOutput.isEmpty() || Helper.areItemsEqual(currOutput, output, true) && currOutput.getCount() + output.getCount() <= output.getMaxStackSize();
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
private static IRecipeType<? extends AbstractCookingRecipe> getRecipeType(AbstractFurnaceTileEntity furnace) {
|
||||
if (furnace instanceof BlastFurnaceTileEntity) {
|
||||
return IRecipeType.BLASTING;
|
||||
} else if (furnace instanceof SmokerTileEntity) {
|
||||
return IRecipeType.SMOKING;
|
||||
} else {
|
||||
return IRecipeType.SMELTING;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeNBT(CompoundNBT compound, SaveType type) {
|
||||
super.writeNBT(compound, type);
|
||||
|
|
|
@ -9,12 +9,16 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.entity.item.ItemFrameEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.ItemUseContext;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.BlockRayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.server.ServerWorld;
|
||||
import net.minecraftforge.common.ForgeHooks;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
import net.minecraftforge.common.util.FakePlayerFactory;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
|
@ -110,7 +114,8 @@ public class TileEntityPlacer extends TileEntityImpl implements ITickableTileEnt
|
|||
|
||||
FakePlayer fake = FakePlayerFactory.getMinecraft((ServerWorld) this.world);
|
||||
fake.inventory.mainInventory.set(fake.inventory.currentItem, stack);
|
||||
fake.interactionManager.processRightClick(fake, this.world, fake.getHeldItemMainhand(), Hand.MAIN_HAND);
|
||||
BlockRayTraceResult ray = new BlockRayTraceResult(new Vec3d(pos).add(0.5F, 0.5F, 0.5F), Direction.UP, pos, false);
|
||||
ForgeHooks.onPlaceItemIntoWorld(new ItemUseContext(fake, Hand.MAIN_HAND, ray));
|
||||
return fake.getHeldItemMainhand().copy();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
package de.ellpeck.naturesaura.compat.jei;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.recipes.AltarRecipe;
|
||||
import de.ellpeck.naturesaura.blocks.ModBlocks;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.gui.drawable.IDrawable;
|
||||
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
|
||||
|
@ -53,7 +55,12 @@ public class AltarCategory implements IRecipeCategory<AltarRecipe> {
|
|||
|
||||
@Override
|
||||
public void setIngredients(AltarRecipe altarRecipe, IIngredients iIngredients) {
|
||||
|
||||
ImmutableList.Builder<ItemStack> builder = ImmutableList.builder();
|
||||
builder.add(altarRecipe.input.getMatchingStacks());
|
||||
if (altarRecipe.catalyst != Ingredient.EMPTY)
|
||||
builder.add(altarRecipe.catalyst.getMatchingStacks());
|
||||
iIngredients.setInputs(VanillaTypes.ITEM, builder.build());
|
||||
iIngredients.setOutput(VanillaTypes.ITEM, altarRecipe.output);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package de.ellpeck.naturesaura.compat.jei;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.recipes.AnimalSpawnerRecipe;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.gui.drawable.IDrawable;
|
||||
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
|
||||
|
@ -9,7 +11,12 @@ import mezz.jei.api.helpers.IGuiHelper;
|
|||
import mezz.jei.api.ingredients.IIngredients;
|
||||
import mezz.jei.api.recipe.category.IRecipeCategory;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.SpawnEggItem;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.registries.ForgeRegistries;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
|
@ -48,7 +55,13 @@ public class AnimalSpawnerCategory implements IRecipeCategory<AnimalSpawnerRecip
|
|||
|
||||
@Override
|
||||
public void setIngredients(AnimalSpawnerRecipe animalSpawnerRecipe, IIngredients iIngredients) {
|
||||
ImmutableList.Builder<ItemStack> builder = ImmutableList.builder();
|
||||
for (Ingredient ing : animalSpawnerRecipe.ingredients)
|
||||
builder.add(ing.getMatchingStacks());
|
||||
iIngredients.setInputs(VanillaTypes.ITEM, builder.build());
|
||||
|
||||
EntityType entry = ForgeRegistries.ENTITIES.getValue(animalSpawnerRecipe.entity);
|
||||
iIngredients.setOutput(VanillaTypes.ITEM, new ItemStack(SpawnEggItem.getEgg(entry)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package de.ellpeck.naturesaura.compat.jei;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.recipes.OfferingRecipe;
|
||||
import de.ellpeck.naturesaura.compat.jei.JEINaturesAuraPlugin;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.gui.drawable.IDrawable;
|
||||
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
|
||||
|
@ -10,6 +11,7 @@ import mezz.jei.api.helpers.IGuiHelper;
|
|||
import mezz.jei.api.ingredients.IIngredients;
|
||||
import mezz.jei.api.recipe.category.IRecipeCategory;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -49,7 +51,10 @@ public class OfferingCategory implements IRecipeCategory<OfferingRecipe> {
|
|||
|
||||
@Override
|
||||
public void setIngredients(OfferingRecipe offeringRecipe, IIngredients iIngredients) {
|
||||
|
||||
iIngredients.setInputs(VanillaTypes.ITEM, ImmutableList.<ItemStack>builder()
|
||||
.add(offeringRecipe.input.getMatchingStacks())
|
||||
.add(offeringRecipe.startItem.getMatchingStacks()).build());
|
||||
iIngredients.setOutput(VanillaTypes.ITEM, offeringRecipe.output);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package de.ellpeck.naturesaura.compat.jei;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.recipes.TreeRitualRecipe;
|
||||
import de.ellpeck.naturesaura.compat.jei.JEINaturesAuraPlugin;
|
||||
import mezz.jei.api.constants.VanillaTypes;
|
||||
import mezz.jei.api.gui.IRecipeLayout;
|
||||
import mezz.jei.api.gui.drawable.IDrawable;
|
||||
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
|
||||
|
@ -10,6 +11,8 @@ import mezz.jei.api.helpers.IGuiHelper;
|
|||
import mezz.jei.api.ingredients.IIngredients;
|
||||
import mezz.jei.api.recipe.category.IRecipeCategory;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.item.crafting.Ingredient;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -49,7 +52,12 @@ public class TreeRitualCategory implements IRecipeCategory<TreeRitualRecipe> {
|
|||
|
||||
@Override
|
||||
public void setIngredients(TreeRitualRecipe treeRitualRecipe, IIngredients iIngredients) {
|
||||
|
||||
ImmutableList.Builder<ItemStack> builder = ImmutableList.builder();
|
||||
for (Ingredient ing : treeRitualRecipe.ingredients)
|
||||
builder.add(ing.getMatchingStacks());
|
||||
builder.add(treeRitualRecipe.saplingType.getMatchingStacks());
|
||||
iIngredients.setInputs(VanillaTypes.ITEM, builder.build());
|
||||
iIngredients.setOutput(VanillaTypes.ITEM, treeRitualRecipe.result);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -2,7 +2,6 @@ package de.ellpeck.naturesaura.entities;
|
|||
|
||||
import com.google.common.collect.ListMultimap;
|
||||
import de.ellpeck.naturesaura.Helper;
|
||||
import de.ellpeck.naturesaura.NaturesAura;
|
||||
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
||||
import de.ellpeck.naturesaura.api.misc.IWorldData;
|
||||
import de.ellpeck.naturesaura.api.render.IVisualizable;
|
||||
|
@ -112,7 +111,7 @@ public class EntityEffectInhibitor extends Entity implements IVisualizable {
|
|||
super.tick();
|
||||
if (this.world.isRemote) {
|
||||
if (this.world.getGameTime() % 5 == 0) {
|
||||
NaturesAura.proxy.spawnMagicParticle(
|
||||
NaturesAuraAPI.instance().spawnMagicParticle(
|
||||
this.posX + this.world.rand.nextGaussian() * 0.1F,
|
||||
this.posY,
|
||||
this.posZ + this.world.rand.nextGaussian() * 0.1F,
|
||||
|
|
|
@ -100,10 +100,10 @@
|
|||
"item.naturesaura.ender_access": "Ender Ocular",
|
||||
"item.naturesaura.cave_finder": "Staff of Shadows",
|
||||
"item.naturesaura.aura_trove": "Aura Trove",
|
||||
"container.naturesaura.tree_ritual": "Ritual of the Forest",
|
||||
"container.naturesaura.altar": "Natural Altar Infusion",
|
||||
"container.naturesaura.offering": "Offering to the Gods",
|
||||
"container.naturesaura.animal_spawner": "Altar of Birthing",
|
||||
"container.naturesaura:tree_ritual.name": "Ritual of the Forest",
|
||||
"container.naturesaura:altar.name": "Natural Altar Infusion",
|
||||
"container.naturesaura:offering.name": "Offering to the Gods",
|
||||
"container.naturesaura:animal_spawner.name": "Altar of Birthing",
|
||||
"info.naturesaura.aura_in_area": "Aura Around",
|
||||
"info.naturesaura.book.landing": "$(aura) is a complicated matter, and creating, collecting and making use of it can be difficult.$(br)The $(item)Book of Natural Aura$() contains all the information one requires to do so.",
|
||||
"info.naturesaura.book.subtitle": "The guide to Nature's Aura",
|
||||
|
|
Loading…
Reference in a new issue