Skip to content

Commit

Permalink
Fix things according to some log samples from BTM Moon
Browse files Browse the repository at this point in the history
* WorldClient.world sometimes is not ready when client receives packets.
  Now includes null safety check. Discard data when `world == null`.
* Replace NBT manipulation hack with custom `IElectricItemManager`.
  Inspired by IC2's debug tool.
  • Loading branch information
3TUSK committed Nov 17, 2017
1 parent 64494df commit 2297739
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 34 deletions.
87 changes: 54 additions & 33 deletions src/main/java/frogcraftrebirth/common/item/ItemDecayBattery.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,57 +25,33 @@
import java.util.List;

import frogcraftrebirth.common.lib.item.ItemFrogCraft;
import ic2.api.item.IElectricItem;
import ic2.api.item.IElectricItemManager;
import ic2.api.item.ISpecialElectricItem;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ItemDecayBattery extends ItemFrogCraft implements IElectricItem {

public class ItemDecayBattery extends ItemFrogCraft implements ISpecialElectricItem {

private static final IElectricItemManager DECAY_BATTERY_ELECTRIC_MANAGER = new DecayBatteryElectricManager();

public ItemDecayBattery(String name) {
super(false);
setMaxDamage(0);
setMaxStackSize(1);
setNoRepair();
setUnlocalizedName(name + "Battery.name");
}

@Override
public boolean canProvideEnergy(ItemStack itemStack) {
setCharge(itemStack);
return true;
}

@Override
public double getMaxCharge(ItemStack itemStack) {
setCharge(itemStack);
return 1;
}

@Override
public int getTier(ItemStack itemStack) {
setCharge(itemStack);
return 1;
}

@Override
public double getTransferLimit(ItemStack itemStack) {
setCharge(itemStack);
return 1;
}

private void setCharge(ItemStack stack) {
if (stack.hasTagCompound())
stack.getTagCompound().setInteger("charge", 1);
else {
stack.setTagCompound(new net.minecraft.nbt.NBTTagCompound());
stack.getTagCompound().setInteger("charge", 1);
}
public IElectricItemManager getManager(ItemStack itemStack) {
return DECAY_BATTERY_ELECTRIC_MANAGER; // BTM Moon: read & write NBT is expensive
}

@Override
Expand All @@ -92,4 +68,49 @@ public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> list) {
}
}

private static final class DecayBatteryElectricManager implements IElectricItemManager {
@Override
public double charge(ItemStack itemStack, double v, int i, boolean b, boolean b1) {
return 0.0;
}

@Override
public double discharge(ItemStack itemStack, double v, int i, boolean b, boolean b1, boolean b2) {
return 1.0;
}

@Override
public double getCharge(ItemStack itemStack) {
return 1.0;
}

@Override
public double getMaxCharge(ItemStack itemStack) {
return 1.0;
}

@Override
public boolean canUse(ItemStack itemStack, double v) {
return true;
}

@Override
public boolean use(ItemStack itemStack, double v, EntityLivingBase entityLivingBase) {
return true;
}

@Override
public void chargeFromArmor(ItemStack itemStack, EntityLivingBase entityLivingBase) {}

@Override //Side note: there is no need to translate - EU is the symbol of IC2 electricity unit
public String getToolTip(ItemStack itemStack) {
return "1 /1 EU";
}

@Override
public int getTier(ItemStack itemStack) {
return 1;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import frogcraftrebirth.common.lib.tile.TileFrog;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.relauncher.Side;
Expand Down Expand Up @@ -56,7 +57,12 @@ public void writeData(DataOutputStream output) throws IOException {
@Override
public void readData(DataInputStream input) throws IOException {
BlockPos aPos = new BlockPos(input.readInt(), input.readInt(), input.readInt());
TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(aPos);
WorldClient world = Minecraft.getMinecraft().world;
if (world == null) {
return; // BTM Moon: you will understand that this is possible during joining server
}

TileEntity tile = world.getTileEntity(aPos);

if (tile instanceof IFrogNetworkObject)
((IFrogNetworkObject) tile).readPacketData(input);
Expand Down

0 comments on commit 2297739

Please sign in to comment.