More Sigil work
This commit is contained in:
parent
7cac007b11
commit
67b4b7f9b1
|
@ -16,6 +16,8 @@ import WayofTime.bloodmagic.item.routing.ItemNodeRouter;
|
|||
import WayofTime.bloodmagic.item.routing.ItemRouterFilter;
|
||||
import WayofTime.bloodmagic.item.sigil.*;
|
||||
import WayofTime.bloodmagic.item.sigil.sigil.*;
|
||||
import WayofTime.bloodmagic.item.sigil.sigil.ItemSigilTeleposition;
|
||||
import WayofTime.bloodmagic.item.sigil.sigil.ItemSigilTransposition;
|
||||
import WayofTime.bloodmagic.item.soul.*;
|
||||
import WayofTime.bloodmagic.item.types.ComponentType;
|
||||
import WayofTime.bloodmagic.item.types.ReagentType;
|
||||
|
@ -29,6 +31,7 @@ import net.minecraft.item.Item;
|
|||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
import net.minecraftforge.common.util.EnumHelper;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
@ -144,15 +147,15 @@ public class RegistrarBloodMagicItems {
|
|||
new ItemBoundShovel().setRegistryName("bound_shovel"),
|
||||
new ItemSigilDivination().setRegistryName("sigil_divination"),
|
||||
new ItemSigil(new SigilAir(), "air").setRegistryName("sigil_air"),
|
||||
new ItemSigilWater().setRegistryName("sigil_water"),
|
||||
new ItemSigilLava().setRegistryName("sigil_lava"),
|
||||
new ItemSigil(new SigilFluid(FluidRegistry.WATER), "water").setRegistryName("sigil_water"),
|
||||
new ItemSigil(new SigilFluid(FluidRegistry.LAVA), "lava").setRegistryName("sigil_lava"),
|
||||
new ItemSigilVoid().setRegistryName("sigil_void"),
|
||||
new ItemSigilGreenGrove().setRegistryName("sigil_green_grove"),
|
||||
new ItemSigil(new SigilGreenGrove(), "green_grove").setRegistryName("sigil_green_grove"),
|
||||
new ItemSigil(new SigilBloodLight(), "blood_light").setRegistryName("sigil_blood_light"),
|
||||
new ItemSigil(new SigilElementalAffinity(), "elemental_affinity").setRegistryName("sigil_elemental_affinity"),
|
||||
new ItemSigilMagnetism().setRegistryName("sigil_magnetism"),
|
||||
new ItemSigilSuppression().setRegistryName("sigil_suppression"),
|
||||
new ItemSigilHaste().setRegistryName("sigil_haste"),
|
||||
new ItemSigil(new SigilHaste(), "haste").setRegistryName("sigil_haste"),
|
||||
new ItemSigil(new SigilFastMiner(), "fast_miner").setRegistryName("sigil_fast_miner"),
|
||||
new ItemSigilSeer().setRegistryName("sigil_seer"),
|
||||
new ItemSigilPhantomBridge().setRegistryName("sigil_phantom_bridge"),
|
||||
|
|
|
@ -1,94 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import WayofTime.bloodmagic.api_impl.BloodMagicAPI;
|
||||
import net.minecraft.block.IGrowable;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.player.BonemealEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.Event.Result;
|
||||
|
||||
public class ItemSigilGreenGrove extends ItemSigilToggleableBase {
|
||||
public ItemSigilGreenGrove() {
|
||||
super("green_grove", 150);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSigilUse(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return false;
|
||||
|
||||
if (applyBonemeal(world, blockPos, player, stack)) {
|
||||
if (!world.isRemote) {
|
||||
world.playEvent(2005, blockPos, 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSigilUpdate(ItemStack stack, World worldIn, EntityPlayer player, int itemSlot, boolean isSelected) {
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return;
|
||||
|
||||
int range = 3;
|
||||
int verticalRange = 2;
|
||||
int posX = (int) Math.round(player.posX - 0.5f);
|
||||
int posY = (int) player.posY;
|
||||
int posZ = (int) Math.round(player.posZ - 0.5f);
|
||||
|
||||
for (int ix = posX - range; ix <= posX + range; ix++) {
|
||||
for (int iz = posZ - range; iz <= posZ + range; iz++) {
|
||||
for (int iy = posY - verticalRange; iy <= posY + verticalRange; iy++) {
|
||||
BlockPos blockPos = new BlockPos(ix, iy, iz);
|
||||
IBlockState state = worldIn.getBlockState(blockPos);
|
||||
|
||||
if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) {
|
||||
if (state.getBlock() instanceof IGrowable) {
|
||||
if (worldIn.rand.nextInt(50) == 0) {
|
||||
IBlockState preBlockState = worldIn.getBlockState(blockPos);
|
||||
state.getBlock().updateTick(worldIn, blockPos, state, worldIn.rand);
|
||||
|
||||
IBlockState newState = worldIn.getBlockState(blockPos);
|
||||
if (!newState.equals(preBlockState) && !worldIn.isRemote)
|
||||
worldIn.playEvent(2005, blockPos, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean applyBonemeal(World worldIn, BlockPos target, EntityPlayer player, ItemStack sigilStack) {
|
||||
IBlockState iblockstate = worldIn.getBlockState(target);
|
||||
|
||||
BonemealEvent event = new BonemealEvent(player, worldIn, target, iblockstate, EnumHand.MAIN_HAND, sigilStack);
|
||||
if (MinecraftForge.EVENT_BUS.post(event))
|
||||
return false;
|
||||
else if (event.getResult() == Result.ALLOW)
|
||||
return true;
|
||||
|
||||
if (iblockstate.getBlock() instanceof IGrowable) {
|
||||
IGrowable igrowable = (IGrowable) iblockstate.getBlock();
|
||||
|
||||
if (igrowable.canGrow(worldIn, target, iblockstate, worldIn.isRemote)) {
|
||||
if (!worldIn.isRemote) {
|
||||
if (igrowable.canUseBonemeal(worldIn, worldIn.rand, target, iblockstate))
|
||||
igrowable.grow(worldIn, worldIn.rand, target, iblockstate);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import WayofTime.bloodmagic.core.RegistrarBloodMagic;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class ItemSigilHaste extends ItemSigilToggleableBase {
|
||||
public ItemSigilHaste() {
|
||||
super("haste", 250);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSigilUpdate(ItemStack stack, World world, EntityPlayer player, int itemSlot, boolean isSelected) {
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return;
|
||||
|
||||
player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.BOOST, 2, 0, true, false));
|
||||
}
|
||||
}
|
|
@ -1,115 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.iface.ISigil;
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ActionResult;
|
||||
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.math.RayTraceResult;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.event.ForgeEventFactory;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
|
||||
public class ItemSigilLava extends ItemSigilBase {
|
||||
public ItemSigilLava() {
|
||||
super("lava", 1000);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() instanceof ISigil.Holding)
|
||||
stack = ((Holding) stack.getItem()).getHeldItem(stack, player);
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, stack);
|
||||
|
||||
if (!world.isRemote && !isUnusable(stack)) {
|
||||
RayTraceResult rayTrace = this.rayTrace(world, player, false);
|
||||
|
||||
if (rayTrace != null) {
|
||||
ActionResult<ItemStack> ret = ForgeEventFactory.onBucketUse(player, world, stack, rayTrace);
|
||||
if (ret != null)
|
||||
return ret;
|
||||
|
||||
if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||
BlockPos blockpos = rayTrace.getBlockPos();
|
||||
|
||||
if (!world.isBlockModifiable(player, blockpos)) {
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack)) {
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit);
|
||||
|
||||
if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack)) {
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
if (this.canPlaceLava(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceLava(world, blockpos1)) {
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (world.isRemote || player.isSneaking() || isUnusable(stack)) {
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
if (!world.canMineBlockBody(player, blockPos)) {
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
TileEntity tile = world.getTileEntity(blockPos);
|
||||
if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) {
|
||||
IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side);
|
||||
FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000);
|
||||
int amount = handler.fill(fluid, false);
|
||||
|
||||
if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed())) {
|
||||
handler.fill(fluid, true);
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
public boolean canPlaceLava(World world, BlockPos blockPos) {
|
||||
if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid()) {
|
||||
return false;
|
||||
} else if ((world.getBlockState(blockPos).getBlock() == Blocks.LAVA || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_LAVA) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0) {
|
||||
return false;
|
||||
} else {
|
||||
world.setBlockState(blockPos, Blocks.FLOWING_LAVA.getBlockState().getBaseState(), 3);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean tryPlaceLava(World world, BlockPos pos) {
|
||||
Material material = world.getBlockState(pos).getBlock().getMaterial(world.getBlockState(pos));
|
||||
|
||||
return world.isAirBlock(pos) && !material.isSolid();
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.Constants;
|
||||
import WayofTime.bloodmagic.api.iface.ISigil;
|
||||
import WayofTime.bloodmagic.api.teleport.TeleportQueue;
|
||||
import WayofTime.bloodmagic.api.util.helper.NBTHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import WayofTime.bloodmagic.ritual.portal.Teleports;
|
||||
import WayofTime.bloodmagic.tile.TileTeleposer;
|
||||
import WayofTime.bloodmagic.util.helper.TextHelper;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.ActionResult;
|
||||
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 net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemSigilTeleposition extends ItemSigilBase {
|
||||
public ItemSigilTeleposition() {
|
||||
super("teleposition");
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flag) {
|
||||
super.addInformation(stack, world, tooltip, flag);
|
||||
|
||||
if (!stack.hasTagCompound())
|
||||
return;
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
|
||||
if (tag != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) {
|
||||
tooltip.add(" ");
|
||||
tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.coords", getValue(tag, Constants.NBT.X_COORD), getValue(tag, Constants.NBT.Y_COORD), getValue(tag, Constants.NBT.Z_COORD)));
|
||||
tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.telepositionFocus.dimension", getValue(tag, Constants.NBT.DIMENSION_ID)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() instanceof ISigil.Holding)
|
||||
stack = ((Holding) stack.getItem()).getHeldItem(stack, player);
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, stack);
|
||||
|
||||
if (!world.isRemote && NBTHelper.checkNBT(stack) != null && stack.getTagCompound().hasKey(Constants.NBT.DIMENSION_ID) && stack.getTagCompound().hasKey(Constants.NBT.X_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Y_COORD) && stack.getTagCompound().hasKey(Constants.NBT.Z_COORD)) {
|
||||
BlockPos blockPos = new BlockPos(getValue(stack.getTagCompound(), Constants.NBT.X_COORD), getValue(stack.getTagCompound(), Constants.NBT.Y_COORD), getValue(stack.getTagCompound(), Constants.NBT.Z_COORD)).up();
|
||||
if (world.provider.getDimension() == getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID)) {
|
||||
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportSameDim(blockPos, player, getOwnerUUID(stack), true));
|
||||
} else {
|
||||
TeleportQueue.getInstance().addITeleport(new Teleports.TeleportToDim(blockPos, player, getOwnerUUID(stack), world, getValue(stack.getTagCompound(), Constants.NBT.DIMENSION_ID), true));
|
||||
}
|
||||
}
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() instanceof ISigil.Holding)
|
||||
stack = ((Holding) stack.getItem()).getHeldItem(stack, player);
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
if (!world.isRemote && player.isSneaking() && NBTHelper.checkNBT(stack) != null) {
|
||||
if (world.getTileEntity(pos) != null && world.getTileEntity(pos) instanceof TileTeleposer) {
|
||||
stack.getTagCompound().setInteger(Constants.NBT.DIMENSION_ID, world.provider.getDimension());
|
||||
stack.getTagCompound().setInteger(Constants.NBT.X_COORD, pos.getX());
|
||||
stack.getTagCompound().setInteger(Constants.NBT.Y_COORD, pos.getY());
|
||||
stack.getTagCompound().setInteger(Constants.NBT.Z_COORD, pos.getZ());
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
public int getValue(NBTTagCompound tag, String key) {
|
||||
return tag.getInteger(key);
|
||||
}
|
||||
}
|
|
@ -1,143 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.BlockStack;
|
||||
import WayofTime.bloodmagic.api.Constants;
|
||||
import WayofTime.bloodmagic.api.iface.ISigil;
|
||||
import WayofTime.bloodmagic.api.util.helper.NBTHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import WayofTime.bloodmagic.api_impl.BloodMagicAPI;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntityMobSpawner;
|
||||
import net.minecraft.util.EnumActionResult;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.fml.common.registry.ForgeRegistries;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ItemSigilTransposition extends ItemSigilBase {
|
||||
public ItemSigilTransposition() {
|
||||
super("transposition", 1000);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void addInformation(ItemStack stack, World world, List<String> tooltip, ITooltipFlag flag) {
|
||||
super.addInformation(stack, world, tooltip, flag);
|
||||
|
||||
if (!stack.hasTagCompound())
|
||||
return;
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
|
||||
if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) {
|
||||
tooltip.add(" ");
|
||||
BlockStack blockStack = new BlockStack(Block.getBlockFromName(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME)), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META));
|
||||
tooltip.add(blockStack.getItemStack().getDisplayName());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack stack) {
|
||||
stack = NBTHelper.checkNBT(stack);
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
|
||||
if (tag.hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && tag.hasKey(Constants.NBT.CONTAINED_BLOCK_META)) {
|
||||
BlockStack blockStack = new BlockStack(ForgeRegistries.BLOCKS.getValue(new ResourceLocation(tag.getString(Constants.NBT.CONTAINED_BLOCK_NAME))), tag.getByte(Constants.NBT.CONTAINED_BLOCK_META));
|
||||
if (blockStack.getItemStack() != null && blockStack.getItemStack().getItem() != null) //TODO: Figure out why it's a null item. This is a patchwork solution.
|
||||
{
|
||||
return super.getItemStackDisplayName(stack) + " (" + blockStack.getItemStack().getDisplayName() + ")";
|
||||
}
|
||||
|
||||
}
|
||||
return super.getItemStackDisplayName(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() instanceof ISigil.Holding)
|
||||
stack = ((Holding) stack.getItem()).getHeldItem(stack, player);
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
stack = NBTHelper.checkNBT(stack);
|
||||
|
||||
IBlockState state = world.getBlockState(blockPos);
|
||||
if (!world.isRemote) {
|
||||
if (BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
if (player.isSneaking() && (!stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) || !stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META))) {
|
||||
if (state.getPlayerRelativeBlockHardness(player, world, blockPos) >= 0 && state.getBlockHardness(world, blockPos) >= 0) {
|
||||
int cost = getLpUsed();
|
||||
|
||||
NBTTagCompound tileNBTTag = new NBTTagCompound();
|
||||
String blockName = state.getBlock().getRegistryName().toString();
|
||||
byte metadata = (byte) state.getBlock().getMetaFromState(state);
|
||||
|
||||
if (world.getTileEntity(blockPos) != null) {
|
||||
cost *= 5;
|
||||
world.getTileEntity(blockPos).writeToNBT(tileNBTTag);
|
||||
|
||||
if (world.getTileEntity(blockPos) instanceof TileEntityMobSpawner) {
|
||||
cost *= 6;
|
||||
}
|
||||
}
|
||||
|
||||
stack.getTagCompound().setString(Constants.NBT.CONTAINED_BLOCK_NAME, blockName);
|
||||
stack.getTagCompound().setByte(Constants.NBT.CONTAINED_BLOCK_META, metadata);
|
||||
stack.getTagCompound().setTag(Constants.NBT.CONTAINED_TILE_ENTITY, tileNBTTag);
|
||||
|
||||
NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, cost);
|
||||
|
||||
world.removeTileEntity(blockPos);
|
||||
world.setBlockToAir(blockPos);
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
} else if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_NAME) && stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_BLOCK_META)) {
|
||||
IBlockState iblockstate = world.getBlockState(blockPos);
|
||||
Block block = iblockstate.getBlock();
|
||||
BlockStack blockToPlace = new BlockStack(Block.getBlockFromName(stack.getTagCompound().getString(Constants.NBT.CONTAINED_BLOCK_NAME)), stack.getTagCompound().getByte(Constants.NBT.CONTAINED_BLOCK_META));
|
||||
|
||||
if (!block.isReplaceable(world, blockPos)) {
|
||||
blockPos = blockPos.offset(side);
|
||||
}
|
||||
|
||||
if (!stack.isEmpty() && player.canPlayerEdit(blockPos, side, stack) && world.mayPlace(blockToPlace.getBlock(), blockPos, false, side, player)) {
|
||||
if (world.setBlockState(blockPos, blockToPlace.getState(), 3)) {
|
||||
blockToPlace.getBlock().onBlockPlacedBy(world, blockPos, blockToPlace.getState(), player, blockToPlace.getItemStack());
|
||||
// world.playSound((double) ((float) blockPos.getX() + 0.5F), (double) ((float) blockPos.getY() + 0.5F), (double) ((float) blockPos.getZ() + 0.5F), blockToPlace.getBlock().getStepSound().getPlaceSound(), (blockToPlace.getBlock().getStepSound().getVolume() + 1.0F) / 2.0F, blockToPlace.getBlock().getStepSound().getPitch() * 0.8F);
|
||||
|
||||
if (stack.getTagCompound().hasKey(Constants.NBT.CONTAINED_TILE_ENTITY) && blockToPlace.getBlock().hasTileEntity(blockToPlace.getState())) {
|
||||
NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.CONTAINED_TILE_ENTITY);
|
||||
tag.setInteger("x", blockPos.getX());
|
||||
tag.setInteger("y", blockPos.getY());
|
||||
tag.setInteger("z", blockPos.getZ());
|
||||
world.getTileEntity(blockPos).readFromNBT(tag);
|
||||
}
|
||||
world.notifyBlockUpdate(blockPos, state, state, 3);
|
||||
|
||||
stack.getTagCompound().removeTag(Constants.NBT.CONTAINED_BLOCK_NAME);
|
||||
stack.getTagCompound().removeTag(Constants.NBT.CONTAINED_BLOCK_META);
|
||||
stack.getTagCompound().removeTag(Constants.NBT.CONTAINED_TILE_ENTITY);
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
}
|
|
@ -1,132 +0,0 @@
|
|||
package WayofTime.bloodmagic.item.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.iface.ISigil;
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
|
||||
import net.minecraft.block.BlockCauldron;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
|
||||
public class ItemSigilWater extends ItemSigilBase {
|
||||
public ItemSigilWater() {
|
||||
super("water", 100);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (stack.getItem() instanceof ISigil.Holding)
|
||||
stack = ((Holding) stack.getItem()).getHeldItem(stack, player);
|
||||
if (PlayerHelper.isFakePlayer(player))
|
||||
return ActionResult.newResult(EnumActionResult.FAIL, stack);
|
||||
|
||||
if (!world.isRemote && !isUnusable(stack)) {
|
||||
RayTraceResult rayTrace = this.rayTrace(world, player, false);
|
||||
|
||||
if (rayTrace != null) {
|
||||
ActionResult<ItemStack> ret = net.minecraftforge.event.ForgeEventFactory.onBucketUse(player, world, stack, rayTrace);
|
||||
if (ret != null)
|
||||
return ret;
|
||||
|
||||
if (rayTrace.typeOfHit == RayTraceResult.Type.BLOCK) {
|
||||
BlockPos blockpos = rayTrace.getBlockPos();
|
||||
|
||||
if (!world.isBlockModifiable(player, blockpos))
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
|
||||
if (!player.canPlayerEdit(blockpos.offset(rayTrace.sideHit), rayTrace.sideHit, stack))
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
|
||||
BlockPos blockpos1 = blockpos.offset(rayTrace.sideHit);
|
||||
|
||||
if (!player.canPlayerEdit(blockpos1, rayTrace.sideHit, stack))
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
|
||||
if (this.canPlaceWater(world, blockpos1) && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getLpUsed()) && this.tryPlaceWater(world, blockpos1))
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.onItemRightClick(world, player, hand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos blockPos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {
|
||||
ItemStack stack = player.getHeldItem(hand);
|
||||
if (world.isRemote || player.isSneaking() || isUnusable(stack))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
if (!world.canMineBlockBody(player, blockPos))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
TileEntity tile = world.getTileEntity(blockPos);
|
||||
if (tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) {
|
||||
IFluidHandler handler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side);
|
||||
FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000);
|
||||
int amount = handler.fill(fluid, false);
|
||||
|
||||
if (amount > 0 && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) {
|
||||
handler.fill(fluid, true);
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
if (world.getBlockState(blockPos).getBlock() == Blocks.CAULDRON && NetworkHelper.getSoulNetwork(player).syphonAndDamage(player, getLpUsed())) {
|
||||
world.setBlockState(blockPos, Blocks.CAULDRON.getDefaultState().withProperty(BlockCauldron.LEVEL, 3));
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
public boolean canPlaceWater(World world, BlockPos blockPos) {
|
||||
if (!world.isAirBlock(blockPos) && world.getBlockState(blockPos).getBlock().getMaterial(world.getBlockState(blockPos)).isSolid())
|
||||
return false;
|
||||
else if ((world.getBlockState(blockPos).getBlock() == Blocks.WATER || world.getBlockState(blockPos).getBlock() == Blocks.FLOWING_WATER) && world.getBlockState(blockPos).getBlock().getMetaFromState(world.getBlockState(blockPos)) == 0)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean tryPlaceWater(World worldIn, BlockPos pos) {
|
||||
|
||||
Material material = worldIn.getBlockState(pos).getBlock().getMaterial(worldIn.getBlockState(pos));
|
||||
boolean notSolid = !material.isSolid();
|
||||
|
||||
if (!worldIn.isAirBlock(pos) && !notSolid) {
|
||||
return false;
|
||||
} else {
|
||||
if (worldIn.provider.doesWaterVaporize()) {
|
||||
int i = pos.getX();
|
||||
int j = pos.getY();
|
||||
int k = pos.getZ();
|
||||
worldIn.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, 2.6F + (worldIn.rand.nextFloat() - worldIn.rand.nextFloat()) * 0.8F);
|
||||
|
||||
for (int l = 0; l < 8; ++l)
|
||||
worldIn.spawnParticle(EnumParticleTypes.SMOKE_LARGE, (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D, 0);
|
||||
} else {
|
||||
if (!worldIn.isRemote && notSolid && !material.isLiquid())
|
||||
worldIn.destroyBlock(pos, true);
|
||||
|
||||
worldIn.setBlockState(pos, Blocks.FLOWING_WATER.getDefaultState(), 3);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
package WayofTime.bloodmagic.item.sigil.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.teleport.ITeleport;
|
||||
import WayofTime.bloodmagic.api.teleport.TeleportQueue;
|
||||
import WayofTime.bloodmagic.ritual.portal.Teleports;
|
||||
import WayofTime.bloodmagic.tile.TileTeleposer;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
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 net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
public class ItemSigilTeleposition extends ItemSigil {
|
||||
|
||||
public ItemSigilTeleposition() {
|
||||
super(new SigilTeleposition(), "teleposition");
|
||||
}
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
@Override
|
||||
public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
|
||||
super.addInformation(stack, worldIn, tooltip, flagIn);
|
||||
|
||||
if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("dim"))
|
||||
return;
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
BlockPos pos = BlockPos.fromLong(tag.getLong("pos"));
|
||||
|
||||
tooltip.add("");
|
||||
tooltip.add(I18n.format("tooltip.bloodmagic.telepositionFocus.coords", pos.getX(), pos.getY(), pos.getZ()));
|
||||
tooltip.add(I18n.format("tooltip.bloodmagic.telepositionFocus.dimension", tag.getInteger("dim")));
|
||||
}
|
||||
|
||||
public static class SigilTeleposition implements ISigil {
|
||||
|
||||
@Override
|
||||
public int getCost() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
@Override
|
||||
public EnumActionResult onRightClick(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull EnumHand hand) {
|
||||
if (world.isRemote || !stack.hasTagCompound() || !stack.getTagCompound().hasKey("dim"))
|
||||
return EnumActionResult.PASS;
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
BlockPos pos = BlockPos.fromLong(tag.getLong("pos"));
|
||||
int dimension = tag.getInteger("dim");
|
||||
|
||||
ITeleport teleport;
|
||||
if (world.provider.getDimension() == dimension)
|
||||
teleport = new Teleports.TeleportSameDim(pos, player, getOwnerUUID(stack), true);
|
||||
else
|
||||
teleport = new Teleports.TeleportToDim(pos, player, getOwnerUUID(stack), world, dimension, true);
|
||||
|
||||
TeleportQueue.getInstance().addITeleport(teleport);
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onInteract(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, @Nonnull EnumHand hand) {
|
||||
if (!stack.hasTagCompound())
|
||||
stack.setTagCompound(new NBTTagCompound());
|
||||
|
||||
if (!(world.getTileEntity(pos) instanceof TileTeleposer))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
tag.setLong("pos", pos.toLong());
|
||||
tag.setInteger("dim", world.provider.getDimension());
|
||||
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,145 @@
|
|||
package WayofTime.bloodmagic.item.sigil.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import WayofTime.bloodmagic.api_impl.BloodMagicAPI;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.resources.I18n;
|
||||
import net.minecraft.client.util.ITooltipFlag;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.tileentity.TileEntityMobSpawner;
|
||||
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 javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
|
||||
public class ItemSigilTransposition extends ItemSigil {
|
||||
|
||||
public ItemSigilTransposition() {
|
||||
super(new SigilTransposition(), "transposition");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
|
||||
super.addInformation(stack, worldIn, tooltip, flagIn);
|
||||
|
||||
if (!stack.hasTagCompound())
|
||||
return;
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
if (!tag.hasKey("stored"))
|
||||
return;
|
||||
|
||||
IBlockState state = NBTUtil.readBlockState(tag.getCompoundTag("stored"));
|
||||
ItemStack blockStack = new ItemStack(state.getBlock().getItemDropped(state, null, 0), 1, state.getBlock().damageDropped(state));
|
||||
tooltip.add(blockStack.isEmpty() ? I18n.format(state.getBlock().getUnlocalizedName()) : blockStack.getDisplayName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getItemStackDisplayName(ItemStack stack) {
|
||||
if (!stack.hasTagCompound())
|
||||
return super.getItemStackDisplayName(stack);
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
if (!tag.hasKey("stored"))
|
||||
return super.getItemStackDisplayName(stack);
|
||||
|
||||
IBlockState state = NBTUtil.readBlockState(tag.getCompoundTag("stored"));
|
||||
ItemStack blockStack = new ItemStack(state.getBlock().getItemDropped(state, null, 0), 1, state.getBlock().damageDropped(state));
|
||||
String blockName = blockStack.isEmpty() ? net.minecraft.util.text.translation.I18n.translateToLocal(state.getBlock().getUnlocalizedName()) : blockStack.getDisplayName();
|
||||
|
||||
return super.getItemStackDisplayName(stack) + " (" + blockName + ")";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public NBTTagCompound getNBTShareTag(ItemStack stack) {
|
||||
if (!stack.hasTagCompound() || !stack.getTagCompound().hasKey("stored"))
|
||||
return null;
|
||||
|
||||
NBTTagCompound justTheState = stack.getTagCompound().copy();
|
||||
justTheState.getCompoundTag("stored").removeTag("tile");
|
||||
return justTheState;
|
||||
}
|
||||
|
||||
public static class SigilTransposition implements ISigil {
|
||||
|
||||
@Override
|
||||
public int getCost() {
|
||||
return 1000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onInteract(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, @Nonnull EnumHand hand) {
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
if (world.isRemote || BloodMagicAPI.INSTANCE.getBlacklist().getTransposition().contains(state))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
NBTTagCompound tag = stack.getTagCompound();
|
||||
if (player.isSneaking() && (!stack.hasTagCompound() || !tag.hasKey("stored"))) {
|
||||
if (state.getPlayerRelativeBlockHardness(player, world, pos) >= 0 && state.getBlockHardness(world, pos) >= 0) {
|
||||
int cost = getCost();
|
||||
|
||||
NBTTagCompound stored = new NBTTagCompound();
|
||||
NBTUtil.writeBlockState(stored, state);
|
||||
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile != null) {
|
||||
NBTTagCompound tileTag = new NBTTagCompound();
|
||||
tile.writeToNBT(tileTag);
|
||||
stored.setTag("tile", tileTag);
|
||||
cost *= 5;
|
||||
|
||||
if (tile instanceof TileEntityMobSpawner)
|
||||
cost *= 6;
|
||||
}
|
||||
|
||||
tag.setTag("stored", stored);
|
||||
|
||||
NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, cost);
|
||||
world.setBlockToAir(pos);
|
||||
world.removeTileEntity(pos);
|
||||
}
|
||||
} else if (stack.hasTagCompound() && stack.getTagCompound().hasKey("stored")) {
|
||||
IBlockState placeAtState = world.getBlockState(pos);
|
||||
|
||||
// If the block we clicked isn't replaceable, try to offset to the side we clicked on
|
||||
if (!placeAtState.getBlock().isReplaceable(world, pos))
|
||||
placeAtState = world.getBlockState(pos = pos.offset(side));
|
||||
|
||||
// If we still can't place here, just cancel out.
|
||||
if (!placeAtState.getBlock().isReplaceable(world, pos))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
NBTTagCompound stored = stack.getTagCompound().getCompoundTag("stored");
|
||||
IBlockState toPlace = NBTUtil.readBlockState(stored);
|
||||
if (player.canPlayerEdit(pos, side, stack) && world.mayPlace(toPlace.getBlock(), pos, false, side, player)) {
|
||||
ItemStack placeStack = new ItemStack(state.getBlock().getItemDropped(state, null, 0), 1, state.getBlock().damageDropped(state));
|
||||
toPlace.getBlock().onBlockPlacedBy(world, pos, toPlace, player, placeStack);
|
||||
|
||||
if (stored.hasKey("tile")) {
|
||||
NBTTagCompound tileTag = stored.getCompoundTag("tile");
|
||||
tileTag.setInteger("x", pos.getX());
|
||||
tileTag.setInteger("y", pos.getY());
|
||||
tileTag.setInteger("z", pos.getZ());
|
||||
world.getTileEntity(pos).readFromNBT(tileTag);
|
||||
}
|
||||
|
||||
world.notifyBlockUpdate(pos, state, state, 3);
|
||||
|
||||
stack.getTagCompound().removeTag("stored");
|
||||
}
|
||||
}
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package WayofTime.bloodmagic.item.sigil.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api.util.helper.NetworkHelper;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockLiquid;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
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 net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.IFluidBlock;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper;
|
||||
import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public class SigilFluid implements ISigil {
|
||||
|
||||
private final Fluid fluid;
|
||||
|
||||
public SigilFluid(Fluid fluid) {
|
||||
this.fluid = fluid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCost() {
|
||||
return 1000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onInteract(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, @Nonnull EnumHand hand) {
|
||||
if (world.isRemote)
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
TileEntity tile = world.getTileEntity(pos);
|
||||
if (tile != null && tile.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side)) {
|
||||
IFluidHandler fluidHandler = tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side);
|
||||
FluidStack fluid = new FluidStack(this.fluid, 1000);
|
||||
int amount = fluidHandler.fill(fluid, false);
|
||||
if (amount > 0 && NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getCost())) {
|
||||
fluidHandler.fill(fluid, true);
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (fluid.getBlock() == null)
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
IBlockState placeAtState = world.getBlockState(pos);
|
||||
if (!placeAtState.getBlock().isReplaceable(world, pos))
|
||||
placeAtState = world.getBlockState(pos = pos.offset(side));
|
||||
|
||||
if (!placeAtState.getBlock().isReplaceable(world, pos))
|
||||
return EnumActionResult.FAIL;
|
||||
|
||||
Block fluidBlock = fluid.getBlock();
|
||||
IFluidHandler fluidHandler = null;
|
||||
if (fluidBlock instanceof IFluidBlock)
|
||||
fluidHandler = new FluidBlockWrapper((IFluidBlock) fluidBlock, world, pos);
|
||||
else if (fluidBlock instanceof BlockLiquid)
|
||||
fluidHandler = new BlockLiquidWrapper((BlockLiquid) fluidBlock, world, pos);
|
||||
|
||||
if (fluidHandler != null) {
|
||||
fluidHandler.fill(new FluidStack(fluid, Fluid.BUCKET_VOLUME), true);
|
||||
NetworkHelper.getSoulNetwork(getOwnerUUID(stack)).syphonAndDamage(player, getCost());
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
package WayofTime.bloodmagic.item.sigil.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.api_impl.BloodMagicAPI;
|
||||
import net.minecraft.block.IGrowable;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
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.world.World;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.event.entity.player.BonemealEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.Event;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public class SigilGreenGrove implements ISigil.Toggle {
|
||||
|
||||
private static final int RANGE_HORIZONTAL = 3;
|
||||
private static final int RANGE_VERTICAL = 2;
|
||||
|
||||
@Override
|
||||
public int getCost() {
|
||||
return 150;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EnumActionResult onInteract(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, @Nonnull EnumHand hand) {
|
||||
if (applyBonemeal(world, pos, player, stack, hand)) {
|
||||
if (!world.isRemote)
|
||||
world.playEvent(2005, pos, 0);
|
||||
|
||||
return EnumActionResult.SUCCESS;
|
||||
}
|
||||
|
||||
return EnumActionResult.FAIL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, int itemSlot, boolean isHeld) {
|
||||
int posX = (int) Math.round(player.posX - 0.5f);
|
||||
int posY = (int) player.posY;
|
||||
int posZ = (int) Math.round(player.posZ - 0.5f);
|
||||
|
||||
for (int ix = posX - RANGE_HORIZONTAL; ix <= posX + RANGE_HORIZONTAL; ix++) {
|
||||
for (int iz = posZ - RANGE_HORIZONTAL; iz <= posZ + RANGE_HORIZONTAL; iz++) {
|
||||
for (int iy = posY - RANGE_VERTICAL; iy <= posY + RANGE_VERTICAL; iy++) {
|
||||
BlockPos blockPos = new BlockPos(ix, iy, iz);
|
||||
IBlockState state = world.getBlockState(blockPos);
|
||||
|
||||
if (!BloodMagicAPI.INSTANCE.getBlacklist().getGreenGrove().contains(state)) {
|
||||
if (state.getBlock() instanceof IGrowable) {
|
||||
if (world.rand.nextInt(50) == 0) {
|
||||
state.getBlock().updateTick(world, blockPos, state, world.rand);
|
||||
IBlockState newState = world.getBlockState(blockPos);
|
||||
|
||||
if (!newState.equals(state) && !world.isRemote)
|
||||
world.playEvent(2005, blockPos, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean applyBonemeal(World world, BlockPos target, EntityPlayer player, ItemStack sigilStack, EnumHand hand) {
|
||||
IBlockState state = world.getBlockState(target);
|
||||
|
||||
BonemealEvent event = new BonemealEvent(player, world, target, state, hand, sigilStack);
|
||||
if (MinecraftForge.EVENT_BUS.post(event))
|
||||
return false;
|
||||
else if (event.getResult() == Event.Result.ALLOW)
|
||||
return true;
|
||||
|
||||
if (state.getBlock() instanceof IGrowable) {
|
||||
IGrowable growable = (IGrowable) state.getBlock();
|
||||
|
||||
if (growable.canGrow(world, target, state, world.isRemote)) {
|
||||
if (!world.isRemote && growable.canUseBonemeal(world, world.rand, target, state))
|
||||
growable.grow(world, world.rand, target, state);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package WayofTime.bloodmagic.item.sigil.sigil;
|
||||
|
||||
import WayofTime.bloodmagic.core.RegistrarBloodMagic;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.potion.PotionEffect;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
public class SigilHaste implements ISigil.Toggle {
|
||||
|
||||
@Override
|
||||
public int getCost() {
|
||||
return 250;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(@Nonnull ItemStack stack, @Nonnull EntityPlayer player, @Nonnull World world, int itemSlot, boolean isHeld) {
|
||||
player.addPotionEffect(new PotionEffect(RegistrarBloodMagic.BOOST, 2, 0, true, false));
|
||||
}
|
||||
}
|
|
@ -55,6 +55,7 @@ import net.minecraft.init.MobEffects;
|
|||
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.DamageSource;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.EnumParticleTypes;
|
||||
|
@ -342,22 +343,8 @@ public class GenericHandler {
|
|||
return;
|
||||
|
||||
ItemStack held = event.getItemStack();
|
||||
if (!held.isEmpty() && held.getItem() instanceof IBindable) {
|
||||
held = NBTHelper.checkNBT(held);
|
||||
IBindable bindable = (IBindable) held.getItem();
|
||||
if (Strings.isNullOrEmpty(bindable.getOwnerUUID(held))) {
|
||||
if (bindable.onBind(player, held)) {
|
||||
String uuid = PlayerHelper.getUUIDFromPlayer(player).toString();
|
||||
ItemBindEvent toPost = new ItemBindEvent(player, uuid, held);
|
||||
if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY)
|
||||
return;
|
||||
|
||||
BindableHelper.setItemOwnerUUID(held, uuid);
|
||||
BindableHelper.setItemOwnerName(held, player.getDisplayNameString());
|
||||
}
|
||||
} else if (bindable.getOwnerUUID(held).equals(PlayerHelper.getUUIDFromPlayer(player).toString()) && !bindable.getOwnerName(held).equals(player.getDisplayNameString()))
|
||||
BindableHelper.setItemOwnerName(held, player.getDisplayNameString());
|
||||
}
|
||||
if (!held.isEmpty() && held.getItem() instanceof IBindable)
|
||||
bindItem(held, player);
|
||||
|
||||
if (!held.isEmpty() && held.getItem() instanceof IBloodOrb) {
|
||||
held = NBTHelper.checkNBT(held);
|
||||
|
@ -373,6 +360,38 @@ public class GenericHandler {
|
|||
}
|
||||
}
|
||||
|
||||
// Handles binding of IBindable's
|
||||
@SubscribeEvent
|
||||
public static void onInteractBlock(PlayerInteractEvent.RightClickBlock event) {
|
||||
if (event.getWorld().isRemote)
|
||||
return;
|
||||
|
||||
if (PlayerHelper.isFakePlayer(event.getEntityPlayer()))
|
||||
return;
|
||||
|
||||
if (!event.getItemStack().isEmpty() && event.getItemStack().getItem() instanceof IBindable)
|
||||
bindItem(event.getItemStack(), event.getEntityPlayer());
|
||||
}
|
||||
|
||||
private static void bindItem(ItemStack stack, EntityPlayer player) {
|
||||
IBindable bindable = (IBindable) stack.getItem();
|
||||
if (Strings.isNullOrEmpty(bindable.getOwnerUUID(stack))) {
|
||||
if (!stack.hasTagCompound())
|
||||
stack.setTagCompound(new NBTTagCompound());
|
||||
|
||||
if (bindable.onBind(player, stack)) {
|
||||
String uuid = PlayerHelper.getUUIDFromPlayer(player).toString();
|
||||
ItemBindEvent toPost = new ItemBindEvent(player, uuid, stack);
|
||||
if (MinecraftForge.EVENT_BUS.post(toPost) || toPost.getResult() == Result.DENY)
|
||||
return;
|
||||
|
||||
BindableHelper.setItemOwnerUUID(stack, uuid);
|
||||
BindableHelper.setItemOwnerName(stack, player.getDisplayNameString());
|
||||
}
|
||||
} else if (bindable.getOwnerUUID(stack).equals(PlayerHelper.getUUIDFromPlayer(player).toString()) && !bindable.getOwnerName(stack).equals(player.getDisplayNameString()))
|
||||
BindableHelper.setItemOwnerName(stack, player.getDisplayNameString());
|
||||
}
|
||||
|
||||
@SubscribeEvent(priority = EventPriority.HIGH)
|
||||
public static void onTooltip(ItemTooltipEvent event) {
|
||||
if (event.getItemStack().getItem() instanceof IBindable)
|
||||
|
|
|
@ -5,12 +5,10 @@
|
|||
"transform": "forge:default-item"
|
||||
},
|
||||
"variants": {
|
||||
"type": {
|
||||
"normal": {
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/LavaSigil"
|
||||
}
|
||||
"inventory": [{
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/lavasigil"
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
|
@ -5,12 +5,10 @@
|
|||
"transform": "forge:default-item"
|
||||
},
|
||||
"variants": {
|
||||
"type": {
|
||||
"normal": {
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/TelepositionSigil"
|
||||
}
|
||||
"inventory": [{
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/telepositionsigil"
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
|
@ -5,12 +5,10 @@
|
|||
"transform": "forge:default-item"
|
||||
},
|
||||
"variants": {
|
||||
"type": {
|
||||
"normal": {
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/TranspositionSigil"
|
||||
}
|
||||
"inventory": [{
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/transpositionsigil"
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
|
@ -5,12 +5,10 @@
|
|||
"transform": "forge:default-item"
|
||||
},
|
||||
"variants": {
|
||||
"type": {
|
||||
"normal": {
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/WaterSigil"
|
||||
}
|
||||
"inventory": [{
|
||||
"textures": {
|
||||
"layer0": "bloodmagic:items/watersigil"
|
||||
}
|
||||
}
|
||||
}]
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue