diff --git a/src/main/java/api/hbm/energymk2/IBatteryItem.java b/src/main/java/api/hbm/energymk2/IBatteryItem.java index d0d5931b7..a8983f984 100644 --- a/src/main/java/api/hbm/energymk2/IBatteryItem.java +++ b/src/main/java/api/hbm/energymk2/IBatteryItem.java @@ -11,8 +11,8 @@ public interface IBatteryItem { public void dischargeBattery(ItemStack stack, long i); public long getCharge(ItemStack stack); public long getMaxCharge(ItemStack stack); - public long getChargeRate(); - public long getDischargeRate(); + public long getChargeRate(ItemStack stack); + public long getDischargeRate(ItemStack stack); /** Returns a string for the NBT tag name of the long storing power */ public default String getChargeTagName() { diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index e8c8cf09b..50f74215c 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -43,7 +43,7 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { if(te instanceof IEnergyReceiverMK2 && te != this) { IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; - if(rec.canConnect(dir.getOpposite())) { + if(rec.canConnect(dir.getOpposite()) && rec.allowDirectProvision()) { long provides = Math.min(this.getPower(), this.getProviderSpeed()); long receives = Math.min(rec.getMaxPower() - rec.getPower(), rec.getReceiverSpeed()); long toTransfer = Math.min(provides, receives); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 8978d64d4..466b8b277 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -31,6 +31,9 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { public default long getReceiverSpeed() { return this.getMaxPower(); } + + /** Whether a provider can provide power by touching the block (i.e. via proxies), bypassing the need for a network entirely */ + public default boolean allowDirectProvision() { return true; } public default void trySubscribe(World world, DirPos pos) { trySubscribe(world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 34e8205f6..768ad9a28 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -78,7 +78,7 @@ public class PowerNetMK2 extends NodeNet entry : list) { double weight = (double) entry.getValue() / (double) (priorityDemand); - long toSend = (long) Math.max(toTransfer * weight, 0D); + long toSend = (long) Math.min(Math.max(toTransfer * weight, 0D), entry.getValue()); energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index a84634f56..a4c4381be 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -740,16 +740,16 @@ public class ModBlocks { public static Block machine_electric_furnace_off; public static Block machine_electric_furnace_on; - public static Block machine_microwave; - public static Block machine_battery_potato; - public static Block machine_battery; - public static Block machine_lithium_battery; - public static Block machine_schrabidium_battery; - public static Block machine_dineutronium_battery; + public static Block machine_battery_socket; + + @Deprecated public static Block machine_battery_potato; + @Deprecated public static Block machine_battery; + @Deprecated public static Block machine_lithium_battery; + @Deprecated public static Block machine_schrabidium_battery; + @Deprecated public static Block machine_dineutronium_battery; public static Block machine_fensu; - public static final int guiID_machine_fensu = 99; public static Block capacitor_bus; public static Block capacitor_copper; @@ -1862,6 +1862,7 @@ public class ModBlocks { machine_arc_furnace = new MachineArcFurnaceLarge().setBlockName("machine_arc_furnace").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_microwave = new MachineMicrowave(Material.iron).setBlockName("machine_microwave").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":machine_microwave"); + machine_battery_socket = new MachineBatterySocket().setBlockName("machine_battery_socket").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_battery_potato = new MachineBattery(Material.iron, 10_000).setBlockName("machine_battery_potato").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_battery = new MachineBattery(Material.iron, 1_000_000).setBlockName("machine_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_lithium_battery = new MachineBattery(Material.iron, 50_000_000).setBlockName("machine_lithium_battery").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3259,6 +3260,7 @@ public class ModBlocks { register(barrel_steel); register(barrel_tcalloy); register(barrel_antimatter); + register(machine_battery_socket); register(machine_battery_potato); register(machine_battery); register(machine_lithium_battery); diff --git a/src/main/java/com/hbm/blocks/network/MachineBatterySocket.java b/src/main/java/com/hbm/blocks/network/MachineBatterySocket.java new file mode 100644 index 000000000..a1030cd99 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/MachineBatterySocket.java @@ -0,0 +1,51 @@ +package com.hbm.blocks.network; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.TileEntityProxyCombo; +import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class MachineBatterySocket extends BlockDummyable implements ITooltipProvider { + + public MachineBatterySocket() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityBatterySocket(); + if(meta >= 6) return new TileEntityProxyCombo().inventory().power().conductor(); + return null; + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + return standardOpenBehavior(world, x, y, z, player, side); + } + + @Override public int[] getDimensions() { return new int[] {1, 0, 1, 0, 1, 0}; } + @Override public int getOffset() { return 0; } + + protected void fillSpace(World world, int x, int y, int z, ForgeDirection dir, int o) { + super.fillSpace(world, x, y, z, dir, o); + + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + this.makeExtra(world, x - dir.offsetX, y, z - dir.offsetZ); + this.makeExtra(world, x + rot.offsetX, y, z + rot.offsetZ); + this.makeExtra(world, x - dir.offsetX + rot.offsetX, y, z - dir.offsetZ + rot.offsetZ); + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + addStandardInfo(stack, player, list, ext); + } +} diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java b/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java index 5e6847d61..cafb1a6a5 100644 --- a/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java +++ b/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java @@ -52,7 +52,7 @@ public abstract class EntityRailCarElectric extends EntityRailCarRidable { if(stack != null && stack.getItem() instanceof IBatteryItem) { IBatteryItem battery = (IBatteryItem) stack.getItem(); int powerNeeded = this.getMaxPower() - this.getPower(); - long powerProvided = Math.min(battery.getDischargeRate(), battery.getCharge(stack)); + long powerProvided = Math.min(battery.getDischargeRate(stack), battery.getCharge(stack)); int powerTransfered = (int) Math.min(powerNeeded, powerProvided); if(powerTransfered > 0) { diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java b/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java index fd1926d2a..7301e3721 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java @@ -421,7 +421,6 @@ public class ExplosionNukeGeneric { public static void emp(World world, int x, int y, int z) { if (!world.isRemote) { - Block b = world.getBlock(x,y,z); TileEntity te = world.getTileEntity(x, y, z); if (te != null && te instanceof IEnergyHandlerMK2) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerBatterySocket.java b/src/main/java/com/hbm/inventory/container/ContainerBatterySocket.java new file mode 100644 index 000000000..72ea18661 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerBatterySocket.java @@ -0,0 +1,61 @@ +package com.hbm.inventory.container; + +import com.hbm.inventory.SlotNonRetarded; +import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerBatterySocket extends Container { + + protected TileEntityBatterySocket socket; + + public ContainerBatterySocket(InventoryPlayer invPlayer, TileEntityBatterySocket tedf) { + this.socket = tedf; + + this.addSlotToContainer(new SlotNonRetarded(socket, 0, 35, 35)); + + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { + this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 99 + i * 18)); + } + } + + for(int i = 0; i < 9; i++) { + this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 157)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return socket.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack copy = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if(slot != null && slot.getHasStack()) { + ItemStack stack = slot.getStack(); + copy = stack.copy(); + + if(index == 0) { + if(!this.mergeItemStack(stack, 1, this.inventorySlots.size(), true)) return null; + } else { + if(!this.mergeItemStack(stack, 0, 1, false)) return null; + } + + if(stack.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + + return copy; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUIBatterySocket.java b/src/main/java/com/hbm/inventory/gui/GUIBatterySocket.java new file mode 100644 index 000000000..f9e0f5585 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/GUIBatterySocket.java @@ -0,0 +1,110 @@ +package com.hbm.inventory.gui; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.inventory.container.ContainerBatterySocket; +import com.hbm.lib.RefStrings; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; +import com.hbm.util.BobMathUtil; +import com.hbm.util.i18n.I18nUtil; + +import api.hbm.energymk2.IBatteryItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class GUIBatterySocket extends GuiInfoContainer { + + private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/storage/gui_battery_socket.png"); + private TileEntityBatterySocket battery; + + public GUIBatterySocket(InventoryPlayer invPlayer, TileEntityBatterySocket tedf) { + super(new ContainerBatterySocket(invPlayer, tedf)); + battery = tedf; + + this.xSize = 176; + this.ySize = 181; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float f) { + super.drawScreen(mouseX, mouseY, f); + + if(battery.slots[0] != null && battery.slots[0].getItem() instanceof IBatteryItem) { + //this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 62, guiTop + 69 - 52, 52, 52, battery.power, battery.getMaxPower()); + + IBatteryItem item = (IBatteryItem) battery.slots[0].getItem(); + + String deltaText = BobMathUtil.getShortNumber(Math.abs(battery.delta)) + "HE/s"; + + if(battery.delta > 0) deltaText = EnumChatFormatting.GREEN + "+" + deltaText; + else if(battery.delta < 0) deltaText = EnumChatFormatting.RED + "-" + deltaText; + else deltaText = EnumChatFormatting.YELLOW + "+" + deltaText; + + String[] info = { BobMathUtil.getShortNumber(item.getCharge(battery.slots[0])) + "/" + BobMathUtil.getShortNumber(item.getMaxCharge(battery.slots[0])) + "HE", deltaText }; + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 62, guiTop + 69 - 52, 34, 52, mouseX, mouseY, info); + } + + String lang = null; + switch(battery.priority) { + case LOW: lang = "low"; break; + case HIGH: lang = "high"; break; + default: lang = "normal"; break; + } + + List priority = new ArrayList(); + priority.add(I18nUtil.resolveKey("battery.priority." + lang)); + priority.add(I18nUtil.resolveKey("battery.priority.recommended")); + String[] desc = I18nUtil.resolveKeyArray("battery.priority." + lang + ".desc"); + for(String s : desc) priority.add(s); + + this.drawCustomInfoStat(mouseX, mouseY, guiLeft + 152, guiTop + 35, 16, 16, mouseX, mouseY, priority); + } + + protected void mouseClicked(int x, int y, int i) { + super.mouseClicked(x, y, i); + + NBTTagCompound data = new NBTTagCompound(); + + if(this.checkClick(x, y, 106, 16, 18, 18)) { this.click(); data.setBoolean("low", true); } + if(this.checkClick(x, y, 106, 52, 18, 18)) { this.click(); data.setBoolean("high", true); } + if(this.checkClick(x, y, 125, 35, 16, 16)) { this.click(); data.setBoolean("priority", true); } + + if(!data.hasNoTags()) PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, battery.xCoord, battery.yCoord, battery.zCoord)); + } + + @Override + protected void drawGuiContainerForegroundLayer(int i, int j) { + String name = this.battery.hasCustomInventoryName() ? this.battery.getInventoryName() : I18n.format(this.battery.getInventoryName()); + this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + Minecraft.getMinecraft().getTextureManager().bindTexture(texture); + drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + if(battery.slots[0] != null && battery.slots[0].getItem() instanceof IBatteryItem) { + IBatteryItem item = (IBatteryItem) battery.slots[0].getItem(); + long power = item.getCharge(battery.slots[0]); + long maxPower = item.getMaxCharge(battery.slots[0]); + int p = (int) (power * 52 / maxPower); // won't work then flying too close to the sun (the limits of the LONG data type) + drawTexturedModalRect(guiLeft + 62, guiTop + 69 - p, 176, 52 - p, 34, p); + } + + drawTexturedModalRect(guiLeft + 106, guiTop + 16, 176, 52 + battery.redLow * 18, 18, 18); + drawTexturedModalRect(guiLeft + 106, guiTop + 52, 176, 52 + battery.redHigh * 18, 18, 18); + drawTexturedModalRect(guiLeft + 125, guiTop + 35, 194, 52 + battery.priority.ordinal() * 16 - 16, 16, 16); + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index c2893c0e5..06dfd4ad2 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1627,33 +1627,34 @@ public class ModItems { public static Item custom_schrab; public static Item custom_fall; - public static Item battery_generic; - public static Item battery_advanced; - public static Item battery_lithium; - public static Item battery_schrabidium; - public static Item battery_spark; - public static Item battery_trixite; + @Deprecated public static Item battery_generic; + @Deprecated public static Item battery_advanced; + @Deprecated public static Item battery_lithium; + @Deprecated public static Item battery_schrabidium; + @Deprecated public static Item battery_spark; + @Deprecated public static Item battery_trixite; + @Deprecated public static Item battery_red_cell; + @Deprecated public static Item battery_red_cell_6; + @Deprecated public static Item battery_red_cell_24; + @Deprecated public static Item battery_advanced_cell; + @Deprecated public static Item battery_advanced_cell_4; + @Deprecated public static Item battery_advanced_cell_12; + @Deprecated public static Item battery_lithium_cell; + @Deprecated public static Item battery_lithium_cell_3; + @Deprecated public static Item battery_lithium_cell_6; + @Deprecated public static Item battery_schrabidium_cell; + @Deprecated public static Item battery_schrabidium_cell_2; + @Deprecated public static Item battery_schrabidium_cell_4; + @Deprecated public static Item battery_spark_cell_6; + @Deprecated public static Item battery_spark_cell_25; + @Deprecated public static Item battery_spark_cell_100; + @Deprecated public static Item battery_spark_cell_1000; + @Deprecated public static Item battery_spark_cell_2500; + @Deprecated public static Item battery_spark_cell_10000; + @Deprecated public static Item battery_spark_cell_power; + + public static Item battery_pack; public static Item battery_creative; - - public static Item battery_red_cell; - public static Item battery_red_cell_6; - public static Item battery_red_cell_24; - public static Item battery_advanced_cell; - public static Item battery_advanced_cell_4; - public static Item battery_advanced_cell_12; - public static Item battery_lithium_cell; - public static Item battery_lithium_cell_3; - public static Item battery_lithium_cell_6; - public static Item battery_schrabidium_cell; - public static Item battery_schrabidium_cell_2; - public static Item battery_schrabidium_cell_4; - public static Item battery_spark_cell_6; - public static Item battery_spark_cell_25; - public static Item battery_spark_cell_100; - public static Item battery_spark_cell_1000; - public static Item battery_spark_cell_2500; - public static Item battery_spark_cell_10000; - public static Item battery_spark_cell_power; public static Item cube_power; public static Item battery_sc_uranium; @@ -3868,33 +3869,34 @@ public class ModItems { custom_schrab = new ItemCustomLore().setUnlocalizedName("custom_schrab").setMaxStackSize(1).setCreativeTab(MainRegistry.nukeTab).setTextureName(RefStrings.MODID + ":custom_schrab"); custom_fall = new ItemCustomLore().setUnlocalizedName("custom_fall").setMaxStackSize(1).setCreativeTab(MainRegistry.nukeTab).setTextureName(RefStrings.MODID + ":custom_fall"); - battery_generic = new ItemBattery(5000, 100, 100).setUnlocalizedName("battery_generic").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_generic_new"); - battery_advanced = new ItemBattery(20000, 500, 500).setUnlocalizedName("battery_advanced").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_advanced_new"); - battery_lithium = new ItemBattery(250000, 1000, 1000).setUnlocalizedName("battery_lithium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_lithium"); - battery_schrabidium = new ItemBattery(1000000, 5000, 5000).setUnlocalizedName("battery_schrabidium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_schrabidium_new"); - battery_spark = new ItemBattery(100000000, 2000000, 2000000).setUnlocalizedName("battery_spark").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark"); - battery_trixite = new ItemBattery(5000000, 40000, 200000).setUnlocalizedName("battery_trixite").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_trixite"); + battery_generic = new ItemBattery(5000, 100, 100).setUnlocalizedName("battery_generic").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_generic_new"); + battery_advanced = new ItemBattery(20000, 500, 500).setUnlocalizedName("battery_advanced").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_advanced_new"); + battery_lithium = new ItemBattery(250000, 1000, 1000).setUnlocalizedName("battery_lithium").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_lithium"); + battery_schrabidium = new ItemBattery(1000000, 5000, 5000).setUnlocalizedName("battery_schrabidium").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_schrabidium_new"); + battery_spark = new ItemBattery(100000000, 2000000, 2000000).setUnlocalizedName("battery_spark").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark"); + battery_trixite = new ItemBattery(5000000, 40000, 200000).setUnlocalizedName("battery_trixite").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_trixite"); + battery_red_cell = new ItemBattery(15000, 100, 100).setUnlocalizedName("battery_red_cell").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_red_cell"); + battery_red_cell_6 = new ItemBattery(15000 * 6, 100, 100).setUnlocalizedName("battery_red_cell_6").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_red_cell_6"); + battery_red_cell_24 = new ItemBattery(15000 * 24, 100, 100).setUnlocalizedName("battery_red_cell_24").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_red_cell_24"); + battery_advanced_cell = new ItemBattery(60000, 500, 500).setUnlocalizedName("battery_advanced_cell").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_advanced_cell"); + battery_advanced_cell_4 = new ItemBattery(60000 * 4, 500, 500).setUnlocalizedName("battery_advanced_cell_4").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_advanced_cell_4"); + battery_advanced_cell_12 = new ItemBattery(60000 * 12, 500, 500).setUnlocalizedName("battery_advanced_cell_12").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_advanced_cell_12"); + battery_lithium_cell = new ItemBattery(750000, 1000, 1000).setUnlocalizedName("battery_lithium_cell").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_lithium_cell"); + battery_lithium_cell_3 = new ItemBattery(750000 * 3, 1000, 1000).setUnlocalizedName("battery_lithium_cell_3").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_lithium_cell_3"); + battery_lithium_cell_6 = new ItemBattery(750000 * 6, 1000, 1000).setUnlocalizedName("battery_lithium_cell_6").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_lithium_cell_6"); + battery_schrabidium_cell = new ItemBattery(3000000, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell"); + battery_schrabidium_cell_2 = new ItemBattery(3000000 * 2, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell_2").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell_2"); + battery_schrabidium_cell_4 = new ItemBattery(3000000 * 4, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell_4").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell_4"); + battery_spark_cell_6 = new ItemBattery(100000000L * 6L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_6").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_6"); + battery_spark_cell_25 = new ItemBattery(100000000L * 25L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_25").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_25"); + battery_spark_cell_100 = new ItemBattery(100000000L * 100L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_100").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_100"); + battery_spark_cell_1000 = new ItemBattery(100000000L * 1000L, 20000000, 20000000).setUnlocalizedName("battery_spark_cell_1000").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_1000"); + battery_spark_cell_2500 = new ItemBattery(100000000L * 2500L, 20000000, 20000000).setUnlocalizedName("battery_spark_cell_2500").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_2500"); + battery_spark_cell_10000 = new ItemBattery(100000000L * 10000L, 200000000, 200000000).setUnlocalizedName("battery_spark_cell_10000").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_10000"); + battery_spark_cell_power = new ItemBattery(100000000L * 1000000L, 200000000, 200000000).setUnlocalizedName("battery_spark_cell_power").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":battery_spark_cell_power"); + + battery_pack = new ItemBatteryPack().setUnlocalizedName("battery_pack").setTextureName(RefStrings.MODID + ":battery_generic_new"); battery_creative = new Item().setUnlocalizedName("battery_creative").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_creative_new"); - - battery_red_cell = new ItemBattery(15000, 100, 100).setUnlocalizedName("battery_red_cell").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_red_cell"); - battery_red_cell_6 = new ItemBattery(15000 * 6, 100, 100).setUnlocalizedName("battery_red_cell_6").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_red_cell_6"); - battery_red_cell_24 = new ItemBattery(15000 * 24, 100, 100).setUnlocalizedName("battery_red_cell_24").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_red_cell_24"); - battery_advanced_cell = new ItemBattery(60000, 500, 500).setUnlocalizedName("battery_advanced_cell").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_advanced_cell"); - battery_advanced_cell_4 = new ItemBattery(60000 * 4, 500, 500).setUnlocalizedName("battery_advanced_cell_4").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_advanced_cell_4"); - battery_advanced_cell_12 = new ItemBattery(60000 * 12, 500, 500).setUnlocalizedName("battery_advanced_cell_12").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_advanced_cell_12"); - battery_lithium_cell = new ItemBattery(750000, 1000, 1000).setUnlocalizedName("battery_lithium_cell").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_lithium_cell"); - battery_lithium_cell_3 = new ItemBattery(750000 * 3, 1000, 1000).setUnlocalizedName("battery_lithium_cell_3").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_lithium_cell_3"); - battery_lithium_cell_6 = new ItemBattery(750000 * 6, 1000, 1000).setUnlocalizedName("battery_lithium_cell_6").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_lithium_cell_6"); - battery_schrabidium_cell = new ItemBattery(3000000, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell"); - battery_schrabidium_cell_2 = new ItemBattery(3000000 * 2, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell_2").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell_2"); - battery_schrabidium_cell_4 = new ItemBattery(3000000 * 4, 5000, 5000).setUnlocalizedName("battery_schrabidium_cell_4").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_schrabidium_cell_4"); - battery_spark_cell_6 = new ItemBattery(100000000L * 6L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_6").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_6"); - battery_spark_cell_25 = new ItemBattery(100000000L * 25L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_25").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_25"); - battery_spark_cell_100 = new ItemBattery(100000000L * 100L, 2000000, 2000000).setUnlocalizedName("battery_spark_cell_100").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_100"); - battery_spark_cell_1000 = new ItemBattery(100000000L * 1000L, 20000000, 20000000).setUnlocalizedName("battery_spark_cell_1000").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_1000"); - battery_spark_cell_2500 = new ItemBattery(100000000L * 2500L, 20000000, 20000000).setUnlocalizedName("battery_spark_cell_2500").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_2500"); - battery_spark_cell_10000 = new ItemBattery(100000000L * 10000L, 200000000, 200000000).setUnlocalizedName("battery_spark_cell_10000").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_10000"); - battery_spark_cell_power = new ItemBattery(100000000L * 1000000L, 200000000, 200000000).setUnlocalizedName("battery_spark_cell_power").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_spark_cell_power"); cube_power = new ItemBattery(1000000000000000000L, 1000000000000000L, 1000000000000000L).setUnlocalizedName("cube_power").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":cube_power"); battery_sc_uranium = new ItemSelfcharger(5).setUnlocalizedName("battery_sc_uranium").setMaxStackSize(1).setCreativeTab(MainRegistry.controlTab).setTextureName(RefStrings.MODID + ":battery_sc_uranium"); @@ -5700,8 +5702,11 @@ public class ModItems { GameRegistry.registerItem(battery_spark_cell_2500, battery_spark_cell_2500.getUnlocalizedName()); GameRegistry.registerItem(battery_spark_cell_10000, battery_spark_cell_10000.getUnlocalizedName()); GameRegistry.registerItem(battery_spark_cell_power, battery_spark_cell_power.getUnlocalizedName()); - GameRegistry.registerItem(cube_power, cube_power.getUnlocalizedName()); + + GameRegistry.registerItem(battery_pack, battery_pack.getUnlocalizedName()); GameRegistry.registerItem(battery_creative, battery_creative.getUnlocalizedName()); + GameRegistry.registerItem(cube_power, cube_power.getUnlocalizedName()); + GameRegistry.registerItem(battery_potato, battery_potato.getUnlocalizedName()); GameRegistry.registerItem(battery_potatos, battery_potatos.getUnlocalizedName()); GameRegistry.registerItem(battery_sc_uranium, battery_sc_uranium.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java index d5368b5f3..bfc6ba444 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java @@ -117,12 +117,12 @@ public class ArmorFSBPowered extends ArmorFSB implements IBatteryItem { } @Override - public long getChargeRate() { + public long getChargeRate(ItemStack stack) { return chargeRate; } @Override - public long getDischargeRate() { + public long getDischargeRate(ItemStack stack) { return 0; } diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index fe31ec3b9..fa9fa8cb8 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -111,12 +111,12 @@ public class ItemBattery extends Item implements IBatteryItem { } @Override - public long getChargeRate() { + public long getChargeRate(ItemStack stack) { return chargeRate; } @Override - public long getDischargeRate() { + public long getDischargeRate(ItemStack stack) { return dischargeRate; } diff --git a/src/main/java/com/hbm/items/machine/ItemBatteryPack.java b/src/main/java/com/hbm/items/machine/ItemBatteryPack.java new file mode 100644 index 000000000..ba4f95f75 --- /dev/null +++ b/src/main/java/com/hbm/items/machine/ItemBatteryPack.java @@ -0,0 +1,158 @@ +package com.hbm.items.machine; + +import java.util.List; + +import com.hbm.interfaces.IOrderedEnum; +import com.hbm.items.ItemEnumMulti; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.util.BobMathUtil; +import com.hbm.util.EnumUtil; + +import api.hbm.energymk2.IBatteryItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; + +public class ItemBatteryPack extends ItemEnumMulti implements IBatteryItem { + + public ItemBatteryPack() { + super(EnumBatteryPack.class, true, false); + this.setMaxStackSize(1); + this.setCreativeTab(MainRegistry.controlTab); + } + + public static enum EnumBatteryPack { + REDSTONE ("battery_redstone", 100L), + LEAD ("battery_lead", 1_000L), + LITHIUM ("battery_lithium", 10_000L), + SODIUM ("battery_sodium", 50_000L), + SCHRABIDIUM ("battery_schrabidium", 250_000L), + QUANTUM ("battery_quantum", 1_000_000L); + + public ResourceLocation texture; + public long capacity; + public long chargeRate; + public long dischargeRate; + + private EnumBatteryPack(String tex, long dischargeRate) { + this(tex, dischargeRate * 20 * 60 * 15, dischargeRate * 10, dischargeRate); + } + + private EnumBatteryPack(String tex, long capacity, long chargeRate, long dischargeRate) { + this.texture = new ResourceLocation(RefStrings.MODID, "textures/models/machines/" + tex + ".png"); + this.capacity = capacity; + this.chargeRate = chargeRate; + this.dischargeRate = dischargeRate; + } + } + + @Override + public void chargeBattery(ItemStack stack, long i) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") + i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + + @Override + public void setCharge(ItemStack stack, long i) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", i); + } + } + + @Override + public void dischargeBattery(ItemStack stack, long i) { + if(stack.hasTagCompound()) { + stack.stackTagCompound.setLong("charge", stack.stackTagCompound.getLong("charge") - i); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", this.getMaxCharge(stack) - i); + } + } + + @Override + public long getCharge(ItemStack stack) { + if(stack.hasTagCompound()) { + return stack.stackTagCompound.getLong("charge"); + } else { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", getMaxCharge(stack)); + return stack.stackTagCompound.getLong("charge"); + } + } + + @Override + public long getMaxCharge(ItemStack stack) { + EnumBatteryPack pack = EnumUtil.grabEnumSafely(EnumBatteryPack.class, stack.getItemDamage()); + return pack.capacity; + } + + @Override + public long getChargeRate(ItemStack stack) { + EnumBatteryPack pack = EnumUtil.grabEnumSafely(EnumBatteryPack.class, stack.getItemDamage()); + return pack.chargeRate; + } + + @Override + public long getDischargeRate(ItemStack stack) { + EnumBatteryPack pack = EnumUtil.grabEnumSafely(EnumBatteryPack.class, stack.getItemDamage()); + return pack.dischargeRate; + } + + @Override public boolean showDurabilityBar(ItemStack stack) { return true; } + @Override public double getDurabilityForDisplay(ItemStack stack) { return 1D - (double) getCharge(stack) / (double) getMaxCharge(stack); } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + long maxCharge = this.getMaxCharge(itemstack); + long chargeRate = this.getChargeRate(itemstack); + long dischargeRate = this.getDischargeRate(itemstack); + long charge = maxCharge; + + if(itemstack.hasTagCompound()) charge = getCharge(itemstack); + + list.add(EnumChatFormatting.GREEN + "Energy stored: " + BobMathUtil.getShortNumber(charge) + "/" + BobMathUtil.getShortNumber(maxCharge) + "HE"); + list.add(EnumChatFormatting.YELLOW + "Charge rate: " + BobMathUtil.getShortNumber(chargeRate) + "HE/t"); + list.add(EnumChatFormatting.YELLOW + "Discharge rate: " + BobMathUtil.getShortNumber(dischargeRate) + "HE/t"); + list.add(EnumChatFormatting.GOLD + "Time for full charge: " + (maxCharge / chargeRate / 20 / 60D) + "min"); + list.add(EnumChatFormatting.GOLD + "Charge lasts for: " + (maxCharge / dischargeRate / 20 / 60D) + "min"); + } + + public static ItemStack makeEmptyBattery(ItemStack stack) { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", 0); + return stack; + } + + public static ItemStack makeFullBattery(ItemStack stack) { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setLong("charge", ((ItemBatteryPack) stack.getItem()).getMaxCharge(stack)); + return stack; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tab, List list) { + + Enum[] order = theEnum.getEnumConstants(); + if(order[0] instanceof IOrderedEnum) order = ((IOrderedEnum) order[0]).getOrder(); + + for(int i = 0; i < order.length; i++) { + list.add(makeEmptyBattery(new ItemStack(item, 1, order[i].ordinal()))); + list.add(makeFullBattery(new ItemStack(item, 1, order[i].ordinal()))); + } + } +} diff --git a/src/main/java/com/hbm/items/machine/ItemSelfcharger.java b/src/main/java/com/hbm/items/machine/ItemSelfcharger.java index 419f5401d..635df6cb1 100644 --- a/src/main/java/com/hbm/items/machine/ItemSelfcharger.java +++ b/src/main/java/com/hbm/items/machine/ItemSelfcharger.java @@ -43,12 +43,12 @@ public class ItemSelfcharger extends Item implements IBatteryItem { } @Override - public long getChargeRate() { + public long getChargeRate(ItemStack stack) { return 0; } @Override - public long getDischargeRate() { + public long getDischargeRate(ItemStack stack) { return charge; } diff --git a/src/main/java/com/hbm/items/special/ItemGlitch.java b/src/main/java/com/hbm/items/special/ItemGlitch.java index 0031aecdb..024b970d7 100644 --- a/src/main/java/com/hbm/items/special/ItemGlitch.java +++ b/src/main/java/com/hbm/items/special/ItemGlitch.java @@ -243,6 +243,6 @@ public class ItemGlitch extends Item implements IBatteryItem { @Override public void dischargeBattery(ItemStack stack, long i) { } @Override public long getCharge(ItemStack stack) { return 200; } @Override public long getMaxCharge(ItemStack stack) { return 200; } - @Override public long getChargeRate() { return 0; } - @Override public long getDischargeRate() { return 200; } + @Override public long getChargeRate(ItemStack stack) { return 0; } + @Override public long getDischargeRate(ItemStack stack) { return 200; } } diff --git a/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java index 943dfd7ab..e3c7f431d 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java @@ -111,12 +111,12 @@ public class ItemSwordAbilityPower extends ItemSwordAbility implements IBatteryI } @Override - public long getChargeRate() { + public long getChargeRate(ItemStack stack) { return chargeRate; } @Override - public long getDischargeRate() { + public long getDischargeRate(ItemStack stack) { return 0; } diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java index c0c025d35..73166f49e 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java @@ -107,12 +107,12 @@ public class ItemToolAbilityPower extends ItemToolAbility implements IBatteryIte } @Override - public long getChargeRate() { + public long getChargeRate(ItemStack stack) { return chargeRate; } @Override - public long getDischargeRate() { + public long getDischargeRate(ItemStack stack) { return 0; } diff --git a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java index 084ace60b..d32f93802 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java +++ b/src/main/java/com/hbm/items/weapon/sedna/impl/ItemGunDrill.java @@ -133,6 +133,6 @@ public class ItemGunDrill extends ItemGunBaseNT implements IFillableItem, IBatte return 0; } - @Override public long getChargeRate() { return 50_000; } - @Override public long getDischargeRate() { return 0; } + @Override public long getChargeRate(ItemStack stack) { return 50_000; } + @Override public long getDischargeRate(ItemStack stack) { return 0; } } diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 5512310a8..72c4f8f89 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -244,7 +244,7 @@ public class Library { long batMax = battery.getMaxCharge(slots[index]); long batCharge = battery.getCharge(slots[index]); - long batRate = battery.getChargeRate(); + long batRate = battery.getChargeRate(slots[index]); long toCharge = Math.min(Math.min(power, batRate), batMax - batCharge); power -= toCharge; @@ -264,7 +264,7 @@ public class Library { IBatteryItem battery = (IBatteryItem) slots[index].getItem(); long batCharge = battery.getCharge(slots[index]); - long batRate = battery.getDischargeRate(); + long batRate = battery.getDischargeRate(slots[index]); long toDischarge = Math.min(Math.min((maxPower - power), batRate), batCharge); battery.dischargeBattery(slots[index], toDischarge); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index fa3544020..47bb3e5d9 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -306,6 +306,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFF.class, new RenderForceField()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityForceField.class, new RenderMachineForceField()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineFENSU.class, new RenderFENSU()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBatterySocket.class, new RenderBatterySocket()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineLargeTurbine.class, new RenderBigTurbine()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMachineReactorBreeding.class, new RenderBreeder()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySolarBoiler.class, new RenderSolarBoiler()); @@ -541,6 +542,7 @@ public class ClientProxy extends ServerProxy { MinecraftForgeClient.registerItemRenderer(ModItems.missile_doomsday_rusted, new ItemRenderMissileGeneric(RenderMissileType.TYPE_NUCLEAR)); MinecraftForgeClient.registerItemRenderer(ModItems.missile_shuttle, new ItemRenderMissileGeneric(RenderMissileType.TYPE_ROBIN)); + MinecraftForgeClient.registerItemRenderer(ModItems.battery_pack, new ItemRenderBatteryPack()); //templates MinecraftForgeClient.registerItemRenderer(ModItems.assembly_template, new ItemRenderTemplate()); MinecraftForgeClient.registerItemRenderer(ModItems.chemistry_template, new ItemRenderTemplate()); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 8e9d147db..a0f97f3b6 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -270,6 +270,7 @@ public class ResourceManager { public static final IModelCustom watz_pump = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/watz_pump.obj")).asVBO(); //FENSU + public static final IModelCustom battery_socket = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/battery.obj")).asVBO(); public static final IModelCustom fensu = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fensu.obj")).asVBO(); //Radar @@ -737,6 +738,7 @@ public class ResourceManager { public static final ResourceLocation watz_pump_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/watz_pump.png"); //FENSU + public static final ResourceLocation battery_socket_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/battery_socket.png"); public static final ResourceLocation fensu_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/fensu.png"); //Radar diff --git a/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java index 7f41feeb1..7183c202b 100644 --- a/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java +++ b/src/main/java/com/hbm/packet/toserver/AuxButtonPacket.java @@ -2,6 +2,7 @@ package com.hbm.packet.toserver; import com.hbm.config.MobConfig; import com.hbm.entity.mob.EntityDuck; +import com.hbm.interfaces.NotableComments; import com.hbm.items.weapon.ItemCustomMissilePart.PartSize; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.TileEntityTickingBase; @@ -25,6 +26,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; +@NotableComments @Deprecated //use the NBT control packet instead public class AuxButtonPacket implements IMessage { @@ -34,13 +36,9 @@ public class AuxButtonPacket implements IMessage { int value; int id; - public AuxButtonPacket() - { - - } + public AuxButtonPacket() { } - public AuxButtonPacket(int x, int y, int z, int value, int id) - { + public AuxButtonPacket(int x, int y, int z, int value, int id) { this.x = x; this.y = y; this.z = z; @@ -77,58 +75,45 @@ public class AuxButtonPacket implements IMessage { //try { TileEntity te = p.worldObj.getTileEntity(m.x, m.y, m.z); - if (te instanceof TileEntityForceField) { + if(te instanceof TileEntityForceField) { TileEntityForceField field = (TileEntityForceField)te; - field.isOn = !field.isOn; } - if (te instanceof TileEntityMachineMissileAssembly) { + if(te instanceof TileEntityMachineMissileAssembly) { TileEntityMachineMissileAssembly assembly = (TileEntityMachineMissileAssembly)te; - assembly.construct(); } - if (te instanceof TileEntityLaunchTable) { + if(te instanceof TileEntityLaunchTable) { TileEntityLaunchTable launcher = (TileEntityLaunchTable)te; - launcher.padSize = PartSize.values()[m.value]; } - if (te instanceof TileEntityCoreEmitter) { + if(te instanceof TileEntityCoreEmitter) { TileEntityCoreEmitter core = (TileEntityCoreEmitter)te; - - if(m.id == 0) { - core.watts = m.value; - } - if(m.id == 1) { - core.isOn = !core.isOn; - } + if(m.id == 0) core.watts = m.value; + if(m.id == 1) core.isOn = !core.isOn; } - if (te instanceof TileEntityCoreStabilizer) { + if(te instanceof TileEntityCoreStabilizer) { TileEntityCoreStabilizer core = (TileEntityCoreStabilizer)te; - - if(m.id == 0) { - core.watts = m.value; - } + if(m.id == 0) core.watts = m.value; } - if (te instanceof TileEntityBarrel) { + if(te instanceof TileEntityBarrel) { TileEntityBarrel barrel = (TileEntityBarrel)te; - barrel.mode = (short) ((barrel.mode + 1) % barrel.modes); barrel.markDirty(); } - if (te instanceof TileEntityMachineBattery) { + if(te instanceof TileEntityMachineBattery) { TileEntityMachineBattery bat = (TileEntityMachineBattery)te; if(m.id == 0) { bat.redLow = (short) ((bat.redLow + 1) % 4); bat.markDirty(); } - if(m.id == 1) { bat.redHigh = (short) ((bat.redHigh + 1) % 4); bat.markDirty(); @@ -136,26 +121,22 @@ public class AuxButtonPacket implements IMessage { if(m.id == 2) { switch(bat.priority) { - case LOW: bat.priority = ConnectionPriority.NORMAL; break; - case NORMAL: bat.priority = ConnectionPriority.HIGH; break; - case HIGH: bat.priority = ConnectionPriority.LOW; break; + case LOW: bat.priority = ConnectionPriority.NORMAL; break; + case NORMAL: bat.priority = ConnectionPriority.HIGH; break; + case HIGH: bat.priority = ConnectionPriority.LOW; break; } bat.markDirty(); } } - if (te instanceof TileEntitySoyuzLauncher) { + if(te instanceof TileEntitySoyuzLauncher) { TileEntitySoyuzLauncher launcher = (TileEntitySoyuzLauncher)te; - - if(m.id == 0) - launcher.mode = (byte) m.value; - if(m.id == 1) - launcher.startCountdown(); + if(m.id == 0) launcher.mode = (byte) m.value; + if(m.id == 1) launcher.startCountdown(); } - if (te instanceof TileEntityMachineMiningLaser) { + if(te instanceof TileEntityMachineMiningLaser) { TileEntityMachineMiningLaser laser = (TileEntityMachineMiningLaser)te; - laser.isOn = !laser.isOn; } diff --git a/src/main/java/com/hbm/render/item/ItemRenderBatteryPack.java b/src/main/java/com/hbm/render/item/ItemRenderBatteryPack.java new file mode 100644 index 000000000..bde3cbeac --- /dev/null +++ b/src/main/java/com/hbm/render/item/ItemRenderBatteryPack.java @@ -0,0 +1,28 @@ +package com.hbm.render.item; + +import org.lwjgl.opengl.GL11; + +import com.hbm.items.machine.ItemBatteryPack.EnumBatteryPack; +import com.hbm.main.ResourceManager; +import com.hbm.util.EnumUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; + +public class ItemRenderBatteryPack extends ItemRenderBase { + + @Override + public void renderInventory() { + GL11.glTranslated(0, -3, 0); + GL11.glScaled(5, 5, 5); + } + + @Override + public void renderCommonWithStack(ItemStack item) { + EnumBatteryPack pack = EnumUtil.grabEnumSafely(EnumBatteryPack.class, item.getItemDamage()); + GL11.glShadeModel(GL11.GL_SMOOTH); + Minecraft.getMinecraft().getTextureManager().bindTexture(pack.texture); + ResourceManager.battery_socket.renderPart("Battery"); + GL11.glShadeModel(GL11.GL_FLAT); + } +} diff --git a/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java b/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java new file mode 100644 index 000000000..66a69928d --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderBatterySocket.java @@ -0,0 +1,71 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.machine.ItemBatteryPack.EnumBatteryPack; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.storage.TileEntityBatterySocket; +import com.hbm.util.EnumUtil; + +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderBatterySocket extends TileEntitySpecialRenderer implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - 10) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + } + + GL11.glTranslated(-0.5, 0, 0.5); + + TileEntityBatterySocket socket = (TileEntityBatterySocket) tile; + + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.battery_socket_tex); + ResourceManager.battery_socket.renderPart("Socket"); + + if(socket.renderPack >= 0) { + EnumBatteryPack pack = EnumUtil.grabEnumSafely(EnumBatteryPack.class, socket.renderPack); + bindTexture(pack.texture); + ResourceManager.battery_socket.renderPart("Battery"); + } + + GL11.glShadeModel(GL11.GL_FLAT); + + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.machine_battery_socket); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -2, 0); + GL11.glScaled(5, 5, 5); + } + public void renderCommon() { + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.battery_socket_tex); + ResourceManager.battery_socket.renderPart("Socket"); + GL11.glShadeModel(GL11.GL_FLAT); + }}; + } +} diff --git a/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java b/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java index 618867431..5304ad557 100644 --- a/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java +++ b/src/main/java/com/hbm/saveddata/AnnihilatorSavedData.java @@ -148,7 +148,6 @@ public class AnnihilatorSavedData extends WorldSavedData { serializeKey(compound, entry.getKey()); compound.setByteArray("amount", entry.getValue().toByteArray()); nbt.appendTag(compound); - System.out.println("Serializing " + entry.getValue().toString() + " of " + entry.getKey()); } } @@ -158,7 +157,6 @@ public class AnnihilatorSavedData extends WorldSavedData { NBTTagCompound compound = (NBTTagCompound) nbt.tagList.get(i); Object key = deserializeKey(compound); if(key != null) this.items.put(key, new BigInteger(compound.getByteArray("amount"))); - System.out.println("Deserializing " + new BigInteger(compound.getByteArray("amount")).toString() + " of " + key); } } catch(Throwable ex) { } // because world data can be dented to all fucking hell and back } diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java index dc30ea5b3..3f36eab8d 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java @@ -6,6 +6,7 @@ import com.hbm.handler.CompatHandler.OCComponent; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.tank.FluidTank; +import api.hbm.energymk2.IEnergyConductorMK2; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluidmk2.IFluidConnectorMK2; import api.hbm.fluidmk2.IFluidReceiverMK2; @@ -31,11 +32,12 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.Interface(iface = "com.hbm.handler.CompatHandler.OCComponent", modid = "opencomputers"), @Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers") }) -public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyReceiverMK2, ISidedInventory, IFluidReceiverMK2, IHeatSource, ICrucibleAcceptor, SimpleComponent, OCComponent, IRORValueProvider, IRORInteractive { +public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyReceiverMK2, IEnergyConductorMK2, ISidedInventory, IFluidReceiverMK2, IHeatSource, ICrucibleAcceptor, SimpleComponent, OCComponent, IRORValueProvider, IRORInteractive { TileEntity tile; boolean inventory; boolean power; + boolean conductor; boolean fluid; boolean heat; public boolean moltenMetal; @@ -56,11 +58,15 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy this.inventory = true; return this; } - + public TileEntityProxyCombo power() { this.power = true; return this; } + public TileEntityProxyCombo conductor() { + this.conductor = true; + return this; + } public TileEntityProxyCombo moltenMetal() { this.moltenMetal = true; return this; @@ -141,13 +147,21 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy @Override public boolean canConnect(ForgeDirection dir) { - if(!power) - return false; - - if(getCoreObject() instanceof IEnergyReceiverMK2) { + if(power && getCoreObject() instanceof IEnergyReceiverMK2) { return ((IEnergyReceiverMK2)getCoreObject()).canConnect(dir); } + if(conductor && getCoreObject() instanceof IEnergyConductorMK2) { + return ((IEnergyConductorMK2)getCoreObject()).canConnect(dir); + } + + return true; + } + + @Override + public boolean allowDirectProvision() { + if(!power) return false; + if(getCoreObject() instanceof IEnergyReceiverMK2) return ((IEnergyReceiverMK2)getCoreObject()).allowDirectProvision(); return true; } @@ -402,6 +416,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy this.inventory = nbt.getBoolean("inv"); this.power = nbt.getBoolean("power"); + this.conductor = nbt.getBoolean("conductor"); this.fluid = nbt.getBoolean("fluid"); this.moltenMetal = nbt.getBoolean("metal"); this.heat = nbt.getBoolean("heat"); @@ -416,6 +431,7 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy nbt.setBoolean("inv", inventory); nbt.setBoolean("power", power); + nbt.setBoolean("conductor", conductor); nbt.setBoolean("fluid", fluid); nbt.setBoolean("metal", moltenMetal); nbt.setBoolean("heat", heat); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index dda9eba44..a4cbb8014 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -81,6 +81,7 @@ public class TileMappings { put(TileEntityDecoPoleTop.class, "tileentity_poletop"); put(TileEntityDecoPoleSatelliteReceiver.class, "tileentity_satellitereceicer"); put(TileEntityMachineBattery.class, "tileentity_battery"); + put(TileEntityBatterySocket.class, "tileentity_battery_socket"); put(TileEntityCapacitor.class, "tileentity_capacitor"); put(TileEntityMachineWoodBurner.class, "tileentity_wood_burner"); put(TileEntityRedBarrel.class, "tileentity_barrel"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 5cde6c932..887b6643b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -46,7 +46,7 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe if(stack != null && stack.getItem() instanceof IBatteryItem) { IBatteryItem battery = (IBatteryItem) stack.getItem(); - charge += Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate()); + charge += Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate(stack)); } } } @@ -129,7 +129,7 @@ public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyRe if(stack != null && stack.getItem() instanceof IBatteryItem) { IBatteryItem battery = (IBatteryItem) stack.getItem(); - long toCharge = Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate()); + long toCharge = Math.min(battery.getMaxCharge(stack) - battery.getCharge(stack), battery.getChargeRate(null)); toCharge = Math.min(toCharge, Math.max(power / 5, 1)); battery.chargeBattery(stack, toCharge); power -= toCharge; diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java new file mode 100644 index 000000000..f354405f6 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityBatterySocket.java @@ -0,0 +1,279 @@ +package com.hbm.tileentity.machine.storage; + +import com.hbm.interfaces.IControlReceiver; +import com.hbm.inventory.container.ContainerBatterySocket; +import com.hbm.inventory.gui.GUIBatterySocket; +import com.hbm.items.ModItems; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.uninos.UniNodespace; +import com.hbm.util.EnumUtil; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyConductorMK2; +import api.hbm.energymk2.IEnergyProviderMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityBatterySocket extends TileEntityMachineBase implements IEnergyConductorMK2, IEnergyProviderMK2, IEnergyReceiverMK2, IControlReceiver, IGUIProvider { + + public long[] log = new long[20]; + public long delta = 0; + public byte lastRedstone = 0; + public long prevPowerState = 0; + + public static final int mode_input = 0; + public static final int mode_buffer = 1; + public static final int mode_output = 2; + public static final int mode_none = 3; + public short redLow = 0; + public short redHigh = 2; + public ConnectionPriority priority = ConnectionPriority.LOW; + + public int renderPack = -1; + + protected PowerNode node; + + public TileEntityBatterySocket() { + super(1); + } + + @Override public String getName() { return "container.batterySocket"; } + + @Override + public void updateEntity() { + + if(!worldObj.isRemote) { + + if(priority == null || priority.ordinal() == 0 || priority.ordinal() == 4) { + priority = ConnectionPriority.LOW; + } + + long prevPower = this.getPower(); + + if(this.node == null || this.node.expired) { + + this.node = (PowerNode) UniNodespace.getNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + UniNodespace.createNode(worldObj, this.node); + } + } + + if(this.node != null && this.node.hasValidNet()) switch(this.getRelevantMode(false)) { + case mode_input: this.node.net.removeProvider(this); this.node.net.addReceiver(this); break; + case mode_output: this.node.net.addProvider(this); this.node.net.removeReceiver(this); break; + case mode_buffer: this.node.net.addProvider(this); this.node.net.addReceiver(this); break; + case mode_none: this.node.net.removeProvider(this); this.node.net.removeReceiver(this); break; + } + + byte comp = this.getComparatorPower(); + if(comp != this.lastRedstone) this.markDirty(); + this.lastRedstone = comp; + + long avg = (this.getPower() + prevPower) / 2; + this.delta = avg - this.log[0]; + + for(int i = 1; i < this.log.length; i++) { + this.log[i - 1] = this.log[i]; + } + + this.log[19] = avg; + + prevPowerState = this.getPower(); + + this.networkPackNT(100); + } + } + + @Override + public PowerNode createNode() { + return new PowerNode(this.getPortPos()).setConnections(this.getConPos()); + } + + public byte getComparatorPower() { + double frac = (double) this.getPower() / (double) this.getMaxPower() * 15D; + return (byte) (MathHelper.clamp_int((int) frac + 1, 0, 15)); //to combat eventual rounding errors with the FEnSU's stupid maxPower + } + + @Override + public void invalidate() { + super.invalidate(); + + if(!worldObj.isRemote) { + if(this.node != null) { + UniNodespace.destroyNode(worldObj, xCoord, yCoord, zCoord, Nodespace.THE_POWER_PROVIDER); + } + } + } + + @Override + public void serialize(ByteBuf buf) { + super.serialize(buf); + + int renderPack = -1; + if(slots[0] != null && slots[0].getItem() == ModItems.battery_pack) { + renderPack = slots[0].getItemDamage(); + } + + buf.writeInt(renderPack); + buf.writeLong(delta); + buf.writeShort(redLow); + buf.writeShort(redHigh); + buf.writeByte(priority.ordinal()); + } + + @Override + public void deserialize(ByteBuf buf) { + super.deserialize(buf); + + renderPack = buf.readInt(); + delta = buf.readLong(); + redLow = buf.readShort(); + redHigh = buf.readShort(); + priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, buf.readByte()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + this.redLow = nbt.getShort("redLow"); + this.redHigh = nbt.getShort("redHigh"); + this.lastRedstone = nbt.getByte("lastRedstone"); + this.priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, nbt.getByte("priority")); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setShort("redLow", redLow); + nbt.setShort("redHigh", redHigh); + nbt.setByte("lastRedstone", lastRedstone); + nbt.setByte("priority", (byte) this.priority.ordinal()); + } + + @Override + public boolean canExtractItem(int i, ItemStack stack, int j) { + if(stack.getItem() instanceof IBatteryItem) { + if(i == mode_input && ((IBatteryItem)stack.getItem()).getCharge(stack) == 0) return true; + if(i == mode_output && ((IBatteryItem)stack.getItem()).getCharge(stack) == ((IBatteryItem)stack.getItem()).getMaxCharge(stack)) return true; + } + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return stack.getItem() instanceof IBatteryItem; + } + + @Override public int[] getAccessibleSlotsFromSide(int side) { return new int[] {0}; } + + @Override + public long getPower() { + if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return 0; + return ((IBatteryItem) slots[0].getItem()).getCharge(slots[0]); + } + + @Override + public void setPower(long power) { + if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return; + ((IBatteryItem) slots[0].getItem()).setCharge(slots[0], power); + } + + @Override + public long getMaxPower() { + if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return 0; + return ((IBatteryItem) slots[0].getItem()).getMaxCharge(slots[0]); + } + + @Override public boolean allowDirectProvision() { return false; } + @Override public ConnectionPriority getPriority() { return this.priority; } + + @Override public long getProviderSpeed() { + if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return 0; + int mode = this.getRelevantMode(true); + return mode == mode_output || mode == mode_buffer ? ((IBatteryItem) slots[0].getItem()).getDischargeRate(slots[0]) : 0; + } + + @Override public long getReceiverSpeed() { + if(slots[0] == null || !(slots[0].getItem() instanceof IBatteryItem)) return 0; + int mode = this.getRelevantMode(true); + return mode == mode_input || mode == mode_buffer ? ((IBatteryItem) slots[0].getItem()).getChargeRate(slots[0]) : 0; + } + + public BlockPos[] getPortPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + return new BlockPos[] { + new BlockPos(xCoord, yCoord, zCoord), + new BlockPos(xCoord - dir.offsetX, yCoord, zCoord - dir.offsetZ), + new BlockPos(xCoord + rot.offsetX, yCoord, zCoord + rot.offsetZ), + new BlockPos(xCoord - dir.offsetX + rot.offsetX, yCoord, zCoord - dir.offsetZ + rot.offsetZ) + }; + } + + public DirPos[] getConPos() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + return new DirPos[] { + new DirPos(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir), + new DirPos(xCoord + dir.offsetX + rot.offsetX, yCoord, zCoord + dir.offsetZ + rot.offsetZ, dir), + + new DirPos(xCoord - dir.offsetX * 2, yCoord, zCoord - dir.offsetZ * 2, dir.getOpposite()), + new DirPos(xCoord - dir.offsetX * 2 + rot.offsetX, yCoord, zCoord - dir.offsetZ * 2 + rot.offsetZ, dir.getOpposite()), + + new DirPos(xCoord + rot.offsetX * 2, yCoord, zCoord + rot.offsetZ * 2, rot), + new DirPos(xCoord + rot.offsetX * 2 - dir.offsetX, yCoord, zCoord + rot.offsetZ * 2 - dir.offsetZ, rot), + + new DirPos(xCoord - rot.offsetX, yCoord, zCoord - rot.offsetZ, rot.getOpposite()), + new DirPos(xCoord - rot.offsetX - dir.offsetX, yCoord, zCoord - rot.offsetZ - dir.offsetZ, rot.getOpposite()) + }; + } + + private short modeCache = 0; + + public short getRelevantMode(boolean useCache) { + if(useCache) return this.modeCache; + boolean powered = false; + for(BlockPos pos : getPortPos()) if(worldObj.isBlockIndirectlyGettingPowered(pos.getX(), pos.getY(), pos.getZ())) { powered = true; break; } + this.modeCache = powered ? this.redHigh : this.redLow; + return this.modeCache; + } + + @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { return new ContainerBatterySocket(player.inventory, this); } + @Override public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIBatterySocket(player.inventory, this); } + + @Override public boolean hasPermission(EntityPlayer player) { return this.isUseableByPlayer(player); } + + @Override + public void receiveControl(NBTTagCompound data) { + if(data.hasKey("low")) { + this.redLow++; + if(this.redLow > 3) this.redLow = 0; + } + if(data.hasKey("high")) { + this.redHigh++; + if(this.redHigh > 3) this.redHigh = 0; + } + if(data.hasKey("priority")) { + int ordinal = this.priority.ordinal(); + ordinal++; + if(ordinal > ConnectionPriority.HIGH.ordinal()) ordinal = ConnectionPriority.LOW.ordinal(); + this.priority = EnumUtil.grabEnumSafely(ConnectionPriority.class, ordinal); + } + } +} diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index a2984cb93..3c0a726bb 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -245,10 +245,6 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } } - public void onNodeDestroyedCallback() { - this.node = null; - } - @Override public void invalidate() { super.invalidate(); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java b/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java index 03a3879b9..1123bac7a 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPneumoTube.java @@ -47,6 +47,7 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP public byte sendOrder = 0; public byte receiveOrder = 0; public int soundDelay = 0; + public int sendCounter = 0; public FluidTank compair; @@ -113,7 +114,7 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP if(sendFrom instanceof IInventory) { PneumaticNetwork net = node.net; - if(net.send((IInventory) sendFrom, this, this.insertionDir.getOpposite(), sendOrder, receiveOrder, getRangeFromPressure(compair.getPressure()))) { + if(net.send((IInventory) sendFrom, this, this.insertionDir.getOpposite(), sendOrder, receiveOrder, getRangeFromPressure(compair.getPressure()), sendCounter)) { this.compair.setFill(this.compair.getFill() - 50); if(this.soundDelay <= 0 && !this.muffled) { @@ -121,6 +122,8 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP this.soundDelay = 20; } } + + this.sendCounter++; } } } @@ -229,6 +232,7 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP this.sendOrder = nbt.getByte("sendOrder"); this.receiveOrder = nbt.getByte("receiveOrder"); + this.sendCounter = nbt.getInteger("sendCounter"); this.whitelist = nbt.getBoolean("whitelist"); this.redstone = nbt.getBoolean("redstone"); @@ -244,6 +248,7 @@ public class TileEntityPneumoTube extends TileEntityMachineBase implements IGUIP nbt.setByte("sendOrder", sendOrder); nbt.setByte("receiveOrder", receiveOrder); + nbt.setInteger("sendCounter", sendCounter); nbt.setBoolean("whitelist", whitelist); nbt.setBoolean("redstone", redstone); diff --git a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java index 336fbf86d..c07254103 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java +++ b/src/main/java/com/hbm/uninos/networkproviders/PneumaticNetwork.java @@ -31,7 +31,6 @@ public class PneumaticNetwork extends NodeNet { public static final byte RECEIVE_RANDOM = 1; public Random rand = new Random(); - public int nextReceiver = 0; protected static final int timeout = 1_000; public static final int ITEMS_PER_TRANSFER = 64; @@ -53,7 +52,7 @@ public class PneumaticNetwork extends NodeNet { receivers.entrySet().removeIf(x -> { return (timestamp - x.getValue().getY() > timeout) || NodeNet.isBadLink(x.getKey()); }); } - public boolean send(IInventory source, TileEntityPneumoTube tube, ForgeDirection accessDir, int sendOrder, int receiveOrder, int maxRange) { + public boolean send(IInventory source, TileEntityPneumoTube tube, ForgeDirection accessDir, int sendOrder, int receiveOrder, int maxRange, int nextReceiver) { // turns out there may be a short time window where the cleanup hasn't happened yet, but chunkloading has already caused tiles to go invalid // so we just run it again here, just to be sure. @@ -76,7 +75,6 @@ public class PneumaticNetwork extends NodeNet { int index = nextReceiver % receivers.size(); Entry> chosenReceiverEntry = null; - nextReceiver++; if(receiveOrder == RECEIVE_ROBIN) chosenReceiverEntry = receiverList.get(index); if(receiveOrder == RECEIVE_RANDOM) chosenReceiverEntry = receiverList.get(rand.nextInt(receiverList.size())); diff --git a/src/main/java/com/hbm/util/CompatEnergyControl.java b/src/main/java/com/hbm/util/CompatEnergyControl.java index 353557637..b74fd9a32 100644 --- a/src/main/java/com/hbm/util/CompatEnergyControl.java +++ b/src/main/java/com/hbm/util/CompatEnergyControl.java @@ -36,7 +36,7 @@ public class CompatEnergyControl { /** Standardized discharge for IBatteryItem, returns the amount that was removed */ public static double dischargeItem(ItemStack stack, double needed) { IBatteryItem battery = (IBatteryItem) stack.getItem(); - long toDischarge = Math.min(battery.getDischargeRate(), Math.min(battery.getCharge(stack), (long) needed)); + long toDischarge = Math.min(battery.getDischargeRate(stack), Math.min(battery.getCharge(stack), (long) needed)); battery.dischargeBattery(stack, toDischarge); return toDischarge; } diff --git a/src/main/resources/assets/hbm/models/machines/battery.obj b/src/main/resources/assets/hbm/models/machines/battery.obj new file mode 100644 index 000000000..c37a7ffbc --- /dev/null +++ b/src/main/resources/assets/hbm/models/machines/battery.obj @@ -0,0 +1,1020 @@ +# Blender v2.79 (sub 0) OBJ File: 'battery.blend' +# www.blender.org +o Battery +v 0.687500 1.875000 -0.875000 +v 0.875000 1.875000 -0.687500 +v 0.000000 1.875000 -0.187500 +v -0.875000 1.875000 -0.187500 +v 0.875000 0.125000 -0.187500 +v 0.875000 1.875000 -0.187500 +v 0.687500 1.875000 0.875000 +v 0.875000 1.875000 0.687500 +v 0.875000 0.125000 0.687500 +v 0.687500 0.125000 0.875000 +v 0.000000 1.875000 0.687500 +v 0.187500 1.875000 0.875000 +v 0.875000 1.875000 0.187500 +v 0.687500 1.875000 0.000000 +v 0.687500 0.125000 0.000000 +v 0.875000 0.125000 0.187500 +v 0.187500 0.125000 0.875000 +v 0.000000 0.125000 0.687500 +v 0.000000 0.125000 0.187500 +v 0.187500 0.125000 0.000000 +v 0.187500 1.875000 0.000000 +v 0.000000 1.875000 0.187500 +v 0.687500 0.125000 -0.875000 +v 0.875000 0.125000 -0.687500 +v -0.187500 1.875000 -0.875000 +v 0.000000 0.125000 -0.187500 +v 0.000000 0.125000 -0.687500 +v 0.187500 0.125000 -0.875000 +v 0.187500 1.875000 -0.875000 +v 0.000000 1.875000 -0.687500 +v -0.187500 1.875000 0.875000 +v -0.187500 0.125000 0.875000 +v -0.875000 1.875000 0.687500 +v -0.687500 1.875000 0.875000 +v -0.187500 1.875000 0.000000 +v -0.187500 0.125000 0.000000 +v -0.687500 0.125000 0.875000 +v -0.875000 0.125000 0.687500 +v -0.875000 0.125000 0.187500 +v -0.687500 0.125000 0.000000 +v -0.687500 1.875000 0.000000 +v -0.875000 1.875000 0.187500 +v -0.187500 0.125000 -0.875000 +v -0.875000 0.125000 -0.187500 +v -0.875000 0.125000 -0.687500 +v -0.687500 0.125000 -0.875000 +v -0.687500 1.875000 -0.875000 +v -0.875000 1.875000 -0.687500 +v -0.937500 1.625000 0.687500 +v -0.687500 1.625000 0.937500 +v 0.687500 1.625000 0.937500 +v 0.937500 1.625000 0.687500 +v -0.687500 1.625000 -0.937500 +v -0.937500 1.625000 -0.687500 +v 0.937500 1.625000 -0.687500 +v 0.687500 1.625000 -0.937500 +v 0.687500 1.375000 -0.937500 +v 0.937500 1.375000 -0.687500 +v -0.937500 1.375000 -0.687500 +v -0.687500 1.375000 -0.937500 +v 0.937500 1.375000 0.687500 +v 0.687500 1.375000 0.937500 +v -0.687500 1.375000 0.937500 +v -0.937500 1.375000 0.687500 +v -0.937500 0.625000 0.687500 +v -0.687500 0.625000 0.937500 +v 0.687500 0.625000 0.937500 +v 0.937500 0.625000 0.687500 +v -0.687500 0.625000 -0.937500 +v -0.937500 0.625000 -0.687500 +v 0.937500 0.625000 -0.687500 +v 0.687500 0.625000 -0.937500 +v 0.687500 0.375000 -0.937500 +v 0.937500 0.375000 -0.687500 +v -0.937500 0.375000 -0.687500 +v -0.687500 0.375000 -0.937500 +v 0.937500 0.375000 0.687500 +v 0.687500 0.375000 0.937500 +v -0.687500 0.375000 0.937500 +v -0.937500 0.375000 0.687500 +vt 0.597561 0.617647 +vt 0.731707 0.661765 +vt 0.695122 0.823529 +vt 0.560976 0.617647 +vt 0.597561 0.205882 +vt 0.597561 0.617647 +vt 1.000000 0.205882 +vt 0.963415 0.617647 +vt 0.963415 0.205882 +vt 0.731707 0.044118 +vt 0.695122 0.205882 +vt 0.560976 0.161765 +vt 0.695122 0.205882 +vt 0.560976 0.161765 +vt 0.597561 -0.000000 +vt 0.560976 0.205882 +vt 0.463415 0.617647 +vt 0.463415 0.205882 +vt 0.560976 0.617647 +vt 1.000000 0.617647 +vt 0.963415 0.205882 +vt 1.000000 0.205882 +vt 0.865854 0.617647 +vt 0.829268 0.205882 +vt 0.865854 0.205882 +vt 0.731707 0.617647 +vt 0.731707 0.205882 +vt 0.597561 0.205882 +vt 0.695122 0.205882 +vt 0.731707 0.617647 +vt 0.695122 0.617647 +vt 0.829268 0.617647 +vt 0.731707 0.205882 +vt 0.829268 0.205882 +vt 0.560976 0.205882 +vt 0.597561 0.617647 +vt 0.560976 0.617647 +vt 0.560976 0.161765 +vt 0.597561 0.000000 +vt 0.560976 0.661765 +vt 0.695122 0.617647 +vt 0.731707 0.779412 +vt 0.865854 0.617647 +vt 0.963415 0.205882 +vt 0.963415 0.617647 +vt 0.865854 0.617647 +vt 0.865854 0.205882 +vt 0.731707 0.617647 +vt 0.597561 0.205882 +vt 1.000000 0.205882 +vt 0.963415 0.617647 +vt 0.963415 0.205882 +vt 0.597561 0.617647 +vt 0.560976 0.205882 +vt 0.597561 0.205882 +vt 0.463415 0.617647 +vt 0.463415 0.205882 +vt 0.560976 0.661765 +vt 0.731707 0.779412 +vt 1.000000 0.617647 +vt 1.000000 0.205882 +vt 0.829268 0.205882 +vt 0.865854 0.205882 +vt 0.695122 0.205882 +vt 0.731707 0.617647 +vt 0.695122 0.617647 +vt 0.560976 0.044118 +vt 0.695122 -0.000000 +vt 0.731707 0.161765 +vt 0.865854 0.617647 +vt 0.829268 0.617647 +vt 0.731707 0.205882 +vt 0.829268 0.205882 +vt 0.731707 0.779412 +vt 0.597561 0.823529 +vt 0.560976 0.661765 +vt 0.865854 0.205882 +vt 0.463415 0.882353 +vt 0.414634 0.558824 +vt 0.463415 0.558824 +vt 0.097561 0.500000 +vt 0.365854 0.941176 +vt 0.414634 0.058824 +vt 0.365854 0.441176 +vt 0.048780 0.382353 +vt 0.097561 1.000000 +vt 0.365854 1.000000 +vt 0.097561 0.441176 +vt 0.414634 0.500000 +vt 0.365854 0.500000 +vt 0.414634 0.941176 +vt 0.463415 0.941176 +vt 0.048780 0.941176 +vt 0.097561 0.941176 +vt 0.048780 0.500000 +vt 0.000000 0.558824 +vt 0.000000 0.500000 +vt 0.048780 0.882353 +vt 0.000000 0.882353 +vt 0.463415 0.882353 +vt 0.414634 0.558824 +vt 0.463415 0.558824 +vt 0.097561 0.500000 +vt 0.365854 0.941176 +vt 0.414634 0.058824 +vt 0.365854 0.441176 +vt 0.048780 0.382353 +vt 0.097561 1.000000 +vt 0.365854 1.000000 +vt 0.097561 0.441176 +vt 0.414634 0.500000 +vt 0.365854 0.500000 +vt 0.414634 0.941176 +vt 0.463415 0.941176 +vt 0.048780 0.941176 +vt 0.097561 0.941176 +vt 0.048780 0.500000 +vt 0.000000 0.558824 +vt 0.000000 0.500000 +vt 0.048780 0.882353 +vt 0.000000 0.882353 +vt 0.597561 0.823529 +vt 0.560976 0.779412 +vt 0.560976 0.661765 +vt 0.695122 0.617647 +vt 0.731707 0.779412 +vt 0.560976 0.205882 +vt 1.000000 0.617647 +vt 0.560976 0.044118 +vt 0.597561 -0.000000 +vt 0.695122 -0.000000 +vt 0.731707 0.161765 +vt 0.695122 -0.000000 +vt 0.731707 0.044118 +vt 0.731707 0.161765 +vt 0.560976 0.044118 +vt 0.963415 0.617647 +vt 0.829268 0.617647 +vt 0.695122 0.000000 +vt 0.731707 0.044118 +vt 0.731707 0.161765 +vt 0.560976 0.044118 +vt 0.695122 0.823529 +vt 0.597561 0.823529 +vt 0.560976 0.779412 +vt 0.731707 0.661765 +vt 1.000000 0.617647 +vt 0.560976 0.617647 +vt 0.695122 0.823529 +vt 0.597561 0.823529 +vt 0.560976 0.779412 +vt 0.731707 0.661765 +vt 0.829268 0.617647 +vt 0.731707 0.205882 +vt 0.560976 0.161765 +vt 0.597561 -0.000000 +vt 0.731707 0.044118 +vt 0.731707 0.661765 +vt 0.695122 0.823529 +vt 0.560976 0.779412 +vt 0.414634 0.882353 +vt 0.048780 0.558824 +vt 0.048780 0.058824 +vt 0.097561 -0.000000 +vt 0.365854 -0.000000 +vt 0.414634 0.382353 +vt 0.414634 0.441176 +vt 0.048780 1.000000 +vt 0.414634 0.882353 +vt 0.048780 0.558824 +vt 0.048780 0.058824 +vt 0.097561 -0.000000 +vt 0.365854 -0.000000 +vt 0.414634 0.382353 +vt 0.414634 0.441176 +vt 0.048780 1.000000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.7071 0.0000 0.7071 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +s off +f 8/1/1 14/2/1 22/3/1 +f 35/4/2 26/5/2 3/6/2 +f 20/7/3 3/8/3 26/9/3 +f 20/10/4 16/11/4 10/12/4 +f 24/13/4 15/14/4 26/15/4 +f 10/16/5 12/17/5 17/18/5 +f 10/16/2 8/1/2 7/19/2 +f 12/20/3 18/21/3 17/22/3 +f 22/23/6 20/24/6 19/25/6 +f 14/26/7 16/11/7 15/27/7 +f 16/11/8 8/1/8 9/28/8 +f 27/29/7 25/30/7 30/31/7 +f 29/32/9 23/33/9 28/34/9 +f 15/35/2 6/36/2 14/37/2 +f 27/29/4 36/38/4 44/39/4 +f 14/40/1 2/41/1 29/42/1 +f 42/43/10 38/44/10 33/45/10 +f 30/46/6 28/34/6 27/47/6 +f 1/48/7 24/13/7 23/33/7 +f 24/13/8 6/36/8 5/49/8 +f 40/50/3 4/51/3 44/52/3 +f 11/53/2 32/54/2 18/55/2 +f 32/54/5 34/56/5 37/57/5 +f 35/58/1 30/31/1 47/59/1 +f 34/60/3 38/44/3 37/61/3 +f 42/43/6 40/62/6 39/63/6 +f 19/64/7 35/65/7 22/66/7 +f 37/67/4 39/68/4 36/69/4 +f 48/70/10 44/52/10 4/51/10 +f 47/71/9 43/72/9 46/73/9 +f 41/74/1 33/75/1 31/76/1 +f 48/70/6 46/73/6 45/77/6 +f 60/78/9 56/79/9 57/80/9 +f 52/81/1 56/79/1 54/82/1 +f 60/83/4 58/84/4 62/85/4 +f 64/86/10 54/82/10 59/87/10 +f 58/84/8 52/81/8 61/88/8 +f 58/84/7 56/89/7 55/90/7 +f 54/91/6 60/78/6 59/92/6 +f 64/86/3 50/93/3 49/94/3 +f 52/95/2 62/96/2 61/97/2 +f 62/96/5 50/98/5 63/99/5 +f 76/100/9 72/101/9 73/102/9 +f 68/103/1 72/101/1 70/104/1 +f 76/105/4 74/106/4 78/107/4 +f 80/108/10 70/104/10 75/109/10 +f 74/106/8 68/103/8 77/110/8 +f 74/106/7 72/111/7 71/112/7 +f 70/113/6 76/100/6 75/114/6 +f 80/108/3 66/115/3 65/116/3 +f 68/117/2 78/118/2 77/119/2 +f 78/118/5 66/120/5 79/121/5 +f 22/3/1 11/122/1 12/123/1 +f 12/123/1 7/124/1 8/1/1 +f 8/1/1 13/125/1 14/2/1 +f 14/2/1 21/126/1 22/3/1 +f 22/3/1 12/123/1 8/1/1 +f 35/4/2 36/127/2 26/5/2 +f 20/7/3 21/128/3 3/8/3 +f 10/12/4 17/129/4 18/130/4 +f 18/130/4 19/131/4 20/10/4 +f 20/10/4 15/132/4 16/11/4 +f 16/11/4 9/28/4 10/12/4 +f 10/12/4 18/130/4 20/10/4 +f 26/15/4 27/133/4 28/134/4 +f 28/134/4 23/135/4 24/13/4 +f 24/13/4 5/49/4 15/14/4 +f 15/14/4 20/136/4 26/15/4 +f 26/15/4 28/134/4 24/13/4 +f 10/16/5 7/19/5 12/17/5 +f 10/16/2 9/28/2 8/1/2 +f 12/20/3 11/137/3 18/21/3 +f 22/23/6 21/138/6 20/24/6 +f 14/26/7 13/125/7 16/11/7 +f 16/11/8 13/125/8 8/1/8 +f 27/29/7 43/72/7 25/30/7 +f 29/32/9 1/48/9 23/33/9 +f 15/35/2 5/49/2 6/36/2 +f 44/39/4 45/139/4 46/140/4 +f 46/140/4 43/141/4 27/29/4 +f 27/29/4 26/5/4 36/38/4 +f 36/38/4 40/142/4 44/39/4 +f 44/39/4 46/140/4 27/29/4 +f 29/42/1 30/143/1 3/144/1 +f 3/144/1 21/145/1 14/40/1 +f 14/40/1 6/36/1 2/41/1 +f 2/41/1 1/146/1 29/42/1 +f 29/42/1 3/144/1 14/40/1 +f 42/43/10 39/63/10 38/44/10 +f 30/46/6 29/32/6 28/34/6 +f 1/48/7 2/41/7 24/13/7 +f 24/13/8 2/41/8 6/36/8 +f 40/50/3 41/147/3 4/51/3 +f 11/53/2 31/148/2 32/54/2 +f 32/54/5 31/148/5 34/56/5 +f 47/59/1 48/149/1 4/150/1 +f 4/150/1 41/151/1 35/58/1 +f 35/58/1 3/6/1 30/31/1 +f 30/31/1 25/152/1 47/59/1 +f 47/59/1 4/150/1 35/58/1 +f 34/60/3 33/45/3 38/44/3 +f 42/43/6 41/153/6 40/62/6 +f 19/64/7 36/154/7 35/65/7 +f 36/69/4 19/64/4 18/55/4 +f 18/55/4 32/155/4 37/67/4 +f 37/67/4 38/156/4 39/68/4 +f 39/68/4 40/157/4 36/69/4 +f 36/69/4 18/55/4 37/67/4 +f 48/70/10 45/77/10 44/52/10 +f 47/71/9 25/30/9 43/72/9 +f 31/76/1 11/53/1 22/66/1 +f 22/66/1 35/158/1 41/74/1 +f 41/74/1 42/159/1 33/75/1 +f 33/75/1 34/160/1 31/76/1 +f 31/76/1 22/66/1 41/74/1 +f 48/70/6 47/71/6 46/73/6 +f 60/78/9 53/161/9 56/79/9 +f 54/82/1 49/94/1 50/98/1 +f 50/98/1 51/162/1 52/81/1 +f 52/81/1 55/90/1 56/79/1 +f 56/79/1 53/161/1 54/82/1 +f 54/82/1 50/98/1 52/81/1 +f 62/85/4 63/163/4 64/164/4 +f 64/164/4 59/165/4 60/83/4 +f 60/83/4 57/166/4 58/84/4 +f 58/84/4 61/88/4 62/85/4 +f 62/85/4 64/164/4 60/83/4 +f 64/86/10 49/94/10 54/82/10 +f 58/84/8 55/90/8 52/81/8 +f 58/84/7 57/167/7 56/89/7 +f 54/91/6 53/161/6 60/78/6 +f 64/86/3 63/168/3 50/93/3 +f 52/95/2 51/162/2 62/96/2 +f 62/96/5 51/162/5 50/98/5 +f 76/100/9 69/169/9 72/101/9 +f 70/104/1 65/116/1 66/120/1 +f 66/120/1 67/170/1 68/103/1 +f 68/103/1 71/112/1 72/101/1 +f 72/101/1 69/169/1 70/104/1 +f 70/104/1 66/120/1 68/103/1 +f 78/107/4 79/171/4 80/172/4 +f 80/172/4 75/173/4 76/105/4 +f 76/105/4 73/174/4 74/106/4 +f 74/106/4 77/110/4 78/107/4 +f 78/107/4 80/172/4 76/105/4 +f 80/108/10 65/116/10 70/104/10 +f 74/106/8 71/112/8 68/103/8 +f 74/106/7 73/175/7 72/111/7 +f 70/113/6 69/169/6 76/100/6 +f 80/108/3 79/176/3 66/115/3 +f 68/117/2 67/170/2 78/118/2 +f 78/118/5 67/170/5 66/120/5 +o Socket +v -1.000000 0.000000 1.000000 +v 1.000000 0.000000 1.000000 +v -1.000000 0.000000 -1.000000 +v 1.000000 0.000000 -1.000000 +v -0.875000 0.250000 0.875000 +v 0.875000 0.250000 0.875000 +v -0.875000 0.250000 -0.875000 +v 0.875000 0.250000 -0.875000 +v -1.000000 0.250000 -1.000000 +v -1.000000 0.250000 1.000000 +v 1.000000 0.250000 1.000000 +v 1.000000 0.250000 -1.000000 +v 1.000000 0.750000 -0.250000 +v 1.000000 0.250000 -0.250000 +v 1.000000 0.750000 -0.750000 +v 1.000000 0.250000 -0.750000 +v 0.875000 0.750000 -0.750000 +v 0.875000 0.750000 -0.250000 +v 0.875000 0.250000 -0.250000 +v 0.875000 0.250000 -0.750000 +v -0.875000 0.125000 -0.875000 +v -0.875000 0.125000 0.875000 +v 0.875000 0.125000 0.875000 +v 0.875000 0.125000 -0.875000 +v 1.000000 0.750000 0.750000 +v 1.000000 0.250000 0.750000 +v 1.000000 0.750000 0.250000 +v 1.000000 0.250000 0.250000 +v 0.875000 0.750000 0.250000 +v 0.875000 0.750000 0.750000 +v 0.875000 0.250000 0.750000 +v 0.875000 0.250000 0.250000 +v -1.000000 0.750000 0.250000 +v -1.000000 0.250000 0.250000 +v -1.000000 0.750000 0.750000 +v -1.000000 0.250000 0.750000 +v -0.875000 0.750000 0.750000 +v -0.875000 0.750000 0.250000 +v -0.875000 0.250000 0.250000 +v -0.875000 0.250000 0.750000 +v -1.000000 0.750000 -0.750000 +v -1.000000 0.250000 -0.750000 +v -1.000000 0.750000 -0.250000 +v -1.000000 0.250000 -0.250000 +v -0.875000 0.750000 -0.250000 +v -0.875000 0.750000 -0.750000 +v -0.875000 0.250000 -0.750000 +v -0.875000 0.250000 -0.250000 +v -0.250000 0.750000 -1.000000 +v -0.250000 0.250000 -1.000000 +v -0.750000 0.750000 -1.000000 +v -0.750000 0.250000 -1.000000 +v -0.750000 0.750000 -0.875000 +v -0.250000 0.750000 -0.875000 +v -0.250000 0.250000 -0.875000 +v -0.750000 0.250000 -0.875000 +v 0.750000 0.750000 -1.000000 +v 0.750000 0.250000 -1.000000 +v 0.250000 0.750000 -1.000000 +v 0.250000 0.250000 -1.000000 +v 0.250000 0.750000 -0.875000 +v 0.750000 0.750000 -0.875000 +v 0.750000 0.250000 -0.875000 +v 0.250000 0.250000 -0.875000 +v 0.250000 0.750000 1.000000 +v 0.250000 0.250000 1.000000 +v 0.750000 0.750000 1.000000 +v 0.750000 0.250000 1.000000 +v 0.750000 0.750000 0.875000 +v 0.250000 0.750000 0.875000 +v 0.250000 0.250000 0.875000 +v 0.750000 0.250000 0.875000 +v -0.750000 0.750000 1.000000 +v -0.750000 0.250000 1.000000 +v -0.250000 0.750000 1.000000 +v -0.250000 0.250000 1.000000 +v -0.250000 0.750000 0.875000 +v -0.750000 0.750000 0.875000 +v -0.750000 0.250000 0.875000 +v -0.250000 0.250000 0.875000 +v 0.562500 1.875000 -0.562500 +v 0.312500 1.875000 -0.562500 +v 0.562500 1.875000 -0.312500 +v 0.312500 1.875000 -0.312500 +v -0.843750 1.937500 0.500000 +v 0.312500 1.875000 0.562500 +v 0.562500 1.875000 0.562500 +v 0.312500 1.875000 0.312500 +v 0.562500 1.875000 0.312500 +v 0.312500 2.000000 0.312500 +v 0.312500 2.000000 0.562500 +v 0.562500 2.000000 0.562500 +v 0.562500 2.000000 0.312500 +v 0.312500 2.000000 -0.562500 +v 0.312500 2.000000 -0.312500 +v 0.562500 2.000000 -0.312500 +v 0.562500 2.000000 -0.562500 +v -0.312500 1.875000 -0.562500 +v -0.562500 1.875000 -0.562500 +v -0.312500 1.875000 -0.312500 +v -0.562500 1.875000 -0.312500 +v -0.562500 1.875000 0.562500 +v -0.312500 1.875000 0.562500 +v -0.562500 1.875000 0.312500 +v -0.312500 1.875000 0.312500 +v -0.562500 2.000000 0.312500 +v -0.562500 2.000000 0.562500 +v -0.312500 2.000000 0.562500 +v -0.312500 2.000000 0.312500 +v -0.562500 2.000000 -0.562500 +v -0.562500 2.000000 -0.312500 +v -0.312500 2.000000 -0.312500 +v -0.312500 2.000000 -0.562500 +v 0.843750 1.937500 0.500000 +v -0.843750 1.937500 0.375000 +v 0.843750 1.937500 0.375000 +v 0.968750 1.812500 0.500000 +v 0.968750 1.812500 0.375000 +v 0.968750 0.750000 0.500000 +v 0.968750 0.750000 0.375000 +v -0.968750 1.811500 0.500000 +v -0.968750 1.811500 0.375000 +v -0.968750 0.749000 0.500000 +v -0.968750 0.749000 0.375000 +v -0.843750 1.937500 -0.375000 +v 0.843750 1.937500 -0.375000 +v -0.843750 1.937500 -0.500000 +v 0.843750 1.937500 -0.500000 +v 0.968750 1.812500 -0.375000 +v 0.968750 1.812500 -0.500000 +v 0.968750 0.750000 -0.375000 +v 0.968750 0.750000 -0.500000 +v -0.968750 1.811500 -0.375000 +v -0.968750 1.811500 -0.500000 +v -0.968750 0.749000 -0.375000 +v -0.968750 0.749000 -0.500000 +v -0.968750 0.749000 -0.500000 +v -0.968750 0.749000 -0.375000 +v -0.968750 1.811500 -0.500000 +v -0.968750 1.811500 -0.375000 +v 0.968750 0.750000 -0.500000 +v 0.968750 0.750000 -0.375000 +v 0.968750 1.812500 -0.500000 +v 0.968750 1.812500 -0.375000 +v 0.843750 1.937500 -0.500000 +v -0.843750 1.937500 -0.500000 +v 0.843750 1.937500 -0.375000 +v -0.843750 1.937500 -0.375000 +v -0.968750 0.749000 0.375000 +v -0.968750 0.749000 0.500000 +v -0.968750 1.811500 0.375000 +v -0.968750 1.811500 0.500000 +v 0.968750 0.750000 0.375000 +v 0.968750 0.750000 0.500000 +v 0.968750 1.812500 0.375000 +v 0.968750 1.812500 0.500000 +v 0.843750 1.937500 0.375000 +v -0.843750 1.937500 0.375000 +v 0.843750 1.937500 0.500000 +v -0.843750 1.937500 0.500000 +vt 0.486486 0.055556 +vt 0.054054 0.500000 +vt 0.054054 0.055556 +vt 0.945946 -0.000000 +vt 0.567568 0.027778 +vt 0.567568 -0.000000 +vt 0.540541 0.500000 +vt 0.486486 0.500000 +vt 0.000000 0.055556 +vt 0.054054 0.555556 +vt 0.486486 0.000000 +vt 0.459459 0.972222 +vt 0.054054 1.000000 +vt 0.081081 0.972222 +vt 0.081081 0.583333 +vt 0.486486 0.555556 +vt 0.459459 0.583333 +vt 0.486486 1.000000 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.945946 0.416667 +vt 0.567568 0.416667 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.567568 0.444444 +vt 0.945946 0.444444 +vt 0.972973 0.416667 +vt 0.945946 0.027778 +vt 0.972973 0.027778 +vt 0.540541 0.027778 +vt 0.540541 0.416667 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.594595 0.444444 +vt 0.702703 0.555556 +vt 0.594595 0.555556 +vt 0.702703 0.583333 +vt 0.594595 0.694444 +vt 0.594595 0.583333 +vt 0.810811 0.555556 +vt 0.486486 0.583333 +vt 0.486486 0.555556 +vt 0.918919 0.500000 +vt 0.864865 0.527778 +vt 0.864865 0.500000 +vt 0.810811 0.527778 +vt 0.864865 0.583333 +vt 0.810811 0.583333 +vt 0.810811 0.527778 +vt 0.864865 0.583333 +vt 0.810811 0.583333 +vt 0.918919 0.500000 +vt 0.864865 0.527778 +vt 0.864865 0.500000 +vt 0.810811 0.500000 +vt 0.756757 0.527778 +vt 0.756757 0.500000 +vt 0.972973 0.500000 +vt 0.918919 0.527778 +vt 0.810811 0.500000 +vt 0.756757 0.527778 +vt 0.756757 0.500000 +vt 0.972973 0.500000 +vt 0.918919 0.527778 +vt 0.918919 0.500000 +vt 0.864865 0.527778 +vt 0.864865 0.500000 +vt 0.810811 0.527778 +vt 0.864865 0.583333 +vt 0.810811 0.583333 +vt 0.810811 0.527778 +vt 0.864865 0.583333 +vt 0.810811 0.583333 +vt 0.918919 0.500000 +vt 0.864865 0.527778 +vt 0.864865 0.500000 +vt 0.810811 0.500000 +vt 0.756757 0.527778 +vt 0.756757 0.500000 +vt 0.972973 0.500000 +vt 0.918919 0.527778 +vt 0.810811 0.500000 +vt 0.756757 0.527778 +vt 0.756757 0.500000 +vt 0.972973 0.500000 +vt 0.918919 0.527778 +vt 0.972973 0.263889 +vt 1.000000 0.638889 +vt 0.972973 0.638889 +vt 1.000000 0.236111 +vt 1.000000 0.263889 +vt 0.972973 0.236111 +vt 1.000000 0.000000 +vt 0.972973 0.666667 +vt 1.000000 0.666667 +vt 0.972973 0.902778 +vt 0.972973 0.263889 +vt 1.000000 0.638889 +vt 0.972973 0.638889 +vt 1.000000 0.236111 +vt 1.000000 0.263889 +vt 0.972973 0.236111 +vt 1.000000 0.000000 +vt 0.972973 0.666667 +vt 1.000000 0.666667 +vt 0.972973 0.902778 +vt 0.810811 0.444444 +vt 0.864865 0.444444 +vt 0.810811 0.444444 +vt 0.864865 0.444444 +vt 0.864865 0.444444 +vt 0.864865 0.444444 +vt 0.972973 0.902778 +vt 1.000000 0.666667 +vt 0.972973 0.666667 +vt 1.000000 0.638889 +vt 0.972973 0.638889 +vt 1.000000 0.000000 +vt 0.972973 0.236111 +vt 1.000000 0.236111 +vt 0.972973 0.263889 +vt 1.000000 0.263889 +vt 0.972973 0.902778 +vt 1.000000 0.666667 +vt 0.972973 0.666667 +vt 1.000000 0.638889 +vt 0.972973 0.638889 +vt 1.000000 0.000000 +vt 0.972973 0.236111 +vt 1.000000 0.236111 +vt 0.972973 0.263889 +vt 1.000000 0.263889 +vt 0.540541 0.055556 +vt 0.000000 0.500000 +vt 0.054054 0.000000 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.702703 0.444444 +vt 0.702703 0.694444 +vt 0.810811 0.583333 +vt 0.972973 0.527778 +vt 0.972973 0.527778 +vt 0.972973 0.527778 +vt 0.972973 0.527778 +vt 0.972973 0.000000 +vt 1.000000 0.902778 +vt 0.972973 0.000000 +vt 1.000000 0.902778 +vt 0.810811 0.444444 +vt 0.810811 0.444444 +vt 1.000000 0.902778 +vt 0.972973 0.000000 +vt 1.000000 0.902778 +vt 0.972973 0.000000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn -0.7099 0.7043 0.0000 +vn 0.7099 -0.7043 0.0000 +vn -0.7071 -0.7071 0.0000 +s off +f 83/177/11 82/178/11 81/179/11 +f 88/180/12 103/181/12 86/182/12 +f 83/177/13 92/183/13 84/184/13 +f 82/178/14 90/185/14 81/179/14 +f 84/184/15 91/186/15 82/178/15 +f 81/179/12 89/187/12 83/177/12 +f 87/188/16 90/189/16 85/190/16 +f 85/190/16 91/186/16 86/191/16 +f 86/191/16 92/192/16 88/193/16 +f 88/193/16 89/194/16 87/188/16 +f 94/195/15 95/196/15 93/197/15 +f 97/198/12 99/199/12 98/200/12 +f 103/181/16 101/201/16 102/202/16 +f 95/196/16 98/200/16 93/197/16 +f 96/203/13 97/198/13 95/196/13 +f 93/197/14 99/204/14 94/205/14 +f 85/206/15 101/201/15 87/207/15 +f 87/208/14 104/209/14 88/210/14 +f 86/211/13 102/202/13 85/212/13 +f 106/213/15 107/214/15 105/215/15 +f 109/216/12 111/217/12 110/218/12 +f 107/214/16 110/218/16 105/215/16 +f 108/219/13 109/216/13 107/214/13 +f 105/215/14 111/220/14 106/221/14 +f 114/222/12 115/223/12 113/224/12 +f 117/225/15 119/226/15 118/227/15 +f 115/223/16 118/227/16 113/224/16 +f 116/228/14 117/225/14 115/223/14 +f 113/224/13 119/229/13 114/230/13 +f 122/231/12 123/232/12 121/233/12 +f 125/234/15 127/235/15 126/236/15 +f 123/232/16 126/236/16 121/233/16 +f 124/237/14 125/234/14 123/232/14 +f 121/233/13 127/238/13 122/239/13 +f 130/240/13 131/241/13 129/242/13 +f 133/243/14 135/244/14 134/245/14 +f 131/241/16 134/245/16 129/242/16 +f 132/246/12 133/243/12 131/241/12 +f 129/242/15 135/247/15 130/248/15 +f 138/249/13 139/250/13 137/251/13 +f 141/252/14 143/253/14 142/254/14 +f 139/250/16 142/254/16 137/251/16 +f 140/255/12 141/252/12 139/250/12 +f 137/251/15 143/256/15 138/257/15 +f 146/258/14 147/259/14 145/260/14 +f 149/261/13 151/262/13 150/263/13 +f 147/259/16 150/263/16 145/260/16 +f 148/264/15 149/261/15 147/259/15 +f 145/260/12 151/265/12 146/266/12 +f 154/267/14 155/268/14 153/269/14 +f 157/270/13 159/271/13 158/272/13 +f 155/268/16 158/272/16 153/269/16 +f 156/273/15 157/270/15 155/268/15 +f 153/269/12 159/274/12 154/275/12 +f 162/276/13 177/277/13 161/278/13 +f 176/279/16 174/280/16 175/281/16 +f 172/282/16 170/283/16 171/284/16 +f 168/285/13 173/286/13 169/287/13 +f 167/288/14 171/289/14 166/290/14 +f 169/287/15 172/282/15 167/288/15 +f 166/291/12 170/292/12 168/285/12 +f 163/293/14 175/294/14 164/295/14 +f 161/278/15 176/279/15 163/293/15 +f 164/296/12 174/297/12 162/276/12 +f 179/298/13 193/299/13 178/300/13 +f 192/301/16 190/302/16 191/303/16 +f 188/304/16 186/305/16 187/306/16 +f 184/307/13 189/308/13 185/309/13 +f 183/310/14 187/311/14 182/312/14 +f 185/309/15 188/304/15 183/310/15 +f 182/313/12 186/314/12 184/307/12 +f 180/315/14 191/316/14 181/317/14 +f 178/300/15 192/301/15 180/315/15 +f 181/318/12 190/319/12 179/298/12 +f 194/320/16 195/321/16 165/322/16 +f 194/320/17 198/323/17 196/324/17 +f 197/325/15 200/326/15 198/323/15 +f 195/321/18 201/327/18 165/322/18 +f 202/328/12 203/329/12 201/327/12 +f 206/330/16 207/331/16 205/332/16 +f 206/330/17 210/333/17 208/334/17 +f 209/335/15 212/336/15 210/333/15 +f 207/331/18 213/337/18 205/332/18 +f 214/338/12 215/339/12 213/337/12 +f 169/287/11 166/340/11 168/341/11 +f 185/309/11 182/342/11 184/343/11 +f 180/315/11 179/344/11 178/300/11 +f 163/293/11 162/345/11 161/278/11 +f 218/346/15 219/347/15 220/348/15 +f 220/348/19 226/349/19 228/350/19 +f 221/351/12 224/352/12 223/353/12 +f 223/353/20 227/354/20 225/355/20 +f 226/349/11 227/354/11 228/350/11 +f 230/356/15 231/357/15 232/358/15 +f 232/358/19 238/359/19 240/360/19 +f 233/361/12 236/362/12 235/363/12 +f 235/363/20 239/364/20 237/365/20 +f 238/359/11 239/364/11 240/360/11 +f 83/177/11 84/184/11 82/178/11 +f 88/180/12 104/209/12 103/181/12 +f 83/177/13 89/366/13 92/183/13 +f 82/178/14 91/367/14 90/185/14 +f 84/184/15 92/192/15 91/186/15 +f 81/179/12 90/368/12 89/187/12 +f 87/188/16 89/194/16 90/189/16 +f 85/190/16 90/189/16 91/186/16 +f 86/191/16 91/186/16 92/192/16 +f 88/193/16 92/192/16 89/194/16 +f 94/195/15 96/369/15 95/196/15 +f 97/198/12 100/370/12 99/199/12 +f 103/181/16 104/209/16 101/201/16 +f 95/196/16 97/198/16 98/200/16 +f 96/203/13 100/371/13 97/198/13 +f 93/197/14 98/200/14 99/204/14 +f 85/206/15 102/202/15 101/201/15 +f 87/208/14 101/201/14 104/209/14 +f 86/211/13 103/181/13 102/202/13 +f 106/213/15 108/372/15 107/214/15 +f 109/216/12 112/373/12 111/217/12 +f 107/214/16 109/216/16 110/218/16 +f 108/219/13 112/374/13 109/216/13 +f 105/215/14 110/218/14 111/220/14 +f 114/222/12 116/375/12 115/223/12 +f 117/225/15 120/376/15 119/226/15 +f 115/223/16 117/225/16 118/227/16 +f 116/228/14 120/377/14 117/225/14 +f 113/224/13 118/227/13 119/229/13 +f 122/231/12 124/378/12 123/232/12 +f 125/234/15 128/379/15 127/235/15 +f 123/232/16 125/234/16 126/236/16 +f 124/237/14 128/380/14 125/234/14 +f 121/233/13 126/236/13 127/238/13 +f 130/240/13 132/381/13 131/241/13 +f 133/243/14 136/382/14 135/244/14 +f 131/241/16 133/243/16 134/245/16 +f 132/246/12 136/383/12 133/243/12 +f 129/242/15 134/245/15 135/247/15 +f 138/249/13 140/384/13 139/250/13 +f 141/252/14 144/385/14 143/253/14 +f 139/250/16 141/252/16 142/254/16 +f 140/255/12 144/386/12 141/252/12 +f 137/251/15 142/254/15 143/256/15 +f 146/258/14 148/387/14 147/259/14 +f 149/261/13 152/388/13 151/262/13 +f 147/259/16 149/261/16 150/263/16 +f 148/264/15 152/389/15 149/261/15 +f 145/260/12 150/263/12 151/265/12 +f 154/267/14 156/390/14 155/268/14 +f 157/270/13 160/391/13 159/271/13 +f 155/268/16 157/270/16 158/272/16 +f 156/273/15 160/392/15 157/270/15 +f 153/269/12 158/272/12 159/274/12 +f 162/276/13 174/297/13 177/277/13 +f 176/279/16 177/277/16 174/280/16 +f 172/282/16 173/286/16 170/283/16 +f 168/285/13 170/292/13 173/286/13 +f 167/288/14 172/282/14 171/289/14 +f 169/287/15 173/286/15 172/282/15 +f 166/291/12 171/393/12 170/292/12 +f 163/293/14 176/279/14 175/294/14 +f 161/278/15 177/277/15 176/279/15 +f 164/296/12 175/394/12 174/297/12 +f 179/298/13 190/319/13 193/299/13 +f 192/301/16 193/299/16 190/302/16 +f 188/304/16 189/308/16 186/305/16 +f 184/307/13 186/314/13 189/308/13 +f 183/310/14 188/304/14 187/311/14 +f 185/309/15 189/308/15 188/304/15 +f 182/313/12 187/395/12 186/314/12 +f 180/315/14 192/301/14 191/316/14 +f 178/300/15 193/299/15 192/301/15 +f 181/318/12 191/396/12 190/319/12 +f 194/320/16 196/324/16 195/321/16 +f 194/320/17 197/325/17 198/323/17 +f 197/325/15 199/397/15 200/326/15 +f 195/321/18 202/328/18 201/327/18 +f 202/328/12 204/398/12 203/329/12 +f 206/330/16 208/334/16 207/331/16 +f 206/330/17 209/335/17 210/333/17 +f 209/335/15 211/399/15 212/336/15 +f 207/331/18 214/338/18 213/337/18 +f 214/338/12 216/400/12 215/339/12 +f 169/287/11 167/288/11 166/340/11 +f 185/309/11 183/310/11 182/342/11 +f 180/315/11 181/401/11 179/344/11 +f 163/293/11 164/402/11 162/345/11 +f 218/346/15 217/403/15 219/347/15 +f 220/348/19 219/347/19 226/349/19 +f 221/351/12 222/404/12 224/352/12 +f 223/353/20 224/352/20 227/354/20 +f 226/349/11 225/355/11 227/354/11 +f 230/356/15 229/405/15 231/357/15 +f 232/358/19 231/357/19 238/359/19 +f 233/361/12 234/406/12 236/362/12 +f 235/363/20 236/362/20 239/364/20 +f 238/359/11 237/365/11 239/364/11 diff --git a/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_socket.png b/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_socket.png new file mode 100644 index 000000000..9a0371157 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/storage/gui_battery_socket.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_base.png b/src/main/resources/assets/hbm/textures/models/machines/battery_base.png new file mode 100644 index 000000000..a0b8e6447 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_base.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_lead.png b/src/main/resources/assets/hbm/textures/models/machines/battery_lead.png new file mode 100644 index 000000000..2f3ab9483 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_lead.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_lithium.png b/src/main/resources/assets/hbm/textures/models/machines/battery_lithium.png new file mode 100644 index 000000000..1a93d3c72 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_lithium.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_quantum.png b/src/main/resources/assets/hbm/textures/models/machines/battery_quantum.png new file mode 100644 index 000000000..66e455f24 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_quantum.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_redstone.png b/src/main/resources/assets/hbm/textures/models/machines/battery_redstone.png new file mode 100644 index 000000000..e02f7a937 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_redstone.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_schrabidium.png b/src/main/resources/assets/hbm/textures/models/machines/battery_schrabidium.png new file mode 100644 index 000000000..da4a3637a Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_schrabidium.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_socket.png b/src/main/resources/assets/hbm/textures/models/machines/battery_socket.png new file mode 100644 index 000000000..58a9779a7 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_socket.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/battery_sodium.png b/src/main/resources/assets/hbm/textures/models/machines/battery_sodium.png new file mode 100644 index 000000000..75e7e5d31 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/battery_sodium.png differ