From 74aa4b93a2519b67d96d5eb81681acaedee5bec6 Mon Sep 17 00:00:00 2001 From: Lizbeth Rika Date: Mon, 23 Feb 2015 16:18:36 +0000 Subject: [PATCH] Optimized spark code. --- .../common/core/helper/ItemNBTHelper.java | 9 ++ .../botania/common/entity/EntitySpark.java | 102 +++++++++++++----- 2 files changed, 82 insertions(+), 29 deletions(-) diff --git a/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java b/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java index 0db88650b..f2c7b7f8a 100644 --- a/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java +++ b/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java @@ -15,6 +15,7 @@ package vazkii.botania.common.core.helper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; public final class ItemNBTHelper { @@ -82,6 +83,10 @@ public final class ItemNBTHelper { public static void setString(ItemStack stack, String tag, String s) { getNBT(stack).setString(tag, s); } + + public static void setList(ItemStack stack, String tag, NBTTagList list) { + getNBT(stack).setTag(tag, list); + } // GETTERS /////////////////////////////////////////////////////////////////// @@ -126,5 +131,9 @@ public final class ItemNBTHelper { public static String getString(ItemStack stack, String tag, String defaultExpected) { return verifyExistance(stack, tag) ? getNBT(stack).getString(tag) : defaultExpected; } + + public static NBTTagList getList(ItemStack stack, String tag, int objtype, boolean nullifyOnFail) { + return (NBTTagList) (verifyExistance(stack, tag) ? getNBT(stack).getTagList(tag, objtype) : nullifyOnFail ? null : new NBTTagList()); + } } diff --git a/src/main/java/vazkii/botania/common/entity/EntitySpark.java b/src/main/java/vazkii/botania/common/entity/EntitySpark.java index 9c73c041b..5a461060c 100644 --- a/src/main/java/vazkii/botania/common/entity/EntitySpark.java +++ b/src/main/java/vazkii/botania/common/entity/EntitySpark.java @@ -21,17 +21,21 @@ import java.util.Map; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import scala.annotation.meta.setter; import vazkii.botania.api.mana.IManaItem; import vazkii.botania.api.mana.IManaPool; import vazkii.botania.api.mana.spark.ISparkAttachable; import vazkii.botania.api.mana.spark.ISparkEntity; import vazkii.botania.api.mana.spark.SparkHelper; import vazkii.botania.common.Botania; +import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.core.helper.Vector3; import vazkii.botania.common.item.ModItems; import baubles.common.lib.PlayerHandler; @@ -40,6 +44,10 @@ public class EntitySpark extends Entity implements ISparkEntity { private static final int TRANSFER_RATE = 1000; private static final String TAG_UPGRADE = "upgrade"; + + private static final String TAG_TRANSFERS = "tfs"; + private static final String TAG_TRANSFER_ID = "id"; + int removeTransferants = 2; boolean didStartupParticles = false; @@ -52,7 +60,7 @@ public class EntitySpark extends Entity implements ISparkEntity { protected void entityInit() { setSize(0.5F, 0.5F); dataWatcher.addObject(28, 0); - dataWatcher.addObject(29, ""); + dataWatcher.addObject(29, new ItemStack(Blocks.stone, 0, 0)); dataWatcher.setObjectWatched(28); dataWatcher.setObjectWatched(29); @@ -69,8 +77,13 @@ public class EntitySpark extends Entity implements ISparkEntity { return; } - List allSparks = SparkHelper.getSparksAround(worldObj, posX, posY, posZ); - if(worldObj.isRemote && !didStartupParticles) { + boolean first = worldObj.isRemote && !didStartupParticles; + int upgrade = getUpgrade(); + List allSparks = null; + if(first || upgrade == 2 || upgrade == 3) + allSparks = SparkHelper.getSparksAround(worldObj, posX, posY, posZ); + + if(first) { for(ISparkEntity spark : allSparks) particleBeam(this, (Entity) spark); @@ -79,7 +92,7 @@ public class EntitySpark extends Entity implements ISparkEntity { Collection transfers = getTransfers(); - int upgrade = getUpgrade(); + if(upgrade != 0) { switch(upgrade) { case 1 : { // Dispersive @@ -312,49 +325,72 @@ public class EntitySpark extends Entity implements ISparkEntity { @Override public Collection getTransfers() { Collection entities = new ArrayList(); - String transfers = dataWatcher.getWatchableObjectString(29); - String[] tokens = transfers.split(";"); - List removals = new ArrayList(); - - for(String s : tokens) { - if(s.isEmpty()) - continue; - - int id = Integer.parseInt(s); + ItemStack transferDataContainer = getTransferDataContainer(); + NBTTagList list = ItemNBTHelper.getList(transferDataContainer, TAG_TRANSFERS, 10, false); + NBTTagList newTransfers = new NBTTagList(); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound cmp = list.getCompoundTagAt(i); + int id = cmp.getInteger(TAG_TRANSFER_ID); + boolean added = false; Entity e = worldObj.getEntityByID(id); if(e != null && e instanceof ISparkEntity) { ISparkEntity spark = (ISparkEntity) e; - if(spark != this && !spark.areIncomingTransfersDone() && spark.getAttachedTile() != null && !spark.getAttachedTile().isFull() && (getUpgrade() == 0 && spark.getUpgrade() == 2 || getUpgrade() == 3 && (spark.getUpgrade() == 0 || spark.getUpgrade() == 1) || !(spark.getAttachedTile() instanceof IManaPool))) { + int upgr = getUpgrade(); + int supgr = spark.getUpgrade(); + ISparkAttachable atile = spark.getAttachedTile(); + + if(spark != this && !spark.areIncomingTransfersDone() && atile != null && !atile.isFull() && (upgr == 0 && supgr == 2 || upgr == 3 && (supgr == 0 || supgr == 1) || !(atile instanceof IManaPool))) { entities.add((ISparkEntity) e); added = true; } } - if(!added) - removals.add(s); - } - - if(!removals.isEmpty()) { - String newTranfers = ""; - for(String s : tokens) - if(!removals.contains(s)) - newTranfers = newTranfers + (newTranfers.isEmpty() ? "" : ";") + s; - dataWatcher.updateObject(29, newTranfers); - - removals.clear(); + if(added) { + NBTTagCompound cmp_ = new NBTTagCompound(); + cmp_.setInteger(TAG_TRANSFER_ID, id); + newTransfers.appendTag(cmp_); + + } } + ItemStack stack = transferDataContainer.copy(); + ItemNBTHelper.setList(stack, TAG_TRANSFERS, list); + setTransferDataContainer(stack); + return entities; } + + private boolean hasTransfer(ISparkEntity entity) { + ItemStack transferDataContainer = getTransferDataContainer(); + NBTTagList list = ItemNBTHelper.getList(transferDataContainer, TAG_TRANSFERS, 10, false); + NBTTagList newTransfers = new NBTTagList(); + int id = ((Entity) entity).getEntityId(); + + for(int i = 0; i < list.tagCount(); i++) { + NBTTagCompound cmp = list.getCompoundTagAt(i); + int tid = cmp.getInteger(TAG_TRANSFER_ID); + if(id == tid) + return true; + } + return false; + } @Override public void registerTransfer(ISparkEntity entity) { - if(worldObj.isRemote || getTransfers().contains(entity)) + if(worldObj.isRemote || hasTransfer(entity)) return; - String transfers = dataWatcher.getWatchableObjectString(29); - dataWatcher.updateObject(29, transfers + (transfers.isEmpty() ? "" : ";") + ((Entity) entity).getEntityId()); + ItemStack transferDataContainer = getTransferDataContainer(); + NBTTagList list = ItemNBTHelper.getList(transferDataContainer, TAG_TRANSFERS, 10, false); + NBTTagCompound cmp_ = new NBTTagCompound(); + cmp_.setInteger(TAG_TRANSFER_ID, ((Entity) entity).getEntityId()); + list.appendTag(cmp_); + + ItemStack stack = transferDataContainer.copy(); + ItemNBTHelper.setList(stack, TAG_TRANSFERS, list); + setTransferDataContainer(stack); } @Override @@ -366,6 +402,14 @@ public class EntitySpark extends Entity implements ISparkEntity { public void setUpgrade(int upgrade) { dataWatcher.updateObject(28, upgrade); } + + public ItemStack getTransferDataContainer() { + return dataWatcher.getWatchableObjectItemStack(29); + } + + public void setTransferDataContainer(ItemStack stack) { + dataWatcher.updateObject(29, stack); + } @Override public boolean areIncomingTransfersDone() {