2013-04-17 02:48:49 +02:00
|
|
|
package StevenDimDoors.mod_pocketDim.items;
|
2013-02-18 03:46:16 +01:00
|
|
|
|
|
|
|
import java.util.List;
|
2013-04-17 02:48:49 +02:00
|
|
|
|
2013-02-18 03:46:16 +01:00
|
|
|
import net.minecraft.block.Block;
|
|
|
|
import net.minecraft.block.material.Material;
|
2013-03-29 23:19:27 +01:00
|
|
|
import net.minecraft.client.renderer.texture.IconRegister;
|
2013-02-18 03:46:16 +01:00
|
|
|
import net.minecraft.entity.Entity;
|
|
|
|
import net.minecraft.entity.EntityLiving;
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
2013-03-10 05:04:20 +01:00
|
|
|
import net.minecraft.item.EnumAction;
|
2013-02-20 00:13:09 +01:00
|
|
|
import net.minecraft.item.EnumToolMaterial;
|
2013-02-18 03:46:16 +01:00
|
|
|
import net.minecraft.item.ItemStack;
|
2013-07-15 08:45:25 +02:00
|
|
|
import net.minecraft.item.ItemSword;
|
2013-02-18 03:46:16 +01:00
|
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
|
|
import net.minecraft.util.MathHelper;
|
|
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
|
|
import net.minecraft.util.Vec3;
|
|
|
|
import net.minecraft.world.World;
|
2013-06-19 05:04:36 +02:00
|
|
|
import StevenDimDoors.mod_pocketDim.DDProperties;
|
|
|
|
import StevenDimDoors.mod_pocketDim.mod_pocketDim;
|
2013-09-02 17:47:12 +02:00
|
|
|
import StevenDimDoors.mod_pocketDim.core.LinkTypes;
|
2013-08-31 22:00:18 +02:00
|
|
|
import StevenDimDoors.mod_pocketDim.core.NewDimData;
|
2013-08-29 08:14:24 +02:00
|
|
|
import StevenDimDoors.mod_pocketDim.core.PocketManager;
|
2013-02-18 03:46:16 +01:00
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
|
2013-07-15 08:45:25 +02:00
|
|
|
public class ItemRiftBlade extends ItemSword
|
2013-02-18 03:46:16 +01:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
private static DDProperties properties = null;
|
|
|
|
|
|
|
|
public ItemRiftBlade(int itemID, EnumToolMaterial material)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
super(itemID, material);
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
this.setCreativeTab(mod_pocketDim.dimDoorsCreativeTab);
|
2013-06-19 05:04:36 +02:00
|
|
|
this.setMaxStackSize(1);
|
|
|
|
this.setMaxDamage(500);
|
2013-08-31 22:00:18 +02:00
|
|
|
this.hasSubtypes = false;
|
2013-06-19 05:04:36 +02:00
|
|
|
if (properties == null)
|
|
|
|
properties = DDProperties.instance();
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
public boolean isFull3D()
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
2013-06-19 05:04:36 +02:00
|
|
|
public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
|
|
|
|
{
|
|
|
|
if (par2Block.blockID == Block.web.blockID)
|
2013-03-10 05:04:20 +01:00
|
|
|
{
|
2013-06-19 05:04:36 +02:00
|
|
|
return 15.0F;
|
2013-05-04 01:34:01 +02:00
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
else
|
2013-05-04 01:34:01 +02:00
|
|
|
{
|
2013-06-19 05:04:36 +02:00
|
|
|
Material material = par2Block.blockMaterial;
|
|
|
|
return material != Material.plants && material != Material.vine && material != Material.coral && material != Material.leaves && material != Material.pumpkin ? 1.0F : 1.5F;
|
2013-03-10 05:04:20 +01:00
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
@Override
|
|
|
|
public boolean hasEffect(ItemStack par1ItemStack)
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
2013-06-19 05:04:36 +02:00
|
|
|
public boolean hitEntity(ItemStack par1ItemStack, EntityLiving par2EntityLiving, EntityLiving par3EntityLiving)
|
|
|
|
{
|
|
|
|
par1ItemStack.damageItem(1, par3EntityLiving);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
2013-06-19 05:04:36 +02:00
|
|
|
public int getDamageVsEntity(Entity par1Entity)
|
|
|
|
{
|
2013-07-15 08:45:25 +02:00
|
|
|
return 7;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
2013-06-19 05:04:36 +02:00
|
|
|
public MovingObjectPosition getMovingObjectPositionFromPlayer(World par1World, EntityPlayer par2EntityPlayer, boolean par3)
|
|
|
|
{
|
|
|
|
float var4 = 1.0F;
|
|
|
|
float var5 = par2EntityPlayer.prevRotationPitch + (par2EntityPlayer.rotationPitch - par2EntityPlayer.prevRotationPitch) * var4;
|
|
|
|
float var6 = par2EntityPlayer.prevRotationYaw + (par2EntityPlayer.rotationYaw - par2EntityPlayer.prevRotationYaw) * var4;
|
|
|
|
double var7 = par2EntityPlayer.prevPosX + (par2EntityPlayer.posX - par2EntityPlayer.prevPosX) * (double)var4;
|
|
|
|
double var9 = par2EntityPlayer.prevPosY + (par2EntityPlayer.posY - par2EntityPlayer.prevPosY) * (double)var4 + 1.62D - (double)par2EntityPlayer.yOffset;
|
|
|
|
double var11 = par2EntityPlayer.prevPosZ + (par2EntityPlayer.posZ - par2EntityPlayer.prevPosZ) * (double)var4;
|
|
|
|
Vec3 var13 = par1World.getWorldVec3Pool().getVecFromPool(var7, var9, var11);
|
|
|
|
float var14 = MathHelper.cos(-var6 * 0.017453292F - (float)Math.PI);
|
|
|
|
float var15 = MathHelper.sin(-var6 * 0.017453292F - (float)Math.PI);
|
|
|
|
float var16 = -MathHelper.cos(-var5 * 0.017453292F);
|
|
|
|
float var17 = MathHelper.sin(-var5 * 0.017453292F);
|
|
|
|
float var18 = var15 * var16;
|
|
|
|
float var20 = var14 * var16;
|
|
|
|
double var21 = 5.0D;
|
|
|
|
if (par2EntityPlayer instanceof EntityPlayerMP)
|
|
|
|
{
|
|
|
|
var21 = 7;
|
|
|
|
}
|
|
|
|
Vec3 var23 = var13.addVector((double)var18 * var21, (double)var17 * var21, (double)var20 * var21);
|
|
|
|
return par1World.rayTraceBlocks_do_do(var13, var23, true, false);
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
private boolean teleportToEntity(ItemStack item, Entity par1Entity, EntityPlayer holder)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
|
|
|
Vec3 var2 = holder.worldObj.getWorldVec3Pool().getVecFromPool(holder.posX - par1Entity.posX, holder.boundingBox.minY + (double)(holder.height / 2.0F) - par1Entity.posY + (double)par1Entity.getEyeHeight(), holder.posZ - par1Entity.posZ);
|
|
|
|
|
|
|
|
double cooef =( var2.lengthVector()-2.5)/var2.lengthVector();
|
|
|
|
var2.xCoord*=cooef;
|
|
|
|
var2.yCoord*=cooef;
|
|
|
|
var2.zCoord*=cooef;
|
|
|
|
double var5 = holder.posX - var2.xCoord;
|
|
|
|
double var9 = holder.posZ - var2.zCoord;
|
|
|
|
double var7 =holder.worldObj.getHeightValue(MathHelper.floor_double(var5), MathHelper.floor_double(var9));
|
|
|
|
if((Math.abs((holder.posY - var2.yCoord)-var7)>2))
|
|
|
|
{
|
|
|
|
var7 = MathHelper.floor_double(holder.posY - var2.yCoord) ;
|
|
|
|
|
|
|
|
int var14 = MathHelper.floor_double(var5);
|
|
|
|
int var15 = MathHelper.floor_double(var7);
|
|
|
|
int var16 = MathHelper.floor_double(var9);
|
|
|
|
while(!holder.worldObj.isAirBlock(var14, var15, var16))
|
|
|
|
{
|
|
|
|
var15++;
|
|
|
|
}
|
|
|
|
var7=var15;
|
|
|
|
}
|
|
|
|
|
|
|
|
holder.setPositionAndUpdate(var5, var7, var9);
|
|
|
|
holder.playSound("mob.endermen.portal", 1.0F, 1.0F);
|
|
|
|
holder.worldObj.playSoundEffect(holder.posX, holder.posY, holder.posZ, "mob.endermen.portal", 1.0F, 1.0F);
|
2013-08-31 22:00:18 +02:00
|
|
|
|
2013-06-19 05:04:36 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* How long it takes to use or consume an item
|
|
|
|
*/
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
|
|
|
public int getMaxItemUseDuration(ItemStack par1ItemStack)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
|
|
|
return 72000;
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
|
|
|
public EnumAction getItemUseAction(ItemStack stack)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
|
|
|
return properties.RiftBladeRiftCreationEnabled ? EnumAction.bow : EnumAction.block;
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
|
|
|
public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemInUseCount)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
|
|
|
//Condition for disabling rift creation
|
|
|
|
if (!properties.RiftBladeRiftCreationEnabled)
|
|
|
|
return;
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
if (world.isRemote)
|
|
|
|
return;
|
|
|
|
|
|
|
|
Vec3 var2 = player.getLook(1.0F);
|
2013-06-19 05:04:36 +02:00
|
|
|
|
|
|
|
double cooef = -2;
|
2013-08-31 22:00:18 +02:00
|
|
|
var2.xCoord *= cooef;
|
|
|
|
var2.yCoord *= cooef;
|
|
|
|
var2.zCoord *= cooef;
|
|
|
|
double var5 = player.posX - var2.xCoord;
|
|
|
|
double var9 = player.posZ - var2.zCoord;
|
|
|
|
double var7 = player.posY - var2.yCoord + 2;
|
2013-06-19 05:04:36 +02:00
|
|
|
|
|
|
|
int x = MathHelper.floor_double(var5);
|
|
|
|
int y = MathHelper.floor_double(var7);
|
|
|
|
int z = MathHelper.floor_double(var9);
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
int orientation = (int) (MathHelper.floor_double((double) ((player.rotationYaw + 90) * 4.0F / 360.0F) + 0.5D) & 3);
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
//TODO: This looks weird. Shouldn't we aim to only create rifts on maxed-out usage time? i.e. "<= 0"
|
|
|
|
if (this.getMaxItemUseDuration(stack) - itemInUseCount > 12 &&
|
|
|
|
ItemDimensionalDoor.canPlace(world, x, y, z) && ItemDimensionalDoor.canPlace(world, x, y + 1, z))
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
NewDimData dimension = PocketManager.getDimensionData(world);
|
|
|
|
if (!dimension.isPocketDimension() && dimension.getLink(x, y + 1, z) == null)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-09-02 17:47:12 +02:00
|
|
|
dimension.createLink(x, y + 1, z, LinkTypes.POCKET);
|
2013-08-31 22:00:18 +02:00
|
|
|
player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1);
|
|
|
|
ItemDimensionalDoor.placeDoorBlock(world, x, y, z, orientation, mod_pocketDim.transientDoor);
|
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
@Override
|
|
|
|
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
if (!world.isRemote)
|
2013-02-18 03:46:16 +01:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
List<EntityLiving> list = (List<EntityLiving>) world.getEntitiesWithinAABB(EntityLiving.class, AxisAlignedBB.getBoundingBox(player.posX-8,player.posY-8, player.posZ-8, player.posX+8,player.posY+8, player.posZ+8));
|
|
|
|
list.remove(player);
|
2013-07-15 08:45:25 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
for (EntityLiving ent : list)
|
2013-03-10 05:04:20 +01:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
Vec3 var3 = player.getLook(1.0F).normalize();
|
|
|
|
Vec3 var4 = player.worldObj.getWorldVec3Pool().getVecFromPool(ent.posX - player.posX, ent.boundingBox.minY + (double)((ent.height) / 2.0F) - ( player.posY + (double) player.getEyeHeight()), ent.posZ - player.posZ);
|
2013-06-19 05:04:36 +02:00
|
|
|
double var5 = var4.lengthVector();
|
|
|
|
var4 = var4.normalize();
|
|
|
|
double var7 = var3.dotProduct(var4);
|
2013-08-31 22:00:18 +02:00
|
|
|
if( (var7+.1) > 1.0D - 0.025D / var5 ? player.canEntityBeSeen(ent) : false)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
((ItemRiftBlade) stack.getItem()).teleportToEntity(stack, ent, player);
|
|
|
|
return stack;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
2013-03-10 05:04:20 +01:00
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
MovingObjectPosition hit = this.getMovingObjectPositionFromPlayer(world, player, false);
|
|
|
|
if (hit != null)
|
|
|
|
{
|
|
|
|
if (world.getBlockId(hit.blockX, hit.blockY, hit.blockZ) == properties.RiftBlockID)
|
|
|
|
{
|
|
|
|
if (PocketManager.getLink(hit.blockX, hit.blockY, hit.blockZ, world) != null)
|
|
|
|
{
|
|
|
|
Block var11 = mod_pocketDim.transientDoor;
|
|
|
|
int par4 = hit.blockX;
|
|
|
|
int par5 = hit.blockY;
|
|
|
|
int par6 = hit.blockZ;
|
|
|
|
int par7 = 0;
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
if (player.canPlayerEdit(par4, par5, par6, par7, stack) && player.canPlayerEdit(par4, par5 + 1, par6, par7, stack)&&!world.isRemote)
|
|
|
|
{
|
|
|
|
int var12 = MathHelper.floor_double((double)((player.rotationYaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
|
|
|
|
|
|
|
|
if (BaseItemDoor.canPlace(world, par4, par5, par6) &&
|
|
|
|
BaseItemDoor.canPlace(world, par4, par5 - 1, par6))
|
|
|
|
{
|
|
|
|
ItemDimensionalDoor.placeDoorBlock(world, par4, par5 - 1, par6, var12, var11);
|
|
|
|
player.worldObj.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1);
|
|
|
|
stack.damageItem(10, player);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return stack;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//FIXME: Should this be inside or after this IF?
|
|
|
|
player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
|
2013-02-18 03:46:16 +01:00
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
return stack;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
2013-08-31 22:00:18 +02:00
|
|
|
|
|
|
|
@Override
|
2013-06-19 05:04:36 +02:00
|
|
|
public void registerIcons(IconRegister par1IconRegister)
|
|
|
|
{
|
|
|
|
this.itemIcon = par1IconRegister.registerIcon(mod_pocketDim.modid + ":" + this.getUnlocalizedName());
|
2013-08-31 22:00:18 +02:00
|
|
|
}
|
2013-06-19 05:04:36 +02:00
|
|
|
|
2013-08-31 22:00:18 +02:00
|
|
|
/**
|
|
|
|
* Return whether this item is repairable in an anvil.
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack)
|
|
|
|
{
|
|
|
|
//Don't include a call to super.getIsRepairable()!
|
|
|
|
//That would cause this sword to accept gold as a repair material (since we set material = Gold).
|
|
|
|
return mod_pocketDim.itemStableFabric.itemID == par2ItemStack.itemID ? true : false;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
2013-08-31 22:00:18 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y,
|
|
|
|
int z, int par7, float par8, float par9, float par10)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
if (BaseItemDoor.tryItemUse(mod_pocketDim.transientDoor, stack, player, world, x, y, z, par7, true, false))
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
world.playSoundAtEntity(player,"mods.DimDoors.sfx.riftDoor", 0.6f, 1);
|
|
|
|
return true;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
return false;
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* allows items to add custom lines of information to the mouseover description
|
|
|
|
*/
|
2013-08-31 22:00:18 +02:00
|
|
|
@SuppressWarnings({ "unchecked", "rawtypes" })
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4)
|
2013-06-19 05:04:36 +02:00
|
|
|
{
|
2013-08-31 22:00:18 +02:00
|
|
|
par3List.add("Opens a temporary door, has");
|
|
|
|
par3List.add("a special teleport attack,");
|
|
|
|
par3List.add("and rotates existing doors.");
|
2013-06-19 05:04:36 +02:00
|
|
|
}
|
2013-02-18 03:46:16 +01:00
|
|
|
}
|