From d0c0700fdaf3c84afc42a65d6e4a1f02e49a486e Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Thu, 2 Jun 2016 17:03:21 -0700 Subject: [PATCH] Un-hardcode block documentation Opens it up for all our custom blocks to be able to provide information. Need a texture from @Yulife. --- .../WayofTime/bloodmagic/api/Constants.java | 4 +- .../api/iface/IDocumentedBlock.java | 35 +++++++++ .../bloodmagic/block/BlockAltar.java | 24 ++++++- .../bloodmagic/item/ItemSanguineBook.java | 72 +++++++++++++++++++ .../item/sigil/ItemSigilDivination.java | 30 ++------ .../bloodmagic/registry/ModItems.java | 5 ++ .../java/WayofTime/bloodmagic/util/Utils.java | 5 ++ .../blockstates/item/ItemSanguineBook.json | 16 +++++ .../assets/bloodmagic/lang/en_US.lang | 3 + 9 files changed, 166 insertions(+), 28 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java create mode 100644 src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 22fb3d0c..c317d050 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -215,7 +215,9 @@ public class Constants SIGIL_TELEPOSITION("ItemSigilTeleposition"), EXPERIENCE_TOME("ItemExperienceBook"), SIGIL_TRANSPOSITION("ItemSigilTransposition"), - RITUAL_READER("ItemRitualReader"); + RITUAL_READER("ItemRitualReader"), + SANGUINE_BOOK("ItemSanguineBook"), + ; @Getter private final String regName; diff --git a/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java b/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java new file mode 100644 index 00000000..794a3315 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/api/iface/IDocumentedBlock.java @@ -0,0 +1,35 @@ +package WayofTime.bloodmagic.api.iface; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.world.World; + +import javax.annotation.Nonnull; +import java.util.List; + +/** + * Marks blocks as one that is documented. + * + * This documentation can be read by an {@link WayofTime.bloodmagic.item.ItemSanguineBook} (or child) + */ +public interface IDocumentedBlock +{ + /** + * Provides the documentation to provide to the player. Usually a short'n'sweet description about basic usage. + * + * @param player + * - The EntityPlayer attempting to view the Documentation. + * @param world + * - The World interaction is happening in. + * @param pos + * - The BlockPos being interacted at. + * @param state + * - The IBlockState of the interacted Block. + * + * @return - A list of formatted ITextComponent to provide to the player. Provide an empty list if there is no available documentation. + */ + @Nonnull + List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state); +} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java index ae6acefa..682555d9 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockAltar.java @@ -3,6 +3,10 @@ package WayofTime.bloodmagic.block; import java.util.ArrayList; import java.util.List; +import WayofTime.bloodmagic.altar.BloodAltar; +import WayofTime.bloodmagic.api.altar.EnumAltarComponent; +import WayofTime.bloodmagic.api.altar.IBloodAltar; +import WayofTime.bloodmagic.api.iface.IDocumentedBlock; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -13,6 +17,8 @@ import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -33,7 +39,7 @@ import WayofTime.bloodmagic.util.Utils; import com.google.common.base.Strings; -public class BlockAltar extends BlockContainer implements IVariantProvider +public class BlockAltar extends BlockContainer implements IVariantProvider, IDocumentedBlock { public BlockAltar() { @@ -167,6 +173,8 @@ public class BlockAltar extends BlockContainer implements IVariantProvider super.breakBlock(world, blockPos, blockState); } + // IVariantProvider + @Override public List> getVariants() { @@ -174,4 +182,18 @@ public class BlockAltar extends BlockContainer implements IVariantProvider ret.add(new ImmutablePair(0, "normal")); return ret; } + + // IDocumentedBlock + + @Override + public List getDocumentation(EntityPlayer player, World world, BlockPos pos, IBlockState state) + { + List docs = new ArrayList(); + IBloodAltar altar = ((IBloodAltar) world.getTileEntity(pos)); + Pair missingBlock = BloodAltar.getAltarMissingBlock(world, pos, altar.getTier().toInt()); + if (missingBlock != null) + docs.add(new TextComponentTranslation("chat.BloodMagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), Utils.prettifyBlockPosString(missingBlock.getLeft()))); + + return docs; + } } diff --git a/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java new file mode 100644 index 00000000..6937be83 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/ItemSanguineBook.java @@ -0,0 +1,72 @@ +package WayofTime.bloodmagic.item; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.iface.IDocumentedBlock; +import WayofTime.bloodmagic.client.IVariantProvider; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.helper.TextHelper; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Collections; +import java.util.List; + +public class ItemSanguineBook extends Item implements IVariantProvider +{ + public ItemSanguineBook() + { + setUnlocalizedName(Constants.Mod.MODID + ".sanguineBook"); + setCreativeTab(BloodMagic.tabBloodMagic); + setMaxStackSize(1); + } + + @Override + public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + { + if (world.isRemote) + return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + + IBlockState hitState = world.getBlockState(pos); + if (player.isSneaking() && hitState.getBlock() instanceof IDocumentedBlock) + { + IDocumentedBlock documentedBlock = (IDocumentedBlock) hitState.getBlock(); + List docs = documentedBlock.getDocumentation(player, world, pos, hitState); + if (!docs.isEmpty()) + { + ChatUtil.sendNoSpam(player, docs.toArray(new ITextComponent[docs.size()])); + return EnumActionResult.SUCCESS; + } + } + + return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer playerIn, List tooltip, boolean advanced) + { + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.book.shifting")); + tooltip.add(TextFormatting.OBFUSCATED + "~ILikeTehNutsAndICannotLie"); + } + + // IVariantProvider + + @Override + public List> getVariants() + { + return Collections.singletonList(Pair.of(0, "type=normal")); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index f5ae89f6..f7a437a7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -8,16 +8,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumHand; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; -import org.apache.commons.lang3.tuple.Pair; - -import WayofTime.bloodmagic.altar.BloodAltar; -import WayofTime.bloodmagic.api.altar.EnumAltarComponent; import WayofTime.bloodmagic.api.altar.IBloodAltar; import WayofTime.bloodmagic.api.iface.IAltarReader; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; @@ -60,22 +55,10 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader { IBloodAltar altar = (IBloodAltar) tile; int tier = altar.getTier().ordinal() + 1; - - if (player.isSneaking()) - { - Pair missingBlock = BloodAltar.getAltarMissingBlock(world, position.getBlockPos(), tier); - if (missingBlock != null) - { - ChatUtil.sendNoSpam(player, new TextComponentTranslation("chat.BloodMagic.altar.nextTier", new TextComponentTranslation(missingBlock.getRight().getKey()), prettifyBlockPosString(missingBlock.getLeft()))); - } - - } else - { - int currentEssence = altar.getCurrentBlood(); - int capacity = altar.getCapacity(); - altar.checkTier(); - ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity)); - } + int currentEssence = altar.getCurrentBlood(); + int capacity = altar.getCapacity(); + altar.checkTier(); + ChatUtil.sendNoSpam(player, new TextComponentTranslation(tooltipBase + "currentAltarTier", NumeralHelper.toRoman(tier)), new TextComponentTranslation(tooltipBase + "currentEssence", currentEssence), new TextComponentTranslation(tooltipBase + "currentAltarCapacity", capacity)); } else if (tile != null && tile instanceof TileIncenseAltar) { TileIncenseAltar altar = (TileIncenseAltar) tile; @@ -93,9 +76,4 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader return super.onItemRightClick(stack, world, player, hand); } - - public String prettifyBlockPosString(BlockPos pos) - { - return "[" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + "]"; - } } diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java index c68bc42f..14116a05 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java @@ -34,6 +34,7 @@ import WayofTime.bloodmagic.item.ItemSlate; import WayofTime.bloodmagic.item.ItemTelepositionFocus; import WayofTime.bloodmagic.item.ItemUpgradeTome; import WayofTime.bloodmagic.item.ItemUpgradeTrainer; +import WayofTime.bloodmagic.item.ItemSanguineBook; import WayofTime.bloodmagic.item.alchemy.ItemCuttingFluid; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; @@ -154,6 +155,8 @@ public class ModItems public static Item cuttingFluid; + public static Item sanguineBook; + public static Item.ToolMaterial boundToolMaterial = EnumHelper.addToolMaterial("BoundToolMaterial", 4, 1, 10, 8, 50); public static Item.ToolMaterial soulToolMaterial = EnumHelper.addToolMaterial("SoulToolMaterial", 4, 520, 7, 8, 50); @@ -250,6 +253,8 @@ public class ModItems baseItemFilter = registerItem(new ItemRouterFilter(), Constants.BloodMagicItem.ROUTER_FILTER.getRegName()); cuttingFluid = registerItem(new ItemCuttingFluid(), Constants.BloodMagicItem.CUTTING_FLUID.getRegName()); + + sanguineBook = registerItem(new ItemSanguineBook(), Constants.BloodMagicItem.SANGUINE_BOOK.getRegName()); } public static void initRenders() diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 0b0530e5..127328dd 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -95,6 +95,11 @@ public class Utils return String.valueOf(input.charAt(0)).toUpperCase(Locale.ENGLISH) + input.substring(1); } + public static String prettifyBlockPosString(BlockPos pos) + { + return "[" + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + "]"; + } + /** * @param tile * - The {@link TileInventory} to input the item to diff --git a/src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json new file mode 100644 index 00000000..3d241ffb --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/item/ItemSanguineBook.json @@ -0,0 +1,16 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "builtin/generated", + "transform": "forge:default-item" + }, + "variants": { + "type": { + "normal": { + "textures": { + "layer0": "bloodmagic:items/SanguineBook" + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 45085e90..56238699 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -163,6 +163,7 @@ item.BloodMagic.itemFilter.modItems.name=Mod Item Filter item.BloodMagic.itemFilter.oreDict.name=Ore Dictionary Item Filter item.BloodMagic.experienceTome.name=Tome of Peritia +item.BloodMagic.sanguineBook.name=Book of Sanguine # Blocks tile.BloodMagic.fluid.lifeEssence.name=Life Essence @@ -389,6 +390,8 @@ tooltip.BloodMagic.decoration.notSafe=Dangerous for decoration tooltip.BloodMagic.cuttingFluidRatio=%d/%d uses remaining +tooltip.BloodMagic.book.shifting=These symbols seem to be... &oshifting... + # Ritual ritual.BloodMagic.blockRange.tooBig=The block range given is too big! Needs to be at most %s blocks. ritual.BloodMagic.blockRange.tooFar=The block range given is too far! Needs to be within a vertical range of %s blocks and a horizontal range of %s blocks.