Fix Sigil of Holding (#1081)

This commit is contained in:
Nicholas Ignoffo 2017-03-05 10:28:06 -08:00
parent 4e5bc46e21
commit f083e4e036
3 changed files with 58 additions and 83 deletions

View file

@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import javax.annotation.Nullable; import java.util.List;
public class HUDElementHolding extends HUDElement public class HUDElementHolding extends HUDElement
{ {
@ -43,16 +43,13 @@ public class HUDElementHolding extends HUDElement
ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 99 + (currentSlot * 20) + getXOffset(), resolution.getScaledHeight() - 23 + getYOffset(), 0, 22, 24, 24); ingameGui.drawTexturedModalRect(resolution.getScaledWidth() / 2 + 99 + (currentSlot * 20) + getXOffset(), resolution.getScaledHeight() - 23 + getYOffset(), 0, 22, 24, 24);
RenderHelper.enableGUIStandardItemLighting(); RenderHelper.enableGUIStandardItemLighting();
ItemStack[] holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding); List<ItemStack> holdingInv = ItemSigilHolding.getInternalInventory(sigilHolding);
int xOffset = 0; int xOffset = 0;
if (holdingInv != null)
{
for (ItemStack sigil : holdingInv) for (ItemStack sigil : holdingInv)
{ {
renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil); renderHotbarItem(resolution.getScaledWidth() / 2 + 103 + xOffset + getXOffset(), resolution.getScaledHeight() - 18 + getYOffset(), partialTicks, minecraft.player, sigil);
xOffset += 20; xOffset += 20;
} }
}
RenderHelper.disableStandardItemLighting(); RenderHelper.disableStandardItemLighting();
} }
@ -63,9 +60,9 @@ public class HUDElementHolding extends HUDElement
return true; return true;
} }
protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, @Nullable ItemStack stack) protected void renderHotbarItem(int x, int y, float partialTicks, EntityPlayer player, ItemStack stack)
{ {
if (stack != null) if (!stack.isEmpty())
{ {
float animation = (float) stack.getAnimationsToGo() - partialTicks; float animation = (float) stack.getAnimationsToGo() - partialTicks;

View file

@ -10,10 +10,7 @@ import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.ActionResult; import net.minecraft.util.*;
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.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -55,15 +52,11 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
@Override @Override
public String getHighlightTip(ItemStack stack, String displayName) public String getHighlightTip(ItemStack stack, String displayName)
{ {
ItemStack[] inv = getInternalInventory(stack); List<ItemStack> inv = getInternalInventory(stack);
if (inv == null)
return displayName;
int currentSlot = getCurrentItemOrdinal(stack); int currentSlot = getCurrentItemOrdinal(stack);
ItemStack item = inv[currentSlot]; ItemStack item = inv.get(currentSlot);
if (item == null) if (item.isEmpty())
return displayName; return displayName;
else else
return TextHelper.localizeEffect("item.bloodmagic.sigil.holding.display", displayName, item.getDisplayName()); return TextHelper.localizeEffect("item.bloodmagic.sigil.holding.display", displayName, item.getDisplayName());
@ -79,21 +72,18 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
if (!stack.hasTagCompound()) if (!stack.hasTagCompound())
return; return;
ItemStack[] inv = getInternalInventory(stack); List<ItemStack> inv = getInternalInventory(stack);
if (inv == null)
return;
int currentSlot = getCurrentItemOrdinal(stack); int currentSlot = getCurrentItemOrdinal(stack);
ItemStack item = inv[currentSlot]; ItemStack item = inv.get(currentSlot);
for (int i = 0; i < inventorySize; i++) for (int i = 0; i < inventorySize; i++)
{ {
if (inv[i] != null) ItemStack invStack = inv.get(i);
if (item != null && inv[i] == item) if (!invStack.isEmpty())
tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + inv[i].getDisplayName())); if (!item.isEmpty() && invStack == item)
tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, "&o&n" + invStack.getDisplayName()));
else else
tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, inv[i].getDisplayName())); tooltip.add(TextHelper.localizeEffect("tooltip.bloodmagic.sigil.holding.sigilInSlot", i + 1, invStack.getDisplayName()));
} }
} }
@ -105,14 +95,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
return EnumActionResult.FAIL; return EnumActionResult.FAIL;
int currentSlot = getCurrentItemOrdinal(stack); int currentSlot = getCurrentItemOrdinal(stack);
ItemStack[] inv = getInternalInventory(stack); List<ItemStack> inv = getInternalInventory(stack);
ItemStack itemUsing = inv.get(currentSlot);
if (inv == null) if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing)))
return EnumActionResult.PASS;
ItemStack itemUsing = inv[currentSlot];
if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing)))
return EnumActionResult.PASS; return EnumActionResult.PASS;
EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ); EnumActionResult result = itemUsing.getItem().onItemUse(player, world, pos, hand, facing, hitX, hitY, hitZ);
@ -129,14 +115,10 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
return ActionResult.newResult(EnumActionResult.FAIL, stack); return ActionResult.newResult(EnumActionResult.FAIL, stack);
int currentSlot = getCurrentItemOrdinal(stack); int currentSlot = getCurrentItemOrdinal(stack);
ItemStack[] inv = getInternalInventory(stack); List<ItemStack> inv = getInternalInventory(stack);
ItemStack itemUsing = inv.get(currentSlot);
if (inv == null) if (itemUsing.isEmpty() || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing)))
return ActionResult.newResult(EnumActionResult.PASS, stack);
ItemStack itemUsing = inv[currentSlot];
if (itemUsing == null || Strings.isNullOrEmpty(((IBindable) itemUsing.getItem()).getOwnerUUID(itemUsing)))
return ActionResult.newResult(EnumActionResult.PASS, stack); return ActionResult.newResult(EnumActionResult.PASS, stack);
itemUsing.getItem().onItemRightClick(world, player, hand); itemUsing.getItem().onItemRightClick(world, player, hand);
@ -146,7 +128,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
return ActionResult.newResult(EnumActionResult.PASS, stack); return ActionResult.newResult(EnumActionResult.PASS, stack);
} }
public void saveInventory(ItemStack itemStack, ItemStack[] inventory) public void saveInventory(ItemStack itemStack, List<ItemStack> inventory)
{ {
NBTTagCompound itemTag = itemStack.getTagCompound(); NBTTagCompound itemTag = itemStack.getTagCompound();
@ -159,11 +141,11 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
for (int i = 0; i < inventorySize; i++) for (int i = 0; i < inventorySize; i++)
{ {
if (inventory[i] != null) if (!inventory.get(i).isEmpty())
{ {
NBTTagCompound tag = new NBTTagCompound(); NBTTagCompound tag = new NBTTagCompound();
tag.setByte(Constants.NBT.SLOT, (byte) i); tag.setByte(Constants.NBT.SLOT, (byte) i);
inventory[i].writeToNBT(tag); inventory.get(i).writeToNBT(tag);
itemList.appendTag(tag); itemList.appendTag(tag);
} }
} }
@ -182,21 +164,17 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected) public void tickInternalInventory(ItemStack itemStack, World world, Entity entity, int itemSlot, boolean isSelected)
{ {
ItemStack[] inv = getInternalInventory(itemStack); List<ItemStack> inv = getInternalInventory(itemStack);
if (inv == null)
{
return;
}
for (int i = 0; i < inventorySize; i++) for (int i = 0; i < inventorySize; i++)
{ {
if (inv[i] == null) ItemStack stack = inv.get(i);
if (stack.isEmpty())
{ {
continue; continue;
} }
inv[i].getItem().onUpdate(inv[i], world, entity, itemSlot, isSelected); stack.getItem().onUpdate(stack, world, entity, itemSlot, isSelected);
} }
} }
@ -224,12 +202,12 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
return index; return index;
} }
private static void initModeTag(ItemStack itemStack) private static void initModeTag(ItemStack stack)
{ {
if (itemStack.getTagCompound() == null) if (!stack.hasTagCompound())
{ {
itemStack = NBTHelper.checkNBT(itemStack); stack = NBTHelper.checkNBT(stack);
itemStack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, inventorySize); stack.getTagCompound().setInteger(Constants.NBT.CURRENT_SIGIL, inventorySize);
} }
} }
@ -237,22 +215,22 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
{ {
if (itemStack.getItem() instanceof ItemSigilHolding) if (itemStack.getItem() instanceof ItemSigilHolding)
{ {
ItemStack[] itemStacks = getInternalInventory(itemStack); List<ItemStack> inv = getInternalInventory(itemStack);
if (itemStacks != null) if (inv != null)
return itemStacks[slot == 5 ? 4 : slot]; return inv.get(slot == 5 ? 4 : slot);
else else
return null; return ItemStack.EMPTY;
} }
return null; return ItemStack.EMPTY;
} }
public static int getCurrentItemOrdinal(ItemStack itemStack) public static int getCurrentItemOrdinal(ItemStack stack)
{ {
if (itemStack.getItem() instanceof ItemSigilHolding) if (stack.getItem() instanceof ItemSigilHolding)
{ {
initModeTag(itemStack); initModeTag(stack);
int currentSigil = itemStack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL); int currentSigil = stack.getTagCompound().getInteger(Constants.NBT.CURRENT_SIGIL);
currentSigil = MathHelper.clamp(currentSigil, 0, inventorySize - 1); currentSigil = MathHelper.clamp(currentSigil, 0, inventorySize - 1);
return currentSigil; return currentSigil;
} }
@ -260,33 +238,33 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
return 0; return 0;
} }
public static ItemStack[] getInternalInventory(ItemStack itemStack) public static List<ItemStack> getInternalInventory(ItemStack stack)
{ {
initModeTag(itemStack); initModeTag(stack);
NBTTagCompound tagCompound = itemStack.getTagCompound(); NBTTagCompound tagCompound = stack.getTagCompound();
if (tagCompound == null) if (tagCompound == null)
{ {
return null; return NonNullList.withSize(inventorySize, ItemStack.EMPTY);
} }
NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10); NBTTagList tagList = tagCompound.getTagList(Constants.NBT.ITEMS, 10);
if (tagList == null) if (tagList.hasNoTags())
{ {
return null; return NonNullList.withSize(inventorySize, ItemStack.EMPTY);
} }
ItemStack[] inv = new ItemStack[inventorySize]; List<ItemStack> inv = NonNullList.withSize(inventorySize, ItemStack.EMPTY);
for (int i = 0; i < tagList.tagCount(); i++) for (int i = 0; i < tagList.tagCount(); i++)
{ {
NBTTagCompound data = tagList.getCompoundTagAt(i); NBTTagCompound data = tagList.getCompoundTagAt(i);
byte j = data.getByte(Constants.NBT.SLOT); byte j = data.getByte(Constants.NBT.SLOT);
if (j >= 0 && j < inv.length) if (j >= 0 && j < inv.size())
{ {
inv[j] = new ItemStack(data); inv.set(j, new ItemStack(data));
} }
} }
@ -304,14 +282,14 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
{ {
int currentIndex = getCurrentItemOrdinal(itemStack); int currentIndex = getCurrentItemOrdinal(itemStack);
ItemStack currentItemStack = getItemStackInSlot(itemStack, currentIndex); ItemStack currentItemStack = getItemStackInSlot(itemStack, currentIndex);
if (currentItemStack == null) if (currentItemStack.isEmpty())
return; return;
if (mode < 0) if (mode < 0)
{ {
index = next(currentIndex); index = next(currentIndex);
currentItemStack = getItemStackInSlot(itemStack, index); currentItemStack = getItemStackInSlot(itemStack, index);
while (currentItemStack == null) while (currentItemStack.isEmpty())
{ {
index = next(index); index = next(index);
currentItemStack = getItemStackInSlot(itemStack, index); currentItemStack = getItemStackInSlot(itemStack, index);
@ -321,7 +299,7 @@ public class ItemSigilHolding extends ItemSigilBase implements IKeybindable, IAl
index = prev(currentIndex); index = prev(currentIndex);
currentItemStack = getItemStackInSlot(itemStack, index); currentItemStack = getItemStackInSlot(itemStack, index);
while (currentItemStack == null) while (currentItemStack.isEmpty())
{ {
index = prev(index); index = prev(index);
currentItemStack = getItemStackInSlot(itemStack, index); currentItemStack = getItemStackInSlot(itemStack, index);

View file

@ -21,6 +21,7 @@ import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.event.MouseEvent; import net.minecraftforge.client.event.MouseEvent;
@ -298,8 +299,7 @@ public class ClientHandler
ItemSigilHolding.cycleToNextSigil(stack, mode); ItemSigilHolding.cycleToNextSigil(stack, mode);
BloodMagicPacketHandler.INSTANCE.sendToServer(new SigilHoldingPacketProcessor(player.inventory.currentItem, mode)); BloodMagicPacketHandler.INSTANCE.sendToServer(new SigilHoldingPacketProcessor(player.inventory.currentItem, mode));
ItemStack newStack = ItemSigilHolding.getItemStackInSlot(stack, ItemSigilHolding.getCurrentItemOrdinal(stack)); ItemStack newStack = ItemSigilHolding.getItemStackInSlot(stack, ItemSigilHolding.getCurrentItemOrdinal(stack));
if (!newStack.isEmpty()) player.sendStatusMessage(newStack.isEmpty() ? new TextComponentString("") : newStack.getTextComponent(), true);
player.sendStatusMessage(newStack.getTextComponent(), true);
} }
private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) private static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir)